Hallo Mal wieder, zu später Stunde wird man von Delphi/Windows wieder in den Wahnsinn getrieben.
Man nehme zwei TListBox und fülle Sie mit einigen Einträgen, die Schriftgröße (zum Besseren nachvollziehen) auf 36.
Beide nebeneinander so ca. 400 * 600 Pixel jeweils.
Bei der zweiten TListBox Style := lbOwnerDrawFixed (und bei OnDrawItem soetwas wie) <-- kann auch leer sein
Delphi-Quellcode:
procedure TTerminListBox.TerminListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
re: TRect;
begin
if Index < 0 then exit;
if Index >= Count then Exit;
with (Control as TListBox).Canvas do begin
re := Rect;
FillRect(re);
re.Left := re.Left + 5;
re.Top := re.Top + 5;
re.Bottom := re.Bottom - 5;
re.Right := re.Right - 5;
if pos('OK', (Control as TListBox).Items[Index]) > 0 then begin
Brush.Color := clLime;
brush.Style := bsFDiagonal;
FillRect(re);
end else if pos('Fehler', (Control as TListBox).Items[Index]) > 0 then begin
Brush.Color := clRed;
Brush.Style := bsVertical;
FillRect(re);
end else begin
Brush.Color := clBtnFace;
FillRect(re);
Rectangle(re.Left, re.Top, re.Right, re.Bottom);
end;
Brush.Style := bsClear;
Font.Color := clBlack;
TextOut(re.Left + 3, Re.Top + 0, (Control as TListBox).Items[Index]);
end;
Programm starten, schauen ob die zweite Box auch wirklich OwnerDraw benutzt, dann bei jeweils beiden TListBoxen die linke Maustaste gedrückt halten und die Maus mal Hoch und Runter bewegen. Die Selektion folgt nun dem Cursor. Soweit OK.
Sobald man allerdings mit der Maus über die Oberkante der TListBox kommt, flimmert und flackert bei der OwnerDraw-ListBox der erste Eintrag wie verrückt. Bei der "Normalen" kein Problem.
Woran liegt das?
Es wird dauernd die WindowsMessage WM_Paint / CN_DRAWITEM aufgerufen die dann entsprechend auch OnDrawItem aufruft. Wieso Windows mir dauernd WM_Paint / CN_DRAWITEM sendet konnte ich auch nach mehreren Stunden untersuchen der Vorfahren von TListBox nicht herausfinden.
Kann mir jemand einen Tip dazu geben?
Wenn jemand die Lösung hat, bitte vielleicht auch noch einen Tip, wie man als Normalsterblicher die Ursache dafür rausfindet ("Wie kann ich den Fehler eingrenzen?").
Danke soweit.
Windows XP mit Delphi 2010. Falls der o.g. Effekt bei Euch nicht auftritt, bitte hier posten.