Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie kann man Doublebuffered überschreiben (https://www.delphipraxis.net/54603-wie-kann-man-doublebuffered-ueberschreiben.html)

SirThornberry 7. Okt 2005 13:42


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.

Dax 7. Okt 2005 13:51

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 ;)

DerDan 7. Okt 2005 14:41

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

SirThornberry 7. Okt 2005 16:19

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.

teebee 7. Okt 2005 16:34

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

mirage228 7. Okt 2005 16:37

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

SirThornberry 7. Okt 2005 16:42

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:
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;
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.

omata 7. Okt 2005 19:09

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:
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;
Bei einem Cast
Delphi-Quellcode:
TWinControl(MyForm).DoubleBuffered:=true;
wird bei einem Auslesen gleich wieder auf false umgeschaltet.

Vielleicht ist das ja auch alles blödsinn... oder hilft es?

MfG
Thorsten

SirThornberry 7. Okt 2005 22:49

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 00:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz