Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Listbox mit Farbflächendarstellung (https://www.delphipraxis.net/194721-listbox-mit-farbflaechendarstellung.html)

to-wer 28. Dez 2017 08:08

Listbox mit Farbflächendarstellung
 
Hallo zusammen,
habe mein Stickkonvertierungstool (nst zu nc Format mit grafischer Darstellung) fast fertig und hänge jetzt an einer Stelle fest, wo ich es nicht vermutet habe.
Ich möchte eine Liste aus Garnnummer mit Farbangabe (hex-rgb) als Listbox auswählbar machen.
Die Farbangabe soll dabei als kleines Rechteck in der betreffenden Farbe dargestellt werden.
Die TColorBox lässt sich nicht ohne weiteres modifizieren (ich kann zwar meine Farbnamen eingeben, jedoch schaffe ich es nicht, eigene Farbmischungen über TObject anzugeben), wie ich auch hier in diversen Beiträgen gelesen habe. Diese Darstellung wäre ideal.
Bekommt man die auch anderweitig hin? Wenn ja wie?

Falls der Vorschlag Colordialog aufkommt... der funktioniert, ist aber nicht praktikabel, da man dort nur Farben mischen kann, aber keine Farbnamen/nummern eingeben kann, die ich zwingend später für die Ausgabe benötige.

Danke und viele Grüße
Torsten

Fritzew 28. Dez 2017 09:17

AW: Listbox mit Farbflächendarstellung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Schau Dir das mal an...

to-wer 28. Dez 2017 11:11

AW: Listbox mit Farbflächendarstellung
 
danke für die schnelle Antwort...
Ich nutze noch Delphi 7, gab es da die TColorListBox schon? Gerade finde ich sie nicht.

Delphi.Narium 28. Dez 2017 11:34

AW: Listbox mit Farbflächendarstellung
 
Schau Dir bitte mal die TJvColorComboBox der Jedis an.

Da funktioniert sowas:
Delphi-Quellcode:
Var
  Color : TColor;
begin
  JvColorComboBox1.Clear;
  JvColorComboBox1.SelectAll;
  JvColorComboBox1.DeleteSelected;
  JvColorComboBox1.AddColor($00FFFFFF,'Weiß');
  JvColorComboBox1.AddColor($00000000,'Schwarz');
  Color := irgendeinFarbwertDerWerweißwoHerkommt;
  JvColorComboBox1.AddColor(Color,'Farbname');
...
end;

to-wer 28. Dez 2017 12:10

AW: Listbox mit Farbflächendarstellung
 
genau sowas wäre perfekt.
Dann schau ich mal, ob ich die Jedis installiert bekomme...

Aviator 28. Dez 2017 12:39

AW: Listbox mit Farbflächendarstellung
 
Ich hatte sowas auch mal mit einer ganz normalen TComboBox gemacht. Einfach das OnDrawItem Event dafür nutzen und hinter die Bezeichnung ein kleines Quadrat in der jeweiligen Farbe malen. Dann kannst du das Item selbst so malen wie du das gerne hättest. Den Style musst du dafür auf einen der beiden
Delphi-Quellcode:
csOwnerDrawXXX
setzen.

Nachteil dabei ist, dass es kein Eingabefeld gibt wo du direkt in der ComboBox etwas editieren kannst. Ich hatte das damals so gelöst, dass ich einen bzw. mehrere "Custom Color" Einträge gemacht hatte bei denen beim daraufklicken ein TColorDialog geöffnet wurde. Da kannst du dann natürlich variieren und auch eine Form mit Edit-Feld öffnen wo man einen Farbwert eingeben kann.

Oder du gehst den umgekehrten Weg und öffnest eine Form in der du den Farbwert eingeben kannst. Beim Klick auf OK wird der Wert dann übernommen und ein neuer Eintrag in der ComboBox erzeugt um diesen später immer wieder auswählen zu können. Vorteil bei dieser Lösung wäre, dass der Benutzer der Farbe auch einen eigenen Namen verpassen kann. OK, das würde bei der anderen Lösung auch funktionieren, ist aber wieder umständlicher.


PS: Der Grund warum ich diese Lösung vorschlage ist, dass ich gerne Standardkomponenten verwende um das Projekt möglichst schnell auf einem neu installierten PC ohne Zusatzkomponenten installieren zu können. Des Weiteren habe ich auch mal schlechte Erfahrungen mit den Jedis gemacht und umgehe die Nutzung der Komponenten seitdem.

Delphi.Narium 28. Dez 2017 12:46

AW: Listbox mit Farbflächendarstellung
 
Nutze die Jedis seit Jahr und Tag und das mit einer so großen Selbstverständlichkeit, dass es mit nichtmal mehr auffällt.

Probleme: Keine mir bekannten.

Vielleicht liegts ja dadran, das mein Delphi 7 total veraltet ist, ich die Jedis aber eigentlich immer recht aktuell halte.

to-wer 28. Dez 2017 14:45

AW: Listbox mit Farbflächendarstellung
 
Hallo Aviator,
ich denke, dass ich es tatsächlich mit der Combobox machen möchte.
Nach einigen Versuchen hatte ich die Jedi Komponenten zwar installiert bekommen, kann aufgrund fehlender Erfahrung damit aber nicht so viel anfangen.

Meine OnDraw Komponenten sieht jetzt so aus, wobei ich z.B. noch die Schriftfarbe abhängig von der Hintergrundfarbe einstellen werde.
Eine Kleinigkeit funktioniert aber noch nicht... die Farbwerte für die Farbnamen habe ich in einem anderen Array "Polyneon". Dort möchte ich parallel den gleichen Wert abfragen wie gerade das Item in der Combobox bearbeitet wird. Das funktioniert aber nicht (Programmfehler). Ist Combobox1.ItemIndex nicht der richtige Zeiger auf die aktuelle Zeile?

Code:
procedure TForm2.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with (Control as TComboBox).Canvas do begin // in ListBox zeichnen
    Brush.Color := StringToColor(Polyneon[ComboBox1.ItemIndex]);
    Brush.Style := bsSolid;
    FillRect(Rect);
    Brush.Style := bsClear;
    TextOut(Rect.Left, Rect.Top, (Control as TComboBox).Items[Index]); // Text schreiben
  end;
end;

Delphi.Narium 28. Dez 2017 15:13

AW: Listbox mit Farbflächendarstellung
 
ItemIndex ist das gerade ausgewählte Element in Items. Ist nichts ausgewählt, ist ItemIndex -1 und damit ungültig.

Beim TextOut nutzt Du Index, warum nicht auch beim Zugriff auf das Array Polyneon? Beginnt das Array bei 0? Dann sollte das gehen, ansonsten zeig' und bitte mal die Definition von Polyneon.

to-wer 28. Dez 2017 15:37

AW: Listbox mit Farbflächendarstellung
 
genau das war es. Habe im Objektinspektor ItemIndex auf 0 gesetzt und es stürzt nicht mehr ab.
Nur sind alle Einträge in der gleichen Hintergrundfarbe geschrieben.
Ist auch logisch, da er auf 0 steht und die Farbe von Polyneon[0] verwendet.
Wie bringe ich es dazu, den Index parallel zu ondraw hochzuzählen?

Hatte es zwischenzeitlich schon mit Combobox1.OnDrawItem versucht. Da kommt die Meldung "nicht genügend wirkliche Parameter".
Notfalls packe ich die Farbnamen und die Farben selbst zusammen in die Combobox und ziehe mir mit Left und Right$ die entsprechenden Parameter heraus. Das wäre aber der letzte Plan, wenn alles andere nichts wird.

to-wer 28. Dez 2017 15:49

AW: Listbox mit Farbflächendarstellung
 
ich korrigiere mich...
Die Zeilen werden schon unterschiedlich eingefärbt. Aber erst, wenn man mit dem Mauszeiger darüber fährt.
Es soll aber so sein, dass die Liste gleich richtig farbig gezeichnet wird.
Würde das gehen?

Delphi.Narium 28. Dez 2017 16:05

AW: Listbox mit Farbflächendarstellung
 
Warum nicht 'ne TJvColorCombobox auf's Formular pappen?

Und dann sinngemäß:
Delphi-Quellcode:
// Im FormCreate
Var
  i    : Integer;
begin
  JvColorComboBox1.Clear;
  for i := Low(Polyneon) to High(Polyneon) do begin
    JvColorComboBox1.AddColor(StringToColor(Polyneon[i]),Polyneon[i]));
  end;
end;
Wie ist denn Polyneon definiert?
Delphi-Quellcode:
type
// Dann muss man nicht irgendwie zwei Listen nebeneinander pflegen
// und versuchen, die synchron zu halten.
  tColorRec = record
    Color : TColor;
    Name : String;
  end;

var
  Polyneon array [0..AnzahlFarben] of tColorRec;

// Im FormCreate o. ä. sinnvoller Stelle
Var
  i    : Integer;
begin
  JvColorComboBox1.Clear;
  for i := Low(Polyneon) to High(Polyneon) do begin
    JvColorComboBox1.AddColor(Polyneon[i].Color,Polyneon[i].Name);
  end;
end;

to-wer 28. Dez 2017 16:11

AW: Listbox mit Farbflächendarstellung
 
Wo find ich denn diese Komponente in Delphi, wenn ich alles installiert habe?

Delphi.Narium 28. Dez 2017 16:23

AW: Listbox mit Farbflächendarstellung
 
In meinem Delphi 7 in der Palette auf dem Reiter Jv Lists, Combos, Trees, das 9. Symbol von rechts.

Oder Menü:

-> Ansicht
--> Komponentenliste
---> TJvColorComboBox
eingeben.

MyRealName 28. Dez 2017 17:20

AW: Listbox mit Farbflächendarstellung
 
Du könntest die Komplementärfarbe nutzen, um die Schrift innerhalb eines farbgefüllten Bereiches immer lesbar zu haben.

Aviator 28. Dez 2017 18:21

AW: Listbox mit Farbflächendarstellung
 
Zitat:

Zitat von to-wer (Beitrag 1389804)
Wo find ich denn diese Komponente in Delphi, wenn ich alles installiert habe?

Die Komponente die Delphi.Narium meint ist von den Jedis.

Ich habe dein Problem aber noch nicht so ganz verstanden. Was genau funktioniert jetzt nicht? Dein SourceCode auf Seite 1 sieht soweit richtig aus bis evtl. auf die Textfarbe. Das With stört mich zwar etwas, aber das musst du wissen ob du das verwenden willst.

Beherzige den Tipp von MyRealName. Dann kannst du den Text wenigstens richtig lesen.
Zitat:

Zitat von MyRealName (Beitrag 1389814)
Du könntest die Komplementärfarbe nutzen, um die Schrift innerhalb eines farbgefüllten Bereiches immer lesbar zu haben.

Die Farbe kannst du mit
Delphi-Quellcode:
clBlack xor $DeineFarbe
bilden (wenn ich das noch richtig im Kopf habe).

to-wer 28. Dez 2017 21:04

AW: Listbox mit Farbflächendarstellung
 
@myrealname: ja genau das hatte ich vor bzw. als Alternative von der Farbsumme (R+G+B) die Schrift in schwarz oder weiß anzulegen.

@Aviator: mein Problem ist, dass die Hintergründe erst in den entsprechenden Farben gezeichnet werden, wenn ich mit der Maus darüber gehe.
In dem Moment, wo ich die Combobox öffne, werden alle Hintergründe mit der Hintergrundfarbe des ersten Feldes gezeichnet, z.B. hellblau. Das ist auch beim Verschieben der Scrollbar so, alles einfarbig. Erst mit dem Mauszeiger drüberfahren ist irgendwie blöd.

Um die Jedi Tools zu installieren, muss ich erst mein Delphi an WIN10 anpassen. Deshalb hatte ich die "schnelle" Comboboxvariante vorerst bevorzugt.

Aviator 28. Dez 2017 21:05

AW: Listbox mit Farbflächendarstellung
 
Könntest du mal ein kleines Beispielprojekt anhängen wo man den Fehler nachvollziehen kann?

EDIT: Ich verstehe was du meinst, aber ich kann an dem SourceCode so nichts falsches erkennen. Deshalb wäre ein Beispielprojekt hilfreich.

to-wer 29. Dez 2017 17:36

AW: Listbox mit Farbflächendarstellung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Aviator,
habe das Projekt auf die wesentlichen Funktionen zusammengeschrumpft.
Du kannst die Projektdatei öffnen und starten.
Im Formular Grafik findet man rechts unten die Combobox Polyneon.

In der Unit ist die onDraw Prozedur die vorletzte.
Gestern hatte ich bei einem ähnlichen Listboxproblem noch etwas mit DropKind oder so ähnlich gelesen. Das gibt es bei der Combobox wohl nicht?!
VG

Delphi.Narium 29. Dez 2017 18:02

AW: Listbox mit Farbflächendarstellung
 
Wenn man diese Zeile ändert

Delphi-Quellcode:
Brush.Color := StringToColor(Polyneon[ComboBox1.ItemIndex]);


in

Delphi-Quellcode:
Brush.Color := StringToColor(Polyneon[Index]);


werden die Farben beim Aufklappen (wie gestern schon vermutet) korrekt angezeigt.

Es soll ja schließlich die Farbe zum entsprechenden Eintrag aus Polyneon und nicht immer die Farbe des zufällig gerade gewählten Eintrages genommen werden.

to-wer 29. Dez 2017 19:58

AW: Listbox mit Farbflächendarstellung
 
Du bist genial... es geht.
Jetzt verstehe ich langsam diese Prozedur, wo "Index" ja auch in der Variablenübergabe auftaucht...

Hier noch einmal die ganze Prozedur, falls sie jemand anderem noch helfen kann.
Delphi-Quellcode:
procedure TForm2.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with (Control as TComboBox).Canvas do begin // in ComboBox zeichnen
    Brush.Color := StringToColor(Stringarray[Index]); //im Stringarray befinden sich die HEX-Farbwerte
    Brush.Style := bsSolid;
    FillRect(Rect);
    Brush.Style := bsClear;
    TextOut(Rect.Left, Rect.Top, (Control as TComboBox).Items[Index]);
  end;
end;

Aviator 29. Dez 2017 19:58

AW: Listbox mit Farbflächendarstellung
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1389841)
Wenn man diese Zeile ändert

Delphi-Quellcode:
Brush.Color := StringToColor(Polyneon[ComboBox1.ItemIndex]);


in

Delphi-Quellcode:
Brush.Color := StringToColor(Polyneon[Index]);


werden die Farben beim Aufklappen (wie gestern schon vermutet) korrekt angezeigt.

Es soll ja schließlich die Farbe zum entsprechenden Eintrag aus Polyneon und nicht immer die Farbe des zufällig gerade gewählten Eintrages genommen werden.

:thumb::thumb::thumb:

Sowas übersieht man dann auch leicht in dem geposteten SourceCode auf Seite 1 :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz