Resizing eines XbpColumn():Footing

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Resizing eines XbpColumn():Footing

Beitrag von georg »

Hallo,


mal wieder so ein esoterisches Problem:

Code: Alles auswählen

+---------------+---------------+
| Header 1      | Header 2      |
+---------------+---------------+
| Daten 1       | Daten 2       |
+---------------+---------------+
| XbpSLE()      | XbpSLE()      |
+---------------+---------------+
Die XbpSLE() (oder genauer, SLEPic()) brauche ich, um Filter für die jeweilige Spalte eingeben zu können.

Der Code zum Erstellen der Elemente sieht wie folgt aus:

Code: Alles auswählen

      oCol := AddBroCol(oBro, oFile, aPresParam, nWide, nI, oFile:aHeaders[nI])
      oCol:footing:resize := {|aOld, aNew, self| ResizeInFooter(aOld, aNew, oXbp)}
      aSize := oCol:currentSize()
      oXbp := XbpSLE():new(oCol:footing, oCol:footing, {1, 1}, {aSize[1] - 2, 20})
      oXbp:tabStop      := .T.
      oXbp:dataLinkName := oFile:aFields[nI]
      oXbp:keyBoard     := {|nKey, uNIL1, self| BrowseFilter(nKey, oFile, oBro, aEntries)}
==>      oXbp:clipParent   := .T.   <==
      oXbp:create()
Soweit, so gut. Während der Browse das erste Mal angezeigt wird, wird für die zweite (!) bis letzte Spalte einmal ResizeInFooter() ausgeführt, und das mit recht absurden Werten:

aOld = {19, 21}
aNew = {200, 21}

Wobei {200, 21} die Grösse ist, mit welcher der Footer angezeigt werden soll. Das führt bei einigen Elementen dazu, dass aufgrund der Berechnung der neuen Anzeigegrösse das XbpSLE() zu schmal dargestellt wird.

Frage 1: Gibt es einen Grund für dieses etwas seltsame Verhalten, bzw. wie kann ich diesen Status erkennen und abfangen?

Ein Versuch, den :resize-Slot des XbpSLE zu beschicken, schlug fehl, denn die eingetragene Funktion wird nicht ausgeführt.

Die Funktion sieht so aus:

Code: Alles auswählen

STATIC FUNCTION ResizeInFooter(aOld, aNew, oXbp)
   Local aSize
   Local nXDiff, nYDiff
   Local oChild

   nXDiff := aOld[1] - aNew[1]
   nYDiff := aOld[2] - aNew[2]

   oChild := oXbp:childList()[1]
   aSize := oChild:currentSize()
   aSize[1] += nXDiff
   aSize[2] += nYDiff
   oChild:setSize(aSize)
   oChild:show()

RETURN (.T.)
Nach der Ausführung überlagert der :Footing Bereich das XbpSLE(), d.h. graue Box. Ich kann aber das unsichtbare (!) XbpSLE anspringen, Werte eingeben, und den Filter durch Drücken von Enter aktivieren.

Ich vermute, dass das Ganze daran liegt, dass die Grössenänderung des Footing-Bereichs stattfindet, nachdem ich das XbpSLE in der Grösse geändert habe, und es deshalb überlagert.

Frage 2: Wie kann ich diese Überlagerung verhindern?

So, das konnte ich inzwischen lösen, indem ich für das XbpSLE:clipParent auf TRUE gesetzt habe (ich habe es oben nachgepflegt). Bleibt aber immer noch die erste Frage (hier habe ich nun einen Workaround, würde aber trotzdem gerne wissen, wie man das Problem generisch umgehen kann).
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen 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: Resizing eines XbpColumn():Footing

Beitrag von AUGE_OHR »

hi,

es ist Zeit für Ownerdraw ;)
ich "denke" wenn du oFooter:useVisualStyle := .F. nehmen würdest dann wäre der optische Effekt nicht vorhanden.

wenn man den o:customDrawCell Callback Slot verwendet bekommt man ein Array aInfo.
das 4th Element "oArea" gibt einem den
Betroffener Zellbereich (Kopfzeile, Datenbereich, Fusszeile der Spalte)
erst mit Ownerdraw wirst du die gewünschte Kontrolle über deinen Footer bekommen.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Resizing eines XbpColumn():Footing

Beitrag von georg »

Hallo, Jimmy -


ich bezweifle das OwnerDrawing hier die Lösung darstellt. Das Problem, für das ich eine Lösung suche, ist, dass für die Spalten 2 bis n (n = Anzahl der Spalten) beim ersten Anzeigen des Browse ein resize Event generiert wird. Warum?

Und weil wir bei esoterischen Fragen sind: warum nicht auch für Spalte 1?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen 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: Resizing eines XbpColumn():Footing

Beitrag von AUGE_OHR »

georg hat geschrieben:ich bezweifle das OwnerDrawing hier die Lösung darstellt.
du hast ja dann die Kontrolle wann/was gezeichnet wird oder auch nicht.
georg hat geschrieben:Das Problem, für das ich eine Lösung suche, ist, dass für die Spalten 2 bis n (n = Anzahl der Spalten) beim ersten Anzeigen des Browse ein resize Event generiert wird. Warum?
hm ... warum wird von rechtes nach links aufgebaut ?
man müsste mal in den Source von XbpBrowse sehen ...

eine mögliche Erklärung wäre OOP.
1st. Col -> wide -> "passt"
2nd. Col -> += wide -> "passt"
3rd. Col -> += wide -> angenommen > o:drawingArea:Childlist()[4] -> PostAppEvent(xbeP_Resize)
damit ich jetzt den horizontalen Scrollbar bekomme !

Anzeige dann beginnend mit 3rd. Col -> 2nd. Col
georg hat geschrieben:Und weil wir bei esoterischen Fragen sind: warum nicht auch für Spalte 1?
weil das der ursprüngliche Parent wäre.
gruss by OHR
Jimmy
Antworten