Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Mehrspaltige ComboBox? (https://www.delphipraxis.net/114889-mehrspaltige-combobox.html)

Borschti 2. Jun 2008 13:37


Mehrspaltige ComboBox?
 
Hallo,

Ich bin auch der suche nach einer Möglichkeit, einer ComboBox mehrere Spalten zu geben.

Ich habe mich einmal ein wenig im Forum umgeschaut aber das einzig halbwegs brauchbare was Ich gefunden hab, waren Vorschläge mit AddObject(), das benutze Ich aber zZ. selber.

Also Ich möchte eine ComboBox mit 2 oder, noch besser, mehr Spalten darstellen.
Ich hoffe Ihr habt micht verstanden :) Ich kann Probleme manchmal nicht so gut Schildern ;)

Also dann schonmal danke für eure Antworten.

mfg
Bossi

[edit=SirThornberry]Buchstabendreher im Titel korrigiert - Mfg, SirThornberry[/edit]

Bernhard Geyer 2. Jun 2008 13:38

Re: Mehrsapltige ComboBox?
 
Das ElPack hat eine ComboBox an der ein ganzer Tree angehängt werden kann. Dieser Tree kann so konfiguriert werden das er wie ein ListView aussieht.

andyvdeu 2. Jun 2008 13:45

Re: Mehrsapltige ComboBox?
 
Hallo,
vielleicht hilft die hier : http://www.o2a.com/cbplus.htm

alex517 2. Jun 2008 13:51

Re: Mehrsapltige ComboBox?
 
Mehrere Spalten in einer Combobox

alex

himitsu 2. Jun 2008 14:01

Re: Mehrsapltige ComboBox?
 
Eine ComboBox besteht ja aus einem Edit und einer ListBox.

wenn man sich den Zugriff auf die enthaltene ListBox (nicht das Windows Control "ListBox", sondern "ComboLBox" ) besorgt, dann sollten sich da, wie auch bei der normalen ListBox, mehrere Spalten erstellen lassen.
(gilt für Windows Control "ComboBox", ob es bei "ComboBoxEx" auch so ist, weiß ich grad nicht ... kann sein, daß dort eine "normale" ListBox enthalten ist)



aber der Trick mit dem selber Zeichnen (siehe alex517s Link) ist wohl erstmal Einfacher, da es beim "Edit" eh keine Spalten gibt und man da so oder so selber zeichnen müßte.

FAlter 2. Jun 2008 14:05

Re: Mehrsapltige ComboBox?
 
Hi,

ich hätte es auch mit Owner Draw erledigt, allerdings scheint mir der Code von Torry ein wenig lang. Zum auseinanderpfriemeln könnte man TStringList.DelimitedText verwenden oder - was sogar bei älteren Delphis geht - CommaText. Dadurch wird der Code gleich übersichtlicher (wenn auch evtl. langsamer, aber das stört in diesem Fall kaum, da es nicht bemerkt wird).

Hier ein kurzes Beispiel:

im OI ComboBox1.Style = csOwnerDrawFixed einstellen.

Delphi-Quellcode:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  Item: TStringList;
  W, I, L: Integer;
  R: TRect;
begin
  Item := TStringList.Create;
  try
    Item.CommaText := ComboBox1.Items[Index];
    W := (Rect.Right - Rect.Left) div Item.Count; //hier alle gleiche Breite

    for I := 0 to Item.Count - 1 do
    begin
      L := Rect.Left + I * W;
      ComboBox1.Canvas.TextRect(
        Classes.Rect(L, Rect.Top, Rect.Right, Rect.Bottom),
        L,
        Rect.Top,
        Item[I]
      );
    end;
  finally
    Item.Free;
  end;
end;
Der Inhalt im ComboBox1.Items ist dann im CSV-Format (mit , und "):

Code:
"Spalte 1","Spalte 2","Spalte 3"
"Hallo Welt",NurEinWort,42
Leer,,"<-- war leer"
Mfg
FAlter

[edit] Torry hat nicht einmal eine Schleife genommen? Und was, wenn man schnell mal die Anzahl der Spalten ändern will? [/edit]

Borschti 2. Jun 2008 15:04

Re: Mehrspaltige ComboBox?
 
Danke sehr für die vielen Antworten. Ich guck mir das alles mal an und entscheide mich dann für eine der möglichkeiten.

mfg
Bossi

Borschti 2. Jun 2008 15:42

Re: Mehrspaltige ComboBox?
 
Hi,

also Ich habe ein kleines Problem mit FAlters Code. Und zwar versuche Ich gerade in die ComboBox Zeilen hinzuzufügen, das versuche ich durch ein ButtonClick Ereignis, also wie in dem Code von Torry.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
with VisiCombobox2.Items do
  begin
    Add('"Spalte 1","Spalte 2","Spalte 3"');
    Add('"Hallo Welt",NurEinWort,42');
    Add('Leer,,"<-- war leer"');
  end;
end;
Wenn Ich dann allerdings die ComboBox aufklappe wird mir eine Fehlermeldung angezeigt "Division by Zero".

Diese Zeile wird mir rot markiert und der Zeiger steht am anfang:

Delphi-Quellcode:
W := (Rect.Right - Rect.Left) div Item.Count;
Liegt das an der Art wie Ich die Strings der ComboBox hinzufüge oder liegt das am Code?

mfg
Bossi

FAlter 2. Jun 2008 15:56

Re: Mehrspaltige ComboBox?
 
Hi,

auf "leere" Inhalte war mein Code nicht vorbereitet. Aber was spricht dagegen, einfach ein if Item.Count > 0 then begin ... end hinzusetzen?

Jedenfalls hast du ein leeres Item in deiner ComboBox drin, also ''.

Ansonsten kannst du den Inhalt auch schon per Objektinspektor setzen.

Mfg
FAlter

[edit] Am besten sieht es aus, wenn du im Falle not (Count > 0) wenigstens ein Rechteck zeichnest:

Delphi-Quellcode:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  Item: TStringList;
  W, I, L: Integer;
  Cb: TCustomComboBox;
begin
  Cb := (Control as TCustomComboBox);

  Item := TStringList.Create;
  try
    Item.CommaText := Cb.Items[Index];
    if Item.Count > 0 then
    begin
      W := (Rect.Right - Rect.Left) div Item.Count; //hier alle gleiche Breite

      for I := 0 to Item.Count - 1 do
      begin
        L := Rect.Left + I * W;
        Cb.Canvas.TextRect(
          Classes.Rect(L, Rect.Top, Rect.Right, Rect.Bottom),
          L,
          Rect.Top,
          Item[I]
        );
      end;
    end
    else
      Cb.Canvas.FillRect(Rect);
  finally
    Item.Free;
  end;
end;
[/edit]

[edit] Code verbessert - kann jetzt für mehrere ComboBoxen verwendet werden und muss nicht mehr angepasst werden (an tatsächlich verwendeten Namen der ComboBox). [/edit]
[edit] Jetzt aber :oops: letztes vergessenes ComboBox1 eliminiert. [/edit]

Borschti 2. Jun 2008 16:09

Re: Mehrspaltige ComboBox?
 
Die Sache ist ja die, dass überhaupt kein Inhalt in die ComboBox gepackt wird.
Also Ich füge per ButtonClick die Zeilen hinzu, die du in deinem ersten Post als Beispiel gegeben hast, wenn Ich dann die ComboBox aufploppen lasse hat diese keine Einträge in Form von Buchstaben oder Zahlen, nur 3 leere Zeilen :(

Also liegt das doch daran wie Ich die Zeilen hinzufüge oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 Uhr.
Seite 1 von 2  1 2      

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