Mehr Code wird kaum nötig sein! MeasureItem wird scheinbar nur nach den Add Methoden aufgerufen und nicht vor dem Zeichnen!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); begin Caption:='Request for '+IntToStr(Index); Height:=100+Random(300); end;
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with ListBox1.Canvas do begin FillRect(Rect); TextOut(Rect.Left,Rect.Top,ListBox1.Items[Index]); end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Listbox1.Items.Add('Items.Add'); Listbox1.Items.AddObject('Items.AddObject -> Self',Self); Listbox1.Items.AddObject('Items.AddObject -> nil',nil); Listbox1.AddItem('AddItem -> Self',Self); Listbox1.AddItem('AddItem -> nil',nil); end; |
Soviel dazu. Startet man das Programm, funktioniert bei allen mit Add erstellten Items alles. Nur das bereits zur Designtime eingefügte Item wird mit der Standardhöhe dargestellt. Was jetzt lustig ist: Kommentiert man die erste Zeile in FormCreate wieder ein, so werden alle Items mit der richtigen Höhe gewzeichnet (auch das zur Designtime erstellte). Das Problem ist damit also gelöst
Hier noch etwas:
Online-Hilfe hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer);
var Bitmap: TBitmap; begin with Control as TListBox do begin Bitmap := TBitmap(Items.Objects[Index]); if Bitmap <> nilthen if Bitmap.Height > Height then Height := Bitmap.Height; end; end; | |
Man beachte, dass das im with-Block angegebene Height sich nicht auf die Variable Height bezieht, sondern auf die Listbox (da hat ein Codeschreiber nicht nachgedacht)
Also Danke für die Hilfe,
maxk
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.