Eine Verbesserung des Codes von marabu.
Ich habe das Projekt in Delphi 6 Personal geöffnet und war über das Ergebnis nicht sonderlich erfreut. Jedesmal, wenn ich das Form in der Größe geändert habe, waren im weißen noch Reste des vorherigen Textes. Auch ist nur die oberste Zeile eingerückt. Die zweite Zeile ist beispielsweise visuell so geblieben und wurde erst mehrzeilig sichtbar, wenn man sie anklickte.
Die Lösung: Man füge ein Invalidate ein:
Delphi-Quellcode:
// Originalcode: marabu
procedure TDemoForm.ListBoxMeasureItem(Control: TWinControl;
Index: Integer;
var Height: Integer);
var
tempCanvas: TCanvas;
notUsed: HWND;
destRect: TRect;
begin
tempCanvas := TCanvas.Create;
try
tempCanvas.Handle := GetDeviceContext(notUsed);
destRect := ListBox.ClientRect;
Height := DrawText(tempCanvas.Handle, PChar(ListBox.Items[
Index]), -1, destRect, DT_WORDBREAK);
finally
tempCanvas.Free;
end;
end;
procedure TDemoForm.ListBoxDrawItem(Control: TWinControl;
Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with Listbox.Canvas
do begin
FillRect(Rect);
DrawText(
Handle, PChar(ListBox.Items[
Index]), -1, Rect, DT_LEFT
or DT_TOP
or DT_WORDBREAK);
Invalidate;
// Hinzugefügt
end;
end;
procedure TDemoForm.FormCreate(Sender: TObject);
begin
Listbox.Style := lbOwnerDrawVariable;
end;
(Vorgeschlagen für die CodeLib)
Gruß
blackdrake