Ich glaube ich habe die Ursache gefunden. In
TCustomListBox.CreateParams wird das CS_HREDRAW nur bei Rechts-nach-Links Schreibweise gesetzt. Damit erfolgt bei einer Breitenänderung kein Neuzeichnen des gesamten Fensters, sondern nur des neu hinzugekommenen Bereichs. Zeichenbefehle außerhalb werden von Windows dann einfach ausgeblendet.
Abhilfe schafft eine Interposer-Klasse, deren Deklaration im Scope zwischen
Vcl.StdCtrls und der TListBox im Form liegen muss:
Delphi-Quellcode:
type
TListBox =
class(
Vcl.StdCtrls.TListBox)
protected
procedure CreateParams(
var Params: TCreateParams);
override;
end;
...
procedure TListBox.CreateParams(
var Params: TCreateParams);
begin
inherited;
Params.WindowClass.style := Params.WindowClass.style
or CS_HREDRAW;
end;
Übrigens konnte ich dieses Verhalten mindestens ab Delphi 5 finden (darunter kann ich hier nicht prüfen). Es handelt sich also wahrlich nicht um irgendeine neue Optimierung.