komplette Zeile einfärben

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
__WEY
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 25
Registriert: Do, 11. Sep 2008 9:01

komplette Zeile einfärben

Beitrag von __WEY »

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
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

__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).
das ganz ist "nur" ein "optisches" Problem und sollte ganz anders gelöst werden : customDrawCell

im Array aInfo[ XBP_DRAWINFO_STATE ] hast du ja den "Status", wenn XBP_DRAWSTATE_SELECTED dann "grau" als Hintergrund ;)
gruss by OHR
Jimmy
__WEY
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 25
Registriert: Do, 11. Sep 2008 9:01

Re: komplette Zeile einfärben

Beitrag von __WEY »

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
AUGE_OHR hat geschrieben:ELECTED dann "grau" als Hintergrund
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?

Gruss __WEY
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

__WEY hat geschrieben: aInfo[5]:setCellColor(nRec+1,GRA_CLR_BLACK,XBPSYSCLR_BUTTONLIGHT, .T. )
das 5th Array Element ist "eigentlich" nicht vorgesehen ...
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
wie du richtig erkannt hast ist die o:dataArea der Ort wo man bei einer Column ansetzt ... mit dem o:customDrawCell() Slot.

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 1st Element ist der "Inhalt" der Cell welches man mit o:GetCell() von der o:dataArea bekommt.

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)
oPS kennt man doch irgend woher ... ja vom "drucken" :idea:

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
Antworten