![]() |
Wie kann man Doublebuffered überschreiben
Hallo,
folgendes Problem. Ich habe eine Komponente geschrieben bei der Doublebuffered nicht auf true gesetzt werden darf weil sonst fehlerhafte Grafikeffekte in der Komponente auftauchen. Doublebuffered ist ja nur ein property das einfach auf eine Protected Variable zugreift, somit kann ich leider keine Methode überschreiben um zu verhindern das Doublebuffered geändert wird. Wie kann man jetzt Doublebuffered "überschreiben" so das es nicht mehr auf True gesetzt werden kann? Man könnte es ja einfach neu deklarieren, aber wenn man dann die Komponente auf TWinControl castet und das Property setzt würde man das ja umgehen und ich hätte wieder das problem das doublebuffered doch auf true steht. |
Re: Wie kann man Doublebuffered überschreiben
In Delphi ist das glaube ich nicht möglich.. Wenn irgendwann mal virtuelle Properties kommen, wird es aber gehen. Bis dahin kannst du nur für deine aktuelle Komponente das überschreiben verbieten und die anderen Programmierer höflich darauf hinweisen, das casten und dann überschreiben absoluter Schwachsinn wäre ;)
|
Re: Wie kann man Doublebuffered überschreiben
Hallo
um dein Prop zu lösen, sollt man mal wissen, von welcher Komponente deine Komponete abgeleitet ist. Meist ist es so, dass wenn du z.B. TCustomEdit nimmst die meisten Property nicht veröffentlicht sind und man dann in einer abgeleitetn Klasse nur die Props veröffentlicht, die man auch haben will mfg DerDan |
Re: Wie kann man Doublebuffered überschreiben
@DerDan: das Property DoubleBuffered ist ab WinControl sichtbar, dementsprechend kann man es auch setzen. Meinem Post ist also zu entnehmen das einer der Vorfahren TWinControl ist.
|
Re: Wie kann man Doublebuffered überschreiben
Wenn ich richtig geschaut habe, wird DoubleBuffered in TWinControl nur von WMPaint, WMEraseBackground und CreateDockManager benutzt. Alle drei könntest Du überschreiben, Copy und Paste aus den VCL-Quellen, und dann so modifizieren, dass DoubleBuffered ignoriert wird. Wahlweise auch nur die Methode, von der Du weisst, dass sie für den Fehler verantwortlich ist.
Gruß, teebee |
Re: Wie kann man Doublebuffered überschreiben
Hi,
Also wenn man erst zu TWinControl casten muss, um an DoubleBuffered ranzukommen, müsstest Du ja davon ausgehen, das Benutzer explizit diesen Grafikfehler bei Dir provuzieren will. Im Normallfall dürfte daher der Schutz in der Originalklasse und ein Hinweis in der Readme oder Ähnliches reichen, solange es keine andere technische Lösung gibt. Du könntest ggf. beim Zeichnen jedoch einfach DoubleBuffered zurücksetzen, falls es gesetzt ist... mfG mirage228 |
Re: Wie kann man Doublebuffered überschreiben
@teebee: auf kopieren würde es hinaus laufen (damit der Transparenzeffekt ws_ex_transparent) ordentlich funktioniert. Allerdings gefällt mir die Lösung nicht da ich bei Updates und einer anderen Delphiversion das ganze dann anpassen muss (Denn ich hab das Gefühl das in 2 Jahren das ganze anders implementiert ist.
@mirage228: Dem ist nicht so das der Anwender etwas provizieren will. Aber wenn man das Flackern vermeiden will empfiehlt sich eine Funktion wie diese
Delphi-Quellcode:
Wenn man ein Delphiprojekt startet und die ganzen komponenten aus der DFM ausgelesen werden wird ja auch alles zu TComponent gecastet und dann der Constructor davon aufgerufen. Und ähnlich ist es in einigen unseren Programmen, da wird für alle Komponenten, TControls etc. ein bestimmtes Property gesetzt (z.B.: das Doublebuffered) und da liegt es auf der Hand das man nicht zig prodeduren schreibt sondern eben auf einen gemeinsammen Vorfahren castet um sich arbeit zu spaaren.
procedure SetDoubleBuffered(AParent: TWinControl);
var LCount: Integer; begin AParent.DoubleBuffered := True; for LCount := 0 to AParent.ControlCount - 1 do if AParent.Control[LCount] is TWinControl then SetDoubleBuffered(TWinControl(AParent.Control[LCount])); end; |
Re: Wie kann man Doublebuffered überschreiben
Moin,
ich habe mich auch mal dran versucht... Versuch doch einfach die Ereignisse zu überschreiben, in ihnen dann das FDoubleBuffered auszuschalten und dann den Originalcode starten. Ein Beispiel:
Delphi-Quellcode:
Bei einem Cast
TMyClass = class(TPanel)
private procedure WMPaint(var Message: TWMPaint); message WM_PAINT; procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND; protected public end; procedure TMyClass.WMEraseBkgnd(var Message: TWmEraseBkgnd); begin FDoubleBuffered:=false; inherited; end; procedure TMyClass.WMPaint(var Message: TWMPaint); begin FDoubleBuffered:=false; inherited; end;
Delphi-Quellcode:
wird bei einem Auslesen gleich wieder auf false umgeschaltet.
TWinControl(MyForm).DoubleBuffered:=true;
Vielleicht ist das ja auch alles blödsinn... oder hilft es? MfG Thorsten |
Re: Wie kann man Doublebuffered überschreiben
@omata: Das ist die bisher beste Lösung find ich. Ich danke dir, so werd ichs vermutlich machen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 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