Seite 1 von 1

Browserzellen ermitteln

Verfasst: Sa, 15. Feb 2020 12:52
von Manfred
ich habe einen Arraybrowser, dessen Daten ich über eine Schleife prüfen möchte.

Code: Alles auswählen

FOR nI := 1 TO Len(::aBrowseUnterricht)                               // es wird generell immer alles druchlaufen, da es nicht so viele Sätze sein werden
              IF ! Empty(::aBrowseUnterricht[nI]:datum)
                 IF TimeToSec(::aBrowseUnterricht[nI]:zeitbis) - TimeToSec(::aBrowseUnterricht[nI]:zeitvon) > 0 // die Zeit muß logisch sein.
                    IF ! Empty(::aBrowseUnterricht[nI]:idlehrer)
                    ENDIF
                 ENDIF
              ENDIF
          NEXT
ich möchte an jeder Abfragestelle, die nicht dem Wunsch entspricht nun die entsprechende Zelle einfärben. Ich komme aber nicht drauf, wie ich jetzt im Browseobjekt die Hintergrundfarbe setzen kann/muß. Ist sicherlich einfach, aber es fällt mir nicht ein. Ich weiß zwar durch nI welche Zeile ich in dem Browseobjekt habe, aber wie komme ich an die Zelle ran?

Re: Browserzellen ermitteln

Verfasst: Sa, 15. Feb 2020 13:11
von Tom
Das musst Du im ColorBlock der Column/Cellgroup abfangen. Eine Zelle ist ein Bestandteil der Cellgroup (die letztlich ein Static ist), aber die Zelle selbst ist kein Objekt.

Re: Browserzellen ermitteln

Verfasst: Sa, 15. Feb 2020 13:15
von Manfred
ja, das weiß ich irgendwie, aber wie sieht der Code dafür aus? Ich habe im Moment keinen Schimmer, wie ich das Objekt as solches abfragen muß. Sicherlich irgendwas mit ::oBrowseunterricht[nI]:getcell() oder so. Mir fehlt der letzte entscheidende Hinweis dazu.

Re: Browserzellen ermitteln

Verfasst: Sa, 15. Feb 2020 13:54
von Tom
Den Inhalt einer Zelle bekommst Du im COLOR-Codeblock von DCBROWSECOL als Parameter:

Code: Alles auswählen

DCBROWSECOL ... COLOR {|x|IF(x="Juhu",aColor[1],aColor[2])}

Re: Browserzellen ermitteln

Verfasst: Sa, 15. Feb 2020 13:59
von Manfred
hm, das wollte ich eigentlich vermeiden.

Re: Browserzellen ermitteln

Verfasst: Sa, 15. Feb 2020 17:55
von Tom
Du willst direkt eine Zelle einfärben? Kann ich Dir morgen den Code für geben.

Re: Browserzellen ermitteln

Verfasst: Sa, 15. Feb 2020 18:05
von Jan
Manfred,

Du postest das nicht im Fachbereich zu eXpress++. Machst Du das also mit einem XbüBrowse?

Wenn ja, kannst Du über oSpalte:colorblock die Farbe setzen. Da gibt es vier Parameter: Vordergrundfarbe, Hintergrundfarbe, Vordergrundfarbe des Cursors, Hintergrundfarbe des Cursors. Ich markiere da mit recht häufig Zellen, die bestimmte Bedingungen erfüllen.

Wobei ich jetzt einfach mal hoffe, bei Dir nicht wieder am Thema vorbei zu antworten...

Jan

Re: Browserzellen ermitteln

Verfasst: Sa, 15. Feb 2020 19:00
von Tom
Man kann auch die Zelle direkt einfärben. Hat nix mit eXpress++ zu tun.

Re: Browserzellen ermitteln

Verfasst: So, 16. Feb 2020 18:39
von Manfred
ich mache das mit express++ ,aber ich denke mal, an der Stelle kann/muß/sollte man ruhig in purem Xbase++ angreifen. Ein bisschen möchte ich ja auch noch dazulernen :wink:
Aber das ist ja meine Frage, wie ermittel ich an der Stelle über das Browserobjekt die Spalte und/oder die Zelle? Die Zeile habe ich ja

Re: Browserzellen ermitteln

Verfasst: So, 16. Feb 2020 19:11
von Martin Altmann
Moin,
schon mal :colPos angeschaut?

Viele Grüße,
Martin

Re: Browserzellen ermitteln

Verfasst: Di, 18. Feb 2020 14:36
von Tom
Also, Manfred.

Du hast ein zweidimensionales Array, dessen Inhalt gebraust wird - ein Array aus DataObjects. Wenn die Differenz des Inhalts zweier iVars (zeitbis,zeitvon) größer Null ist, sollen die Zellen, die aber eigentlich eine andere Information aus dem jeweiligen DataObject anzeigen, hervorgehoben werden. Verstehe ich das richtig? Vermutlich soll der Benutzer die Option wählen können (siehe unten).

Dein Freund wäre "setCellColor", eine Methode der XbpCellGroup-Klasse. Aus (bis zu drei) Objekten dieser Klasse bestehen XbpColumns. Es gibt eines für die Spaltenüberschriften (oColumn:Heading), eines für den Datenbereich (oColumn:DataArea) und ggf. eines für die Fußzeile (oColumn:Footing). Mit oColumn:DataArea:SetCellColor(<nRowPos>,<nColorFG>,<nColorBG>,.T.) kannst Du die Farbe der Zelle in der Zeile nRowPos der Spalte oColumn setzen, und das .T. am Ende bewirkt, dass die Farbe sofort angezeigt wird (bis ein Repaint des Browses erfolgt und ggf. die ColorBlöcke andere Ergebnisse liefern!). Aber, Achtung: nRowPos ist die Ordinalposition der Zelle! Wenn das Brause gerade mit Zeile 15 beginnt, weil Zeilen 1 bis 14 nicht zu sehen ist, hebt man mit 3 als nRowPos den Inhalt der Arrayzeile 18 hervor! Du müsstest vorher herausbekommen, welches die TopRow ist (das findest Du in den Beispielen).

Nicht nur deshalb - vor allem aber wegen der Gefahr, die Einfärbung gleich wieder zu verlieren, wenn ein Refresh erfolgt - würde ich das anders machen. Deine Abfrage ist ein Klassiker für den ColorBlock {|o|IF(o:zeitbis < o:zeitvon,aFARBE1,aFARBE2)]}, und wenn Du das von einer Benutzerinteraktion abhängig machen willst (Checkbox "Hebe alle Zellen hervor, bei denen Zeitintervalle vorliegen"), dann nimmst Du noch ein .AND. in die Abfrage {|o|IF(lHebeZeitenHervor .AND. o:zeitbis < o:zeitvon,aFARBE1,aFARBE2)]}. In solchen Fällen reicht ein simples oBrowse:RefreshAll(), um sämtliche ColorBlöcke feuern zu lassen. Noch eleganter wäre die Abfrage im UI-Thread (Ownerdrawing), da würde dann ein oBrowse:InvalidateRect() ausreichen. Der Codeblock kann in jeder Column recyclet werden.

Re: Browserzellen ermitteln

Verfasst: Di, 18. Feb 2020 15:00
von Manfred
ok, ich merke das führt irgendwie in die Dunkelheit.
nochmal von vorne:
ich steh hier und ermittel erstmal die Zeile, in der der Cursor im browser steht.

Code: Alles auswählen

nZeile := DC_GetColArray(0,::oBrowse)
dann durchlaufe ich das DataObject der Zeile

Code: Alles auswählen

FOR nI := 1 TO Len(::aBrowseUnterricht)
jetzt möchte ich gerne an das passende Objekt rankommen. und das müßte so gehen

Code: Alles auswählen

::oBrowseUnterricht:getcolumn(nI)
das liefert mir ein Xbpcolumn zurück
hiermit

Code: Alles auswählen

::oBrowseUnterricht:getcolumn(nI):dataarea
bekomme ich ein XbpCellGroup zurück.
Reicht das, oder muß ich noch tiefer bohren? Kann ich damit schon etwas anfangen? Oder bin ich schon zu tief hier? Irgendwann müßte ich doch da landen, wo ich die Farbe der Zelle ändern kann.
Oder liege ich schon total falsch?

Re: Browserzellen ermitteln

Verfasst: Di, 18. Feb 2020 15:29
von Tom
Jetzt müsstest Du nur noch wissen, mit welcher Zelle das Browse aktuell beginnt (um aus Deinem Rückgabewert von DC_GetColArray(0,oBrowse) die Ordinalposition zu errechnen), dann könntest Du SetCellColor abfeuern, was ohnehin nur für sichtbare Zellen geht:

Code: Alles auswählen

::oBrowseUnterricht:getcolumn(nI):dataarea:SetCellColor(nZeile-nTopOffset,GRA_CLR_BLUE,GRA_CLR_RED,.T.)
Wenn es keine anderen Farbangaben gibt, müsste das reichen. Wenn es Color-Codeblöcke gibt, ist das mit dem nächsten Refresh wieder dahin.

Re: Browserzellen ermitteln

Verfasst: Mi, 19. Feb 2020 7:39
von Koverhage
Das Zebra Beispiel hilft Dir nicht ?

Re: Browserzellen ermitteln

Verfasst: Mi, 19. Feb 2020 8:21
von Manfred
ich erinnere mich ganz entfernt. Aber war das nicht zeilenorientiert?

Re: Browserzellen ermitteln

Verfasst: Mi, 19. Feb 2020 8:34
von Tom
Das arbeitet auch mit den ColorBlöcken. Es ist möglicherweise nicht sinnvoll, mit SetCellColor und ähnlichem die (überhaupt nicht existenten) Zellen direkt zu manipulieren, da das einen nur sehr vorübergehenden Effekt hat, sowieso nur die sichtbaren Zellen betrifft und etwas schwergängig ist. Es ist in fast allen Fällen sehr viel sinnvoller, die bereits etablierten ColorBlöcke dafür zu nutzen - wie in meinem Beispiel gezeigt. Es sei denn, es geht darum, nur in der aktiven Zeile zu highlighten.

Re: Browserzellen ermitteln

Verfasst: Mi, 19. Feb 2020 9:35
von AUGE_OHR
hi,

Ich bin ja kein Express User also frage ich mal als Newbie :
muss man bei Express++ nicht auch den "visual Style" für o:DataArea "abschalten" damit man Farbe bekommt ( ausser Hilite-Bar ) :?:

Re: Browserzellen ermitteln

Verfasst: Mi, 19. Feb 2020 9:47
von Tom
Das hat mit eXpress++ nichts zu tun - sind ja auch XbpBrowses, Jimmy. Also funktioniert es bei vorhandenen Manifesten und aktiven visuellen Stilen nur mit den Vordergrundfarben, außer, man arbeitet (zusätzlich) mit Ownerdrawing oder mit lokal abgeschalteter Verwendung der visuellen Stile.

Re: Browserzellen ermitteln

Verfasst: Mi, 19. Feb 2020 23:28
von AUGE_OHR
hi,

die Frage war für Manfred gedacht da er nicht an die Farben kommt ...

Re: Browserzellen ermitteln

Verfasst: Do, 20. Feb 2020 7:12
von Tom
Die Frage war, wie er an die Zellen kommt. Farben als Problem wurden hier bislang nicht diskutiert.