![]() |
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] |
Re: Mehrsapltige ComboBox?
Das
![]() |
Re: Mehrsapltige ComboBox?
|
Re: Mehrsapltige ComboBox?
|
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. |
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:
Der Inhalt im ComboBox1.Items ist dann im CSV-Format (mit , und "):
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;
Code:
Mfg
"Spalte 1","Spalte 2","Spalte 3"
"Hallo Welt",NurEinWort,42 Leer,,"<-- war leer" FAlter [edit] Torry hat nicht einmal eine Schleife genommen? Und was, wenn man schnell mal die Anzahl der Spalten ändern will? [/edit] |
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 |
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:
Wenn Ich dann allerdings die ComboBox aufklappe wird mir eine Fehlermeldung angezeigt "Division by Zero".
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; Diese Zeile wird mir rot markiert und der Zeiger steht am anfang:
Delphi-Quellcode:
Liegt das an der Art wie Ich die Strings der ComboBox hinzufüge oder liegt das am Code?
W := (Rect.Right - Rect.Left) div Item.Count;
mfg Bossi |
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:
[/edit]
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] 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] |
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 20:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz