AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie kann man Doublebuffered überschreiben

Wie kann man Doublebuffered überschreiben

Ein Thema von SirThornberry · begonnen am 7. Okt 2005 · letzter Beitrag vom 7. Okt 2005
Antwort Antwort
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#1

Wie kann man Doublebuffered überschreiben

  Alt 7. Okt 2005, 13:42
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Wie kann man Doublebuffered überschreiben

  Alt 7. Okt 2005, 13:51
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
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#3

Re: Wie kann man Doublebuffered überschreiben

  Alt 7. Okt 2005, 14:41
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
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Wie kann man Doublebuffered überschreiben

  Alt 7. Okt 2005, 16:19
@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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#5

Re: Wie kann man Doublebuffered überschreiben

  Alt 7. Okt 2005, 16:34
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
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Wie kann man Doublebuffered überschreiben

  Alt 7. Okt 2005, 16:37
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Wie kann man Doublebuffered überschreiben

  Alt 7. Okt 2005, 16:42
@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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Wie kann man Doublebuffered überschreiben

  Alt 7. Okt 2005, 19:09
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
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Wie kann man Doublebuffered überschreiben

  Alt 7. Okt 2005, 22:49
@omata: Das ist die bisher beste Lösung find ich. Ich danke dir, so werd ichs vermutlich machen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf