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/)
-   -   Delphi TColorListBox mit eigenen Farben aufwerten (https://www.delphipraxis.net/122644-tcolorlistbox-mit-eigenen-farben-aufwerten.html)

martinf16 19. Okt 2008 22:03


TColorListBox mit eigenen Farben aufwerten
 
Hallo!

Ich möchte gerne eigene Farben zur TColorListBox hinzufügen - habs bisher aber weder mit Google noch mit Ausprobieren hinbekommen. Mit items.add lässt sich zum Beispiel zwar ein beliebiger Text hinzufügen, die Farbe bleibt aber immer die gleiche. Desweiteren gibt es Eigenschaften wie colors und colornames, aber diese stehen auf onlyread und lassen sich auch nicht beeinflussen.

Weiß von euch jemand was man da machen kann oder ob es eine elegantere Lösung gibt? Im Programm soll der Benutzer eine Farbpalette zur Verfügung gestellt bekommen, die er selber bestücken und löschen kann.

Vielen Dank!

roga 19. Okt 2008 22:54

Re: TColorListBox mit eigenen Farben aufwerten
 
Hallo,

nimm doch einfach eine Combobox und stelle Style auf csOwnerDrawVariable.
Dann Farben hinzufügen...
Delphi-Quellcode:
  Items.Add('clBlack');
  Items.Add('clMaroon');
  Items.Add('clGreen');
  ...
... und über DrawItem
Delphi-Quellcode:
  Canvas.Brush.Color := StringToColor(ComboBox.Items[Index]);
Gruß RoGa

martinf16 27. Okt 2008 22:33

Re: TColorListBox mit eigenen Farben aufwerten
 
Ich habs inzwischen mit einer Listview hinbekommen, das ist der Code:

Delphi-Quellcode:

procedure Tprog.tabelleCustomDrawItem(Sender: TCustomListView; Item: TListItem;
  State: TCustomDrawState; var DefaultDraw: Boolean);
var
  r, r2: trect;
  breite: integer;
begin
  breite:=sender.Column[0].Width; //Breite der ersten Spalte
  r:=item.DisplayRect(drbounds); //Rect der Zelle der ersten Spalte
  sender.canvas.Brush.Color:=farbliste[item.Index]; //farbliste ist ein Array mit den Farbwerten
  sender.Canvas.fillrect(r); //Rechteck wird in erste Zelle gezeichnet
  sender.Canvas.Brush.Color:=clwindow; //Farbe wird wieder zurückgestellt
end;
Allerdings funktioniert es noch nicht ganz so, wie ich es mir vorstelle. Die Farbe erscheint erst wenn man mit der Maus längere Zeit darüberfährt, offenbar wird das Rechteck teilweise wieder übermalt - es ist nur noch an einer Ecke sichtbar. Habt ihr ne Idee???

Danke schonmal!

Hawkeye219 27. Okt 2008 22:48

Re: TColorListBox mit eigenen Farben aufwerten
 
Hallo,

so sollte es auch mit der TColorListBox gehen:

Delphi-Quellcode:
// vorne einfügen
ColorListBox.Items.InsertObject(0, 'Meine Farbe', TObject(clRed));

// hinten anhängen
ColorListBox.Items.AddObject('Meine Farbe', TObject(clBlue));
Gruß Hawkeye

martinf16 28. Okt 2008 21:50

Re: TColorListBox mit eigenen Farben aufwerten
 
Vielen Dank. So klappts wunderbar.

martinf16 1. Nov 2008 13:10

Re: TColorListBox mit eigenen Farben aufwerten
 
Eine kleine Frage hätte ich doch noch: Wie kann man die Farben wieder aus der Liste löschen oder innerhalb der Liste verschieben?!

Zwar kann man Items ganz normal mit delete und dem enstprechenden Index löschen, es existiert aber kein Zugriff auf das selektierte Item, wie es bei normalen Listboxen der Fall ist. Ich möchte also dass der Benutzer des Programms ein Item anklickt und dieses dann mit ENTF oder einem Popup-Fenster löschen kann.

Außerdem wäre es gut wenn die Items vom User verschoben werden können.

Vielen Dank!

Hawkeye219 1. Nov 2008 14:24

Re: TColorListBox mit eigenen Farben aufwerten
 
Hallo,
Zitat:

Zitat von martinf16
[...]es existiert aber kein Zugriff auf das selektierte Item, wie es bei normalen Listboxen der Fall ist.

Der Zugriff erfolgt über die Eigenschaft ItemIndex - wie bei einer normalen ListBox.

Das Verschieben per Drag&Drop erfordert ein Setzen der Eigenschaft DragMode, und die ist bei der ColorListBox leider nicht öffentlich. Du musst dir also über einen kleinen Trick Zugriff auf diese Eigenschaft verschaffen:

Delphi-Quellcode:
type
  TColorListBoxCracker = class (TColorListBox);

procedure TDemoForm.FormCreate(Sender: TObject);
begin
  TColorListBoxCracker(ColorListBox).DragMode := dmAutomatic;
end;

procedure TDemoForm.ColorListBoxDragDrop(Sender, Source: TObject; X, Y: Integer);
var
  TargetIndex : Integer;
begin
  with (Sender as TColorListBox) do
    begin
      TargetIndex := ItemAtPos(Point(X, Y), False);

      if (TargetIndex >= Items.Count) then
        TargetIndex := Pred(Items.Count);

      Items.Move(ItemIndex, TargetIndex);
    end;
end;

procedure TDemoForm.ColorListBoxDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := ((Sender is TColorListBox) and (Source = Sender));
end;
Gruß Hawkeye

martinf16 2. Nov 2008 11:13

Re: TColorListBox mit eigenen Farben aufwerten
 
Super! Funktioniert perfekt! Danke! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 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