[Delphi] TCombobox-Frage

Hallo !

Weiß jemand einen Trick, wie man das Listenfenster einer Combobox mehrspaltig machen kann ?

Das müßte irgendwie elegant lösbar sein, hab aber keine rechte Ahnung, wie. Als Notlösung habe ich die Erstellung einer ganz neuen Komponente in Betracht gezogen, welche eine Listbox öffnet, wenn man klickt. Owner der Listbox muß aber Screen sein, damit sie nicht von den Fenstergrenzen geklippt wird. Nur dann wird beim Aufklappen der Listbox in der Taskleiste ein neuer (namenloser) Button angezeigt…

Danke für jede Hilfe,

Jochen

Hallo !

Weiß jemand einen Trick, wie man das Listenfenster einer
Combobox mehrspaltig machen kann ?

Das ist im Prinzip relativ einfach. Du solltest den Style csOwnerDraw
setzen, dann kannst Du soviele Spalten wie du willst über
OnDrawItem realisieren.

Gruss,
Matthias Thoma

Kann man nicht. So wird immer die komplette Zeile angesprochen. Man kööönte natürlich recht aufwendig durch Ermittlung der Mauskoordianten berechnen, welche in welcher Spalte die Maus ist bzw. war, und dann bei OnMouseMove auch noch entsprechende Prüfungen und DrawCell-Aufrufe machen (falls die Maus in der selben Zeile in eine andere Spalte bewegt wird) usw…

Das ist so’n brute-force-Ansatz. Ich meine, es sollte auch eleganter gehen, da es je PER SE schon mehrspaltige Listboxen gibt. Sowas such ich.

Aber danke für deine Antwort (möglicherweise hab ich’s auch nicht richtig verstanden…)

Ich habe in der Win32-Hilfe den Listbox-Style LBS_MULTICOLUMN gefunden. Es muß also gehen, prinzipiell. Ich weiß nur nicht wie, da schweigt sich die Hilfe wehement aus. Mit SetWindowLong ? Wenn ja, brauch ich’n Handle zur Listbox. Wie bekomm ich das ???

Grüße
Jochen

Ich habe in der Win32-Hilfe den Listbox-Style LBS_MULTICOLUMN
gefunden. Es muß also gehen, prinzipiell. Ich weiß nur nicht
wie, da schweigt sich die Hilfe wehement aus. Mit
SetWindowLong ? Wenn ja, brauch ich’n Handle zur Listbox. Wie
bekomm ich das ???

An das Handle kommst du über

point : TPoint;
handle : integer;

Combobox1.DropDown:=true;
point.x:=Form1.Left+ComboBox1.Left+25;
point.y:=Form1.Top+ComboBox1.Top+ComboBox1.Height+50;
Handle:=WindowFromPoint(point);
Combobox1.DropDown:=false;

Klappt nicht :frowning:
Das Handle scheint das der Combobox selbst zu sein. Mit SetWindowPos(Handle…) z.B. läßt sich die ganze Combobox positionieren, nicht aber die Listbox.

Ein Aufruf von
SetWindowLong(Handle,GWL_Style,GetWindowLong(Handle,GWL_Style)+LBS_MULTICOLUMN)

mit einem anschließenden

SendMessage(Handle,LB_SETCOLUMNWIDTH,30,0)

hatte gar keinen Effekt.

Jochen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Klappt wohl…

Ich hab die Werte nur pi mal daumen genommen. Hier eine korrekte(re) Version:

Rect : TRect;
Handle : Integer;
Point : TPoint;

ComboBox1.DroppedDown:=true;
GetWindowRect(ComboBox1.Handle,Rect);
point.x:=Rect.Left+(ComboBox1.Width div 2);
point.y:=Rect.Bottom+10;
Handle:=WindowFromPoint(point);
SetWindowPos(Handle,HWND_TOP,100,100,1,1,SWP_NOSIZE);

Tatsächlich…
ich sollte mir die Sachen genauer anschauen. 'Tschuldigung.

Mein Problem, die Listbox auf diese Weise mehrspaltig zu machen, besteht jedoch immer noch. SetWindowPos fuzt zwar, aber die Aufrufe von

SetWindowLong(Handle,GWL_Style,GetWindowLong(Handle,GWL_Style)+LBS_Multicolumn);
SendMessage(Handle,LB_SETCOLUMNWIDTH,30,0);
SendMessage(Handle,LB_SETHORIZONTALEXTENT,400,0);

oder ähnliches hatte keinen Erfolg.

Wäre klasse, wenn mir da jemand weiterhelfen könnte.
Danke.

Jochen