PP im Browse-Header erhalten

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

PP im Browse-Header erhalten

Beitrag von Jan »

Ich habe in einem XbpBrowse neben einigen anderen Einstellungen für einige Spalten diesen PP eingebaut: {XBP_PP_COL_HA_ALIGNMENT, XBPALIGN_RIGHT}. Das Problem ist, das ich die Caption teilweise zur Laufzeit ändere. Damit das sauber repainted wird mache ich dann ein oBrowse:getColumn(i):Heading:configure(). Ansonsten werden alte und neue Caption übereinander gezeichnet.

Dummerweise scheint das aber alle möglichen PP wieder zurück zu setzen.

Dazu stelle ich mir zwei Fragen: Warum macht :configure() sowas? Und welche Möglichkeit gäbe es alternativ, den Header zu repainten?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: PP im Browse-Header erhalten

Beitrag von DelUser01 »

Hallo Jan

das mit dem XBP_PP_... mache ich ähnlich, ich verwende aber :Heading:SetCell(...) und nicht :Configure(). Hat Jimmy Mal irgendwo geschrieben. Habe keine Probleme damit.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

Hallo ROland,

ich mache auch ein :setCell(). Aber ohne :configure() werden dann sowohl der alte als auch der neue Schriftzug übereinander angezeigt. Aber nur bei den Spalten-Headern, die ich rechtsbündig eingestellt habe. Das ist das Problem.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: PP im Browse-Header erhalten

Beitrag von DelUser01 »

Du meinst also, dass es bei _LEFT und _HCENTER funktioniert?
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

... zumindest bei _LEFT. Denn den setze ich explizit überall da, wo kein _RIGHT gefordert ist. Und das klappt anstandslos. Aber ist ja auch Standardeinstellung.

Nachtrag: Auch _HCENTER klappt nicht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: PP im Browse-Header erhalten

Beitrag von DelUser01 »

Wenn es geht probiere es auch mit _HCENTER - ob es da auch geht. Dann muss ja mit _RIGHT etwas faul sein. Beim Header mache ich meist nur noch _HCENTER.
DelUser01

Re: PP im Browse-Header erhalten

Beitrag von DelUser01 »

Um in der Sache weiter zu kommen versuche herauszufinden, ob es möglich ist den Header-Text zuerst zu löschen (mit 1x Space + ev. mit _LEFT) und dann wieder mit Text _RIGHT zu überschreiben. Wäre zwar ein Umweg würde aber vielleicht erst einmal helfen.
?
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

Hallo Roland,

keine Änderung. Mach ich kein :configure, werden alte und neue Capton gezeigt. Wird :configure() gemacht, werden alle PP auf Standard-Werte zurückgesetzt. Warum macht :configure() das überhaupt? Das sollte doch nur neue Werte üebrnehmen, aber dabei nicht alte wegschmeißen, wenn es keine neuen gibt. Oder versteh ich da was falsch?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: PP im Browse-Header erhalten

Beitrag von DelUser01 »

OK - da muss ich passen, das "Design" jedes Feldes schreibe ich immer explizit in das Objekt. Da verlasse ich mich nicht auf die Defaults...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von brandelh »

Wird der alte Inhalt neu geschrieben oder nur nicht gelöscht ?
Wenn ja, könntest du mit einem grabox eine wei0e box malen und somit löschen ... oder die Zelle mit inalidaterect() zum Repaint zwingen (Funktionsnamen frei aus dem Gedächtnis ...)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: PP im Browse-Header erhalten

Beitrag von AUGE_OHR »

Jan hat geschrieben:oBrowse:getColumn(i):Heading:configure().
damit bis du also in der XbpColumn Class und da steht

Code: Alles auswählen

 METHOD XbpColumn:Configure ( oParent, oOwner, aPos, aSize, aPresParam, lVisible )

    // Reconfiguration will destroy and recreate ourself
    ::Destroy ()
    ::Create ( oParent, oOwner, aPos, aSize, aPresParam, lVisible )

 RETURN self
du müsstest also alle Parameter "neu" übergeben.
Jan hat geschrieben:Und welche Möglichkeit gäbe es alternativ, den Header zu repainten?
ich "Wechsel" Presentation Parameter so

Code: Alles auswählen

   aPresParam := ::oKal:setPresParam()
   ...
   nPos := AScan ( aPresParam, { | a | a[1] == XBP_PP_FGCLR } )
   IF nPos > 0
      aPresParam[nPos, 2] := GRA_CLR_RED
   ENDIF
   ...
   ::oKal:setPresParam( aPresParam )
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

Hallo Jimmy,

leider klappt das nicht. Der Header wird falsch dargestellt, und auch die Zeilen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Tom »

Hallo, Jan.

Visuelle Stile aktiv? Möglicherweise sogar frozen columns?

Meine Vorgehensweise für das Repaint:

1. LockPs() auf dem Browse.
2. SetLeftFrozen({}), vorher das Array für die eingefrorenen Spalten speichern.
3. Alle Spalten (!) abermals konfigurieren.
4. SetLeftFrozen({}) auf das gespeicherte Array.
5. UnlockPs().
6. InvalidateRect().

Es kann aber auch hieran liegen:

http://www.alaska-software.com/scripts/ ... PDRID=6309
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

Hallo Tom,

der PDR kann das eigentlich nicht sein, denn ich habe die Probleme sowohl in 1.9 SL1 und in 2.0. Der PDR soll aber schon lange geschlossen sein.

Ich habe gerade mal weiter getestet. Und bin noch viel mehr irritiert.

Die ursprüngliche Problemstellung war ja, das ich die Caption des Headers austauschen möchte.

Im ersten Ansatz habe ich das per oBrowse:getColumn(i):Heading:setCell(1, cHeader) gemacht. Das klappt, brauchte aber vorher ein oBrowse:getColumn(i):Heading:configure(). Und hinterher muß ich auch noch die Farbe neu setzen, weil :configure() auch die weghaut. Sonst bleibt die alte Caption stehen, und die neue wird einfach drübergemalt. Abweichend von meiner Ausage oben passiert das grundsätzlich. Mir viel das nur nicht bei den leftaligns auf, weil die immer gleich sind. Beim genauen hinsehen sieht man aber, das die hinterher fett aussehen. Also wird die neue Caption um ein oder zwei Pixel versetzt drüber gemalt.

Nach Jimmys Ansatz habe ich das dann auch versucht, das klingt schließlich sehr logisch. Und letztendlich auch einfacher als mein Ansatz. Hier wurde das Problem noch größer, denn jetzt wurde nicht nur der Header falsch angezeigt, sondern auch der Datenbereich - Grid weg, Farben falsch.

Also habe ich mal folgendes gemacht:

Code: Alles auswählen

aPresentationParameter := oBrowse:getColumn(i):setPresParam()
oBrowse:getColumn(i):setPresParam(aPresentationParameter)
Und siehe da - der gleiche Fehler. Warum wird die Optik zerstört, obwohl ich doch überhaupt nichts geändert habe???

Der Browse ist übrigens so eingestellt:

Code: Alles auswählen

oBrowse:useVisualStyle := .F.
oBrowse:hScrollObject:useVisualStyle := .T.
oBrowse:vScrollobject:useVisualStyle := .T.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Tom »

Ein XbpBrowse scheint seine Präsentationsparameter beim Erzeugen (auch auf Spaltenebene) zu verändern. Deshalb hole ich mir beim Ändern z.B. der Konfiguration (Zeilenhöhe) die bisherigen (und eben nicht etwa das Array, das ich beim Erzeugen gesetzt habe) und setze sie abermals:

Code: Alles auswählen

METHOD oMyBrowse:_SetPresParam(nHeight)
LOCAL aTempPP := ::SetPresParam(), nFound
* neue Höhe setzen:
nFound := aScan(aTempPP,{|a,n|n := a[1],n == XBP_PP_COL_DA_ROWHEIGHT})
IF nFound < 1
  aAdd(aTempPP,{XBP_PP_COL_DA_ROWHEIGHT,nHeight})
  ELSE
  aTempPP[nFound,2] := nHeight
ENDIF
* und noch einmal dasselbe für CellHeight
::SetPresParam(aTempPP)
RETURN nil
(ins Blaue getippt, sieht bei mir etwas anders aus).

Aber. Wenn ich die Spaltenheader ändere, was ja dadurch geschieht, dass der Rückgabewert oder Inhalt der Datalinks für die Header geändert wird, lasse ich einfach ein Eval() über alle Header-Datalinks laufen und löse anschließend ein InvalidateRect() aus. Configure oder sonstwelche Spielereien sind an dieser Stelle eigentlich unnötig.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

Hallo Tom,

im Prinzip ist Deine Vorgehensweise die von Jimmy vorgeschlagene. Und das funktioniert eben halt leider aus irgendeinem Grund nicht. Ich hatte ja das Beispiel gepostet - PP auslesen und ohne jede Änderung sofort wieder setzen ändert nahezu alles, was man ändern kann. Irritierend.

Ich werd aber mal Deinen anderen Vorschlag testen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Tom »

Hallo, Jan.

Ich würde vermuten, dass Du die PP (möglicherweise für die Spalten?) seit/nach dem Erzeugen geändert hast, so dass es zum falschen "Übermalen" kommt.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

Hallo Tom,

gute Idee. Passt aber leider auch nicht. Ich habe die PP direkt bei der Erzeugung der Spalte in den oSpalte:cargo geschrieben. Und dann bei der Header-Änderung dort wieder rausgeholt. Keine Änderung.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Tom »

Vergleiche doch diese gespeicherten PP mal mit den tatsächlichen. Du wirst Unterschiede feststellen. :wink:
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

Hallo Tom,

Du hast Recht! Ich hab mir mal die PP nach der Erzeugung der Spalten weggeschrieben, und dann nochmal beim Ändern der Spalten-Header. Und siehe da - die sind komplett anders. Und auch wesentlich mehr, ca. 3x so viele.

Das ist also das nächste Rätsel. Denn es gibt keine andere Stelle, wo ich die ändere. Ich muß jetzt mal die ganzen Einstellungen aufbröseln, was das jeweils ist, immerhin stehen da ja nicht mehr die Konstanten drin, sondern nur die Ziffernwerte. Und schauen, woher die kommen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Tom »

Hallo, Jan.

Das ist kein Rätsel. Wenn man die XbpBrowse-Quellcodes hat, kann man das nachvollziehen. Erstens erben alle Spalten die Präsentationsparameter des Browses, wodurch sich die Parameter der Spalten ggf. mengenmäßig erhöhen. Zweitens passiert dann noch einiges unter der Haube (_SetPresParam). Das ist nicht falsch. Es ist nur falsch, bei einem abermaligen Configure die alten PP wieder zu setzen, weil dadurch das verloren geht, was bis dahin intern ergänzt wurde. Siehe Beispiel von mir.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

Tom,

leider ist das wiederum nicht ganz richtig. Denn wenn ich in dem betreffenen Header-Änderungs-Modul einfach nur die bestehenden PP üer :setPresParam() auslese und sofort ohne jede Änderung wieder setze, ist alles genau so verhauen als würde ich die gesetzen PP übergeben und dann nutzen.

Oder übersehe ich da schon wieder irgendwas?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Tom »

Ich würde das an Deiner Stelle mit einem kleinen Beispiel ausprobieren. Nach meinem Dafürhalten ergänzt SetPresParam die bestehenden Parameter. Es ist nicht so gedacht, wie Du es anwenden willst.

Falls Dir das hilft: Ich habe festgestellt, dass beim Rekonfigurieren einige Parameter verlorengehen, weshalb ich in solchen Situationen nur die PP der Spalten neu bestücke, falls sich die Farbdarstellungen geändert haben: oBrowse:GetColumn(<nCol>):Configure(,,,,aColPresParams). Außerdem setze ich für alle Spalten vor dem Neuzeichnen DrawMode und UseVisualStyle auf die vorigen Werte, getrennt für Heading, DataArea und Footing. Also oBrowse:GetColumn(<nCol>):Heading:DrawMode := <xDrawMode> usw. Dies gilt vor allem im Kontext von Spaltenlöschungen und dem Einfügen von Spalten (die zuvor erzeugt, in einem Objekt gespeichert und via DelColumn gelöscht worden sind).

Abermals: Ich halte es für falsch, für das Neuzeichnen der Überschriften (bzw. im Rahmen dessen) Configure zu verwenden. Das ist nicht der Zweck dieser Methode. Sie ist dafür gedacht, die Darstellung und/oder Anordnung von Browserspalten zur Laufzeit ändern zu können, und sie ist mit sehr großer Vorsicht zu genießen.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: PP im Browse-Header erhalten

Beitrag von Jan »

Tom,

noch einmal ganz kurz zusammengefasst, was ich mache:

Code: Alles auswählen

aPresentationParameter := oBrowse:getColumn(i):setPresParam()
oBrowse:getColumn(i):setPresParam(aPresentationParameter)
Kein :configure oder sonstwas. Nur diese beiden Zeilen. Und die beiden Zeilen zerhauen mir die gesamte Optik. Und ich habe keine Ahnung warum.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: PP im Browse-Header erhalten

Beitrag von AUGE_OHR »

hi,

@Jan : schon mal mit der v1.9x verglichen ob sich das genau so verhält ?

mir fällt ein Unterschied auf : ich setzte die Presentation Parameter auf das Browse und nicht auf die Column.
gruss by OHR
Jimmy
Antworten