XbpListBox einzelne Items einfärben
Moderator: Moderatoren
XbpListBox einzelne Items einfärben
Hallo zusammen
Gibt es eine Möglichkeit einzelne Items einer Listbox einzufärben? Leider gibt es für die methode additem keinen Parameter dafür...
Liebe Grüsse WEY
Gibt es eine Möglichkeit einzelne Items einer Listbox einzufärben? Leider gibt es für die methode additem keinen Parameter dafür...
Liebe Grüsse WEY
- brandelh
- Foren-Moderator
- Beiträge: 15709
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 72 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: XbpListBox einzelne Items einfärben
Das geht über Owner-Drawing, suche mal in der Hilfe nach dem Begriff "Owner-Drawing",
ich habe es noch nicht gemacht, aber TOMs Beispiele für den Browser haben auch Farben ausgetauscht - neben anderen Dingen.
ich habe es noch nicht gemacht, aber TOMs Beispiele für den Browser haben auch Farben ausgetauscht - neben anderen Dingen.
Gruß
Hubert
Hubert
- 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: XbpListBox einzelne Items einfärben
Ja, gibt es, mit Ownerdrawing. Einfach den DrawItem-Slot von XbpListbox mit einer Funktion belegen, die als Parameter den Presentation Space des zu zeichnenden Elements und ein Info-Array u.a. mit dem Zeichenbereich bekommt. XbpListBox:DrawMode muss auf XBP_DRAW_OWNER gesetzt werden. In der Funktion holst Du Dir das zu zeichnende Element mit ::GetItem(aInfo[XBP_DRAWINFO_ITEM]) und ermittelst dort dann die passende Farbe. Die setzt Du für den PS. Und dann "zeichnest" Du den Inhalt mit GraCaptionStr(). Lässt sich auch um Grafiken und Icons usw. ergänzen. Das kann dann im Ergebnis z.B. so aussehen (ist eine ComboBox, spielt aber keine Rolle):
- Dateianhänge
-
- combobox.jpg (17.73 KiB) 5942 mal betrachtet
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: XbpListBox einzelne Items einfärben
die "XbpImageListBox" ist wohl mal auf einer Devcon verteilt worden.__WEY hat geschrieben:Gibt es eine Möglichkeit einzelne Items einer Listbox einzufärben? Leider gibt es für die methode additem keinen Parameter dafür...
es wäre gut wenn Alaska solche Demos mal "frei" geben würde ...
gruss by OHR
Jimmy
Jimmy
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: XbpListBox einzelne Items einfärben
Alaska veröffentlicht in Kürze das XBPack 3, in dem auch irgendwas mit Listview drin ist.
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15709
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 72 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: XbpListBox einzelne Items einfärben
Hi,
ListView ist nicht gleich ListBox.
War die ListBox nicht in einem der vorhandenen Packs erweitert worden ?
ich finde hier nur das erste:
Das zweite scheine ich mir noch nicht geladen zu haben und aktuell ist die Site noch nicht in Betrieb.
Weiß jemand was in der Zweiten war ?
Auf jeden Fall kann man aber - siehe Toms Bespiel - per Ownerdrawing die Farben setzen.
ListView ist nicht gleich ListBox.
War die ListBox nicht in einem der vorhandenen Packs erweitert worden ?
ich finde hier nur das erste:
Code: Alles auswählen
This is the README for Xbase Part Pack #1
*
* Release: 1.90.355
* Date: August 15th 2009
1. XbpImageButton and
2. XbpImageTabPage
Weiß jemand was in der Zweiten war ?
Auf jeden Fall kann man aber - siehe Toms Bespiel - per Ownerdrawing die Farben setzen.
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16561
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 116 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: XbpListBox einzelne Items einfärben
Moin Hubert,
da waren die beiden Klassen XbpProgressBar und XbpFormattedLabel drin.
Viele Grüße,
Martin
da waren die beiden Klassen XbpProgressBar und XbpFormattedLabel drin.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- 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: XbpListBox einzelne Items einfärben
YUP ... aber wenn die ListBox :multiColumn := .T. "richtig" machen würde wäre es dem ListView im Report Modus sehr ähnlich.brandelh hat geschrieben:ListView ist nicht gleich ListBox.
das kam zusammen mit dem "Office" Menu. Das "Pack" hatte aber keine "Anbindung" an XppFD.EXE ( Formdesigner ) da die *.DAT Datei nicht mitgeliefert wurde.brandelh hat geschrieben:War die ListBox nicht in einem der vorhandenen Packs erweitert worden ?
gruss by OHR
Jimmy
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 164
- Registriert: Mo, 09. Jan 2006 17:06
- Wohnort: Paderborn
- Hat sich bedankt: 2 Mal
- Kontaktdaten:
Re: XbpListBox einzelne Items einfärben
Hallo Tom,
Deine Darstellung der Combobox finde ich sehr interessant. Wie hast Du denn die Spalten hinbekommen?
Ich habe damit seinerzeit viel herumprobiert (Stichwort :multiColumn) und habe dann in der Hilfe den Hinweis gefunden, dass der Mehrspaltenmodus für das Listbox-Element von XbpCombobox-Objekten nicht unterstützt wird.
Aber irgendwie scheint es ja doch zu gehen...
Viele Grüsse
Hans
Deine Darstellung der Combobox finde ich sehr interessant. Wie hast Du denn die Spalten hinbekommen?
Ich habe damit seinerzeit viel herumprobiert (Stichwort :multiColumn) und habe dann in der Hilfe den Hinweis gefunden, dass der Mehrspaltenmodus für das Listbox-Element von XbpCombobox-Objekten nicht unterstützt wird.
Aber irgendwie scheint es ja doch zu gehen...
Viele Grüsse
Hans
- 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: XbpListBox einzelne Items einfärben
Hallo, Hans.
Diese Listbox ist nicht mehrspaltig. DrawItem bekommt ein - mit Var2Char umgewandeltes - Array, das in der Methode zurück in ein Array umgewandelt wird. Mit MeasureItem wird die Zeilenhöhe gesetzt, damit sie mit der Höhe des SLE übereinstimmt. In der Zeile malt die Methode abhängig vom Inhalt des Arrays zunächst den Text, dann die Box (die auch von Arraydaten abhängig gefärbt wird) und schließlich, sofern vorhanden, ein Symbol, das aus einer DLL geladen wird. Die Position der einzelnen Elemente wird über die Breite der Listbox ermittelt (es gibt also eine Mindestbreite, für die das noch funktioniert). Alle relevanten Prozesse (Positionsermittlung, Erzeugung des Icons usw.) finden einmalig in der Init-Methode statt. That's it.
Diese Listbox ist nicht mehrspaltig. DrawItem bekommt ein - mit Var2Char umgewandeltes - Array, das in der Methode zurück in ein Array umgewandelt wird. Mit MeasureItem wird die Zeilenhöhe gesetzt, damit sie mit der Höhe des SLE übereinstimmt. In der Zeile malt die Methode abhängig vom Inhalt des Arrays zunächst den Text, dann die Box (die auch von Arraydaten abhängig gefärbt wird) und schließlich, sofern vorhanden, ein Symbol, das aus einer DLL geladen wird. Die Position der einzelnen Elemente wird über die Breite der Listbox ermittelt (es gibt also eine Mindestbreite, für die das noch funktioniert). Alle relevanten Prozesse (Positionsermittlung, Erzeugung des Icons usw.) finden einmalig in der Init-Methode statt. That's it.
Herzlich,
Tom
Tom
-
- Rekursionen-Architekt
- Beiträge: 164
- Registriert: Mo, 09. Jan 2006 17:06
- Wohnort: Paderborn
- Hat sich bedankt: 2 Mal
- Kontaktdaten:
Re: XbpListBox einzelne Items einfärben
Aahh, vielen Dank Tom,
das wäre ja vielleicht ein Grund, sich doch mit Ownerdrawing zu beschäftigen. Bislang hatte ich noch keine Veranlassung, mich darin einzuarbeiten.
Ich habe das Thema immer nur am Rande mitverfolgt und auch so verstanden, dass sich Ownerdrawing und Styles nicht vertragen.
Liege ich da richtig?
Hans
das wäre ja vielleicht ein Grund, sich doch mit Ownerdrawing zu beschäftigen. Bislang hatte ich noch keine Veranlassung, mich darin einzuarbeiten.
Ich habe das Thema immer nur am Rande mitverfolgt und auch so verstanden, dass sich Ownerdrawing und Styles nicht vertragen.
Liege ich da richtig?
Hans
- 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: XbpListBox einzelne Items einfärben
Hallo, Hans.
Anders gesagt: Themes stellen hier, bezogen auf die gestalterische Freiheit des Programmierers, einen Rückschritt dar. Die entstehenden Applikationen wirken zwar einheitlicher, aber die Gestaltungsmöglichkeiten sind geringer. Vorsichtig gesagt. Ohne Vordergrundfarben in Browses bin ich so gut wie aufgeschmissen, denn wir verwenden Browses u.a. für umfangreiche Planungssysteme, bei denen Farben wichtige Rollen spielen.
Mit Ownerdrawing kann man in diesen Prozess eingreifen, und zwar auf verschiedenen Ebenen. In einem Browse kann die Applikation z.B. die Zeichnung der Zelleninhalte (Vordergründe) übernehmen, um so die Betriebssystemeinschränkungen zu umgehen. Letztlich kann man das sehr weit treiben, wie in meiner Listbox gezeigt, die zwar viel kann, aber eben nicht mehr richtlinienkonform ist. Hier übernehme ich auch das Highlighting und sogar, über MeasureItem, die Auswahl des Anzeigebereichs. Das mache ich in Browses nicht. Meine App würde in dieser Situation vermutlich kein MS-Zertifikat bekommen, aber dafür kann sie alles, was sie können soll, und sie sieht toll aus. Das ist mir, um ehrlich zu sein, auch wichtiger.
"Nicht vertragen" ist also nicht ganz richtig - es hängt davon ab, wo man ansetzt. Wenn man mit OWNERADVANCED das Zeichnen für alle Situationen (Hintergrund, Vordergrund, Hervorhebung usw.) übernimmt, hat man keine Schwierigkeiten, denn das OS beeinflusst nicht mehr, wie die Daten aussehen (dafür ist die App dann an dieser Stelle nicht mehr "konform"). Wenn man tiefer ansetzt und z.B. nur die Vordergründe zeichnet (etwa in Browses, um Vordergrundfarben zu reaktivieren), kann man mit Systemfarben in Konflikt geraten. Solche Fälle müsste man dann abfangen, oder man überlässt es dem Benutzer, hier Farben zu wählen. Man kann das ganze aber auch umgekehrt sehen: Ownerdrawing erlaubt es, z.B. unter XP oder Windows 2000 (oder wenn überhaupt keine Themes genutzt werden) intern so zu arbeiten, dass es trotzdem "nach Theme aussieht", denn auch die Gradientenhervorhebung mit hübschem Rand usw. lässt sich nachstellen.
Solche Listboxen wie die von mir gezeigte dürfte es also eigentlich nicht geben, denn sie entsprechen nicht mehr den Spezifikationen für solche Controls. Wenn einem das egal ist (was für mich gilt), nutzt man sie trotzdem.
Wenn man mit SL1 und Vista/7 unter Verwendung eines Themes wie "Aero" arbeitet, funktionieren z.B. per ColorBlock für Spalten gewählte Vordergrundfarben in Browses nicht mehr. Das ist, wie Steffen Pirsig auf unserem Treffen in Hannover ausgeführt hat, der Tatsache geschuldet, dass Microsoft für diese Situation klare Vorgaben (Vorschriften) macht, von deren Einhaltung/Nichteinhaltung abhängig ist, ob eine Software - in diesem Fall der Compiler - noch zertifizierbar ist oder nicht. Anders gesagt: Bei der Verwendung von Themes gibt es in betriebssystemkonformen Browses eigentlich keine Vordergrundfarben mehr. Dafür gibt es auch eine einleuchtende Erklärung: Da das Theme bestimmt, mit welchen Farben die Hervorhebung arbeitet, könnte die direkte Farbauswahl hier dazu führen, dass man z.B. blaue Schrift vor blauem Hintergrund hätte - also nichts mehr erkennen könnte.Ich habe das Thema immer nur am Rande mitverfolgt und auch so verstanden, dass sich Ownerdrawing und Styles nicht vertragen.
Anders gesagt: Themes stellen hier, bezogen auf die gestalterische Freiheit des Programmierers, einen Rückschritt dar. Die entstehenden Applikationen wirken zwar einheitlicher, aber die Gestaltungsmöglichkeiten sind geringer. Vorsichtig gesagt. Ohne Vordergrundfarben in Browses bin ich so gut wie aufgeschmissen, denn wir verwenden Browses u.a. für umfangreiche Planungssysteme, bei denen Farben wichtige Rollen spielen.
Mit Ownerdrawing kann man in diesen Prozess eingreifen, und zwar auf verschiedenen Ebenen. In einem Browse kann die Applikation z.B. die Zeichnung der Zelleninhalte (Vordergründe) übernehmen, um so die Betriebssystemeinschränkungen zu umgehen. Letztlich kann man das sehr weit treiben, wie in meiner Listbox gezeigt, die zwar viel kann, aber eben nicht mehr richtlinienkonform ist. Hier übernehme ich auch das Highlighting und sogar, über MeasureItem, die Auswahl des Anzeigebereichs. Das mache ich in Browses nicht. Meine App würde in dieser Situation vermutlich kein MS-Zertifikat bekommen, aber dafür kann sie alles, was sie können soll, und sie sieht toll aus. Das ist mir, um ehrlich zu sein, auch wichtiger.
"Nicht vertragen" ist also nicht ganz richtig - es hängt davon ab, wo man ansetzt. Wenn man mit OWNERADVANCED das Zeichnen für alle Situationen (Hintergrund, Vordergrund, Hervorhebung usw.) übernimmt, hat man keine Schwierigkeiten, denn das OS beeinflusst nicht mehr, wie die Daten aussehen (dafür ist die App dann an dieser Stelle nicht mehr "konform"). Wenn man tiefer ansetzt und z.B. nur die Vordergründe zeichnet (etwa in Browses, um Vordergrundfarben zu reaktivieren), kann man mit Systemfarben in Konflikt geraten. Solche Fälle müsste man dann abfangen, oder man überlässt es dem Benutzer, hier Farben zu wählen. Man kann das ganze aber auch umgekehrt sehen: Ownerdrawing erlaubt es, z.B. unter XP oder Windows 2000 (oder wenn überhaupt keine Themes genutzt werden) intern so zu arbeiten, dass es trotzdem "nach Theme aussieht", denn auch die Gradientenhervorhebung mit hübschem Rand usw. lässt sich nachstellen.
Solche Listboxen wie die von mir gezeigte dürfte es also eigentlich nicht geben, denn sie entsprechen nicht mehr den Spezifikationen für solche Controls. Wenn einem das egal ist (was für mich gilt), nutzt man sie trotzdem.
Herzlich,
Tom
Tom
-
- Rekursionen-Architekt
- Beiträge: 164
- Registriert: Mo, 09. Jan 2006 17:06
- Wohnort: Paderborn
- Hat sich bedankt: 2 Mal
- Kontaktdaten:
Re: XbpListBox einzelne Items einfärben
Hallo Tom,
vielen Dank für diese ausführlichen Erläuterungen.
Wie gesagt hatte ich bislang zum Thema Ownerdrawing keine Notwendigkeit erkennen können und habe das Gefühl, dass es vielen hier so geht.....
Hans
vielen Dank für diese ausführlichen Erläuterungen.
Wie gesagt hatte ich bislang zum Thema Ownerdrawing keine Notwendigkeit erkennen können und habe das Gefühl, dass es vielen hier so geht.....
Hans
- 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: XbpListBox einzelne Items einfärben
Hallo, Hans.
Wer mit dem Standardverhalten und -aussehen der Parts/Controls auskommt, hat auch keine Notwendigkeit, sich mit Ownerdrawing zu befassen. Außerdem gibt es natürlich Alternativen - man kann sich Active-X-Komponenten kaufen, die dann das leisten, was hauseigene Controls standardmäßig (!) nicht mehr können. Aber Ownerdrawing ist unterm Strich eigentlich ziemlich simpel umzusetzen. Man muss sich ein wenig mit der GRA-Engine auseinandersetzen, man sollte etwas (ist nicht viel) über Presentation Spaces wissen - und eine Lösung dafür finden, dass Ownerdrawing in separierten Threads stattfindet, dass also keine Verbindung z.B. zu Workareas vorhanden sind. Alles andere ist Fleißarbeit.
Wer mit dem Standardverhalten und -aussehen der Parts/Controls auskommt, hat auch keine Notwendigkeit, sich mit Ownerdrawing zu befassen. Außerdem gibt es natürlich Alternativen - man kann sich Active-X-Komponenten kaufen, die dann das leisten, was hauseigene Controls standardmäßig (!) nicht mehr können. Aber Ownerdrawing ist unterm Strich eigentlich ziemlich simpel umzusetzen. Man muss sich ein wenig mit der GRA-Engine auseinandersetzen, man sollte etwas (ist nicht viel) über Presentation Spaces wissen - und eine Lösung dafür finden, dass Ownerdrawing in separierten Threads stattfindet, dass also keine Verbindung z.B. zu Workareas vorhanden sind. Alles andere ist Fleißarbeit.
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: XbpListBox einzelne Items einfärben
es gibt die Methode GraBackground() welche den "visual Style" anzeigt.hschmidt hat geschrieben:Ich habe das Thema immer nur am Rande mitverfolgt und auch so verstanden, dass sich Ownerdrawing und Styles nicht vertragen.
bei Xbase++ erfolgt die "Anzeige" des "visual Style" nun "auf" einem XbPart sodas evtl. Hintergrundfarbe des XbPart "überdeckt" werden.
Dies Verhalten ist IMHO falsch den "visual Style" sollte im "selben Layer" angezeigt werden sodas es sich wie bei der Vordergrund Farbe, welche für die "Schrift" zuständig ist, verhält ( OVERPAINT ).
hier nun mal SOURCE für eine Ownerdraw ComboBox, eine Listbox sollte sich schnell aus dem Beispiel ableiten lassen.
- Dateianhänge
-
- DXECOMBO.zip
- Ownerdraw ComboBox SOURCE
!!! need v1.9.355 SL1 !!! - (10.47 KiB) 286-mal heruntergeladen
gruss by OHR
Jimmy
Jimmy