![]() |
[DevExpress-HowTo] TcxListBox / TListBox flickerfrei
Da auch die TcxListBox auf TListBox aufsetzt, "leidet" auch diese Komponente an extremen Flickern, insbesondere beim Resizen z.B. eines Formulars/Frames. Auch das Aktivieren des DoubleBufferings bringt keine Besserung (btw gibt es das Problem auch in C#).
Durch Überschreiben der Prozedur CreateParams() verschwindet dieser Effekt. Dazu ist noch nicht einmal das Ableiten in eine eigene Komponente nötig, wenn man per Interception vorgeht. Dazu wird deklariert:
Delphi-Quellcode:
und implementiert:
TcxListBox = class(cxListBox.TcxListBox)
public procedure CreateParams (var Params: TCreateParams); override; end;
Delphi-Quellcode:
Das auch manchmal vorgeschlagene Attribut WS_EX_LAYERED hat bei mir einen lustigen "Freistellungs"-Effekt der Listbox bewirkt und also nicht funktioniert.
procedure TcxListBox.CreateParams(var Params: TCreateParams);
begin inherited CreateParams(Params); Params.ExStyle := Params.ExStyle or WS_EX_COMPOSITED; // or WS_EX_LAYERED; end; Diesen Code kann man auch in eine separate Unit auslagern. Dann ist darauf zu achten, dass sie in der Uses-Klausel am besten als letzte Unit eingebunden wird. Das gilt auch, wenn man so die Standard-Listbox reparieren will. HTH. |
AW: [DevExpress-HowTo] TcxListBox / TListBox flickerfrei
Mithilfe der JCL kann man das auch ohne Einbinden der Unit an korrekter Position bewerkstelligen:
Delphi-Quellcode:
uses
JclSysUtils; type TListBoxFix = class(TCustomListBox) public procedure CreateParamsFix(var Params: TCreateParams); end; procedure TListBoxFix.CreateParamsFix(var Params: TCreateParams); begin inherited CreateParams(Params); Params.ExStyle := Params.ExStyle or WS_EX_COMPOSITED; end; procedure PatchVirtualMethod(AClass: TClass; OldMethod, NewMethod: Pointer); var i: Integer; begin for i := 0 to GetVirtualMethodCount(AClass) do if GetVirtualMethod(AClass, i) = OldMethod then SetVirtualMethod(AClass, i, NewMethod); end; initialization PatchVirtualMethod(TListBox, @TListBoxFix.CreateParams, @TListBoxFix.CreateParamsFix); PatchVirtualMethod(TcxInnerListBox, @TListBoxFix.CreateParams, @TListBoxFix.CreateParamsFix); |
AW: [DevExpress-HowTo] TcxListBox / TListBox flickerfrei
Zitat:
|
AW: [DevExpress-HowTo] TcxListBox / TListBox flickerfrei
Theoretisch nicht. Du musst nur drauf achten, dass du in einem Fall wie oben noch eine Vererbungshierarchie hast, die einen "freien" Slot hat. Ansonsten musst du halt statt des inherited calls den Code aus der anderen Methode kopieren. In den neueren Delphi Versionen kannst du über class helper sogar auf private Member zugreifen - sehr nützlich, wenn du wie ebend erwähnt Code kopieren musst, der auf solche zugreift.
Ich verfolge diesen Ansatz schon eine Weile, um in DSharp diese leidigen Interceptor Klassen und die damit einhergehende zwingende Reihenfolge in der uses Klausel loszuwerden. |
AW: [DevExpress-HowTo] TcxListBox / TListBox flickerfrei
Zitat:
Zitat:
Ansonsten habe ich mit dem Austausch/Umbiegen/Korrigieren von TcxCustomInnerListBox.NeedDrawFocusRect() noch einen schönen Anwendungsfall Deiner Lösung, um den dämlichen Fokus-Rect der Listbox loszuwerden. Derzeit funktioniert es nur, indem ich der InnerlistBox eine Fake-OnDrawItem-Prozedur zuweise. Und das ist, was ich ohne Umschweife, die sich manchmal aber gar nicht, wenn nicht sogar überhaupt nicht, verhindern lassen, zugebe, nicht sehr elegant. ;) |
AW: [DevExpress-HowTo] TcxListBox / TListBox flickerfrei
Zitat:
Also im Grunde ist das nix anderes als ein runtime override. ;) |
AW: [DevExpress-HowTo] TcxListBox / TListBox flickerfrei
Zitat:
|
AW: [DevExpress-HowTo] TcxListBox / TListBox flickerfrei
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz