Hallo zusammen!
Die Ansichten meiner Fensters basieren auf einem XbpBrowse(). Falls mein Fenster editierbar ist, nehme ich den cursorMode XBPBRW_CURSOR_CELL und sonst XBPBRW_CURSOR_ROW. Nun ist es so, dass mein Kunde in den editierbaren Fenster (XBPBRW_CURSOR_CELL) jeweils doch die ganze Zeile grau hinterlegt haben möchte, wenn er in der Tabelle rumspringt. Man sieht somit noch den Curser, es ist jedoch die ganze Zeile grau hinterlegt (konfortabel für Fenster mit vielen Spalten). Nun bin ich wie folgt vorgegangen:
a) Immer wenn eine Zeile Markiert wird, soll die Methode aufgeführt werden:
::oBrowse:itemMarked := {| aRowCol, uNIL2, self | self:SetBroRowColor() }
b) die Methode loopt durch alle Felder und färbt die entsprechende Zeile ein
FOR i := 1 TO LEN( ::aField)
::getColumn(i):ColorBlock := {|| IF( &(::cAlias)->(RECNO()) == nRec, {GRA_CLR_BLACK, XBPSYSCLR_BUTTONLIGHT}, {NIL,NIL} ) }
NEXT
Das funktioniert auch soweit. Nur bin ich von der Performance nicht zu frieden. Es ist immer eine zeitliche Verzögerung zu erkennen, wenn ich im nun im XbpBrowse() navigiere. Gibt es da einen anderen/schnelleren Lösungsansatz für meine Problemstellung?
Liebe Grüsse
__WEY
komplette Zeile einfärben
Moderator: Moderatoren
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 105 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: komplette Zeile einfärben
Hallo, __WEY.
Es ist nicht sehr sinnvoll, den ColorBlock-Codeblock jedes Mal zu setzen. Das macht man einmalig: Alle Spalten haben diesen ColorBlock, und bei ItemMarked wird die Variable ("nRec") gesetzt, die die hervorzuhebende Zeile identifiziert. Die Einfärbung erreicht man dann dadurch, dass man die Spalten dazu bringt, ihren ColorBlock zu evaluieren. oBrowse:InvalidateRect() würde dann die Neuzeichnung des sichtbaren Browse-Bereiches initiieren, wodurch auch die ColorBlöcke betroffen wären.
Es ist nicht sehr sinnvoll, den ColorBlock-Codeblock jedes Mal zu setzen. Das macht man einmalig: Alle Spalten haben diesen ColorBlock, und bei ItemMarked wird die Variable ("nRec") gesetzt, die die hervorzuhebende Zeile identifiziert. Die Einfärbung erreicht man dann dadurch, dass man die Spalten dazu bringt, ihren ColorBlock zu evaluieren. oBrowse:InvalidateRect() würde dann die Neuzeichnung des sichtbaren Browse-Bereiches initiieren, wodurch auch die ColorBlöcke betroffen wären.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: komplette Zeile einfärben
das ganz ist "nur" ein "optisches" Problem und sollte ganz anders gelöst werden : customDrawCell__WEY hat geschrieben:Die Ansichten meiner Fensters basieren auf einem XbpBrowse(). Falls mein Fenster editierbar ist, nehme ich den cursorMode XBPBRW_CURSOR_CELL und sonst XBPBRW_CURSOR_ROW. Nun ist es so, dass mein Kunde in den editierbaren Fenster (XBPBRW_CURSOR_CELL) jeweils doch die ganze Zeile grau hinterlegt haben möchte, wenn er in der Tabelle rumspringt. Man sieht somit noch den Curser, es ist jedoch die ganze Zeile grau hinterlegt (konfortabel für Fenster mit vielen Spalten).
im Array aInfo[ XBP_DRAWINFO_STATE ] hast du ja den "Status", wenn XBP_DRAWSTATE_SELECTED dann "grau" als Hintergrund
gruss by OHR
Jimmy
Jimmy
Re: komplette Zeile einfärben
Herzlichen Dank für Eure Antworten. Die Lösung von AUGE_OHR scheint mir sehr plausibel und ich habe nun lägere Zeit damit rumgespielt. Es funktioniert bei mir auch nun eine einzelne Zelle einzufärben. (jedoch nicht diese auf der ich gerade stehe (nRec)- dann schmier er mir ab, wiso auch immer...)
IF aInfo[3] == XBP_DRAWSTATE_SELECTED
aInfo[5]:setCellColor(nRec+1,GRA_CLR_BLACK,XBPSYSCLR_BUTTONLIGHT, .T. )
ENDIF
Gruss __WEY
IF aInfo[3] == XBP_DRAWSTATE_SELECTED
aInfo[5]:setCellColor(nRec+1,GRA_CLR_BLACK,XBPSYSCLR_BUTTONLIGHT, .T. )
ENDIF
Nun müsste ich ja mühsam wieder jeder Spalte als XbpCellGroup (aInfo[5]) durchlaufen und mit setSellcolor die Farbe setzten.Wie kann ich einfach "grau" als Hintergrund für eine ganze Zeile definieren?AUGE_OHR hat geschrieben:ELECTED dann "grau" als Hintergrund
Gruss __WEY
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: komplette Zeile einfärben
das 5th Array Element ist "eigentlich" nicht vorgesehen ...__WEY hat geschrieben: aInfo[5]:setCellColor(nRec+1,GRA_CLR_BLACK,XBPSYSCLR_BUTTONLIGHT, .T. )
du hast mit XBP_DRAWINFO_AREA aber zumindest den Ansatz getroffen.
du setzt jetzt "manuell" und auch "einmalig" die Farbe der Cell, aber ich sprach von Slot o:customDrawCell der für das "eigene malen" der Cell´s gedacht ist.
hier mal als Beispiel ein Auszug aus meiner "5 Sterne" Column
http://www.xbaseforum.de/viewtopic.php?f=16&t=5481
Code: Alles auswählen
CLASS DXE_StarColumn FROM XbpColumn
EXPORTED:
VAR oStar
INLINE METHOD create( oParent, oOwner, aPos, aSize, aPP, lVisible )
::XbpColumn:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
::drawMode := XBP_DRAW_OWNER
::dataArea:customDrawCell := {| oPS, aInfo, oSelf | ShowStar(oPs,aInfo,oSelf) }
RETURN self
INLINE METHOD destroy
::oStar:= nil
RETURN ::XbpColumn:destroy()
ENDCLASS
Der CodeBlock bekommt nun die Parameter vom OS() "geliefert" welche Xbase++ für uns "aufbereitet" und das Array aInfo "füllt".
Code: Alles auswählen
...
xData:= oArea:GetCell( aInfo[ XBP_DRAWINFO_ITEM ] )
das 2nd Element XBP_DRAWINFO_ACTION sagt dir nun welche "Aktion" mit dem Element passieren soll.
hier wird meistens XBP_DRAWACTION_SELCHANGE auftreten wenn der "Focus" wechselt
beim 3td Element XBP_DRAWINFO_STATE wäre nun der "Zustand" XBP_DRAWSTATE_SELECTED welches das (gewählte) "aktuelle" Element anzeigt interessant.
bei "einfacher" Auswahl wären alle anderen Elemente XBP_DRAWSTATE_NORMAL ... wenn man mehrere "markieren" will muss man hier "tricksen"
im 4th Element XBP_DRAWINFO_RECT findest du nun die Koordinaten bei den der "Inhalt" der Cell der "gemalt" werden soll.
die Koordinaten an dieser Stellen sind "muss" und sollten "hier" nicht mehr verändert werden.
aber wie "male" ich das denn nun ... ?
Code: Alles auswählen
FUNCTION ShowStar(oPs,aInfo,oArea)
mit den GRA* Befehlen wird nun genau so "gemalt" als wenn man es "drucken" will ...
nur ohne den Drucker spezifischen Kram ... eben auf den Bildschirm als Device Content.
gruss by OHR
Jimmy
Jimmy