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?
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.
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.
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...
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
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
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.
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.
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?
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:
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.
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 )
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.