![]() |
Double Buffered Bug
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Delphi 7 hat einen Bug bei der Nutzung von Double Buffered. Beispielsweise Buttons oder Checkboxes werden dann mit schwarzer Umrandung angezeigt. ![]() ![]() Daraufhin hatte jemand hier aus dem Board ein BugFix dafür geschrieben (leider ist mir der Nick entfallen), welches auch gut funktioniert. Nun hat sich allerdings rausgestellt, dass sich das Programm durch das BigFix auf manchen Rechnern nicht starten lässt, sondern nur kurz aufblitzt und sich danach direkt wieder schließt. Ein Zusammenhang zwischen den Os Versionen lässt sich nicht feststellen. Manchmal funktioniert es beispielsweise unter Windows Xp Home Service Pack 3 und manchmal unter dem gleiben Os nicht. Gneuaso taucht der Fehler auch bein Win Vista und Win7 auf. Das eingesetzte Bugfix habe ich mal angehängt. Ich hoffe jemand kann mir helfen das Problem zu lösen. Mfg Blamaster |
Re: Double Buffered Bug
Hast du DoubleBuffered auf den Button angewendet oder NUR auf die Form?
Wenn die Ausgabe gepuffert wird, dann wird diese erstmal in ein internes Bitmap gezeichnet und danach erst alles zusammen ausgegeben. Nun kennt das Bitmap des "Buttons" nicht den Hintergrund, weswegen alles "Durchsichtige" natürlich Schwarz bleibt. (leeres Bitmap = schwarz) |
Re: Double Buffered Bug
Hi,
DoubleBuffered = true ist auf das ganze Form angewendet. Mfg Blamaster |
Re: Double Buffered Bug
Hallo :
Wenn Du die Komponenten (Buttons ...) mit DoubleBuffered := True versiehst und nicht die Form, verschwindet auch der unschöne Randeffekt:
Delphi-Quellcode:
Form1.DoubleBuffered := False;
Button1.DoubleBuffered := True; |
Re: Double Buffered Bug
Hi,
das Problem ist eiegntlich das ich eine Paintbox habe auf die recht schnell geszeichnet wird und ohne das DoubleBuffered = true fängt die an zu flackern. Gibt es da eine andere lösung als das ganze Form auf DoubleBuffered = true zu setzen ? |
Re: Double Buffered Bug
Puffere selber:
Zeichne in ein Bitmap und kopiere dieses Bitmap dann auf die Paintbox. hat auch noch 'nen anderen Vorteil: Wenn du das Bitmap auch nochmal in OnPaint der PaintBox kopierst, wird das Bild nachdem es verdeckt wurde, wiederhergestellt, ohne daß du alles nochmal dort zeichnen mußt. |
Re: Double Buffered Bug
Hi,
nichts großartig anderes mache ich aber bereits:
Delphi-Quellcode:
Lädt das _WavePicture.Graphic Bild in die Paintbox.
PB.Canvas.StretchDraw(Rect(0, 0, PB.Width, PB.Height), _WavePicture.Graphic);
In einem Timer steht noch ein PB.Refresh. Trotzdem flackert ohne das DoubleBuffered = true das Bild. |
Re: Double Buffered Bug
Keiner mehr eine Idee ?
Mfg Blamaster |
Re: Double Buffered Bug
Warum ein Timer? Du bekommst doch eine Nachricht, wenn es neu gezeichnet werden muss. Les mal hier:
![]() ![]() |
Re: Double Buffered Bug
Hi,
der Timer dazu um sich ändernde Daten auf die PaintBox zu zeichnen. Der vorgang sieht also momentan so aus. 1. Timer löst Onpaint Ereignis der Paintbox auf, diese holt sich die Hintergrund Bmp und lädt sie, nun werden noch ein paar sachen auf die PaintBox mit dem bmp hintergrund gezeichnet. Mit dem dobulebuffered Theme Fix geht es ja ansich auch ganz gut, nur ebend nicht auf allen Systemen. Kann man anhand der angehängten Datei erkennen wieso das programm auf manchen System sirekt nach dem start ohne Fehlermeldung wieder schließt ? |
Re: Double Buffered Bug
Hi, keiner eine Idee mehr ?
Ich habe selber nochmal etwas probiert. Folgende Möglichkeiten: Double Buffered = false -> Programm läuft auf allen Systemen, Anzeige flackert Double Buffered = true -> Programm läuft auf allen Systemen, allerdings Anzeigefehler bei Checkboxen, Buttons, usw. im Zusammenhang mit Xp Style Double Buffered = true + Themefix aus dem Anhang im 1.Post, läuft ohne Anzeigefehler mit Xp Style, schließt sich auf manchen Systemen sofort nach dem starten automatisch. Irgendwie sind das alles keine optimalen Optionen. Was für Lösungen gibt es nun ? Lässt sich evtl. das Double Buffered nur für die Paintbox nutzen ? Ggf. auf die Graphic32 Kompos zurückgreifen die ja um einiges schneller sein solle und das Double Buffered selber übernimmt ? Fehler im Themefix beheben damit es auf allen System läuft ? Mfg Blamaster |
Re: Double Buffered Bug
Das mit dem schwarzen Rahmen liegt an ParentBackground, diese Eigenschaft muss
soweit ich mich erinnere beim Button oder wo auch immer auf False gesetzt werden. MfG Alaitoc PS: Wurde soweit ich weiß auch schon öfters im Forum unter dem Suchbegriff "DoubleBuffered" besprochen. |
Re: Double Buffered Bug
Hi,
ich hatte hier im forum schon gesucht. Allerdings will nichts so wirklich klappen. Die Paintbox ansich hat keine DoubleBuffered eigenschaft, so das ich nicht nur diese auf DoubleBuffered = true setzen kann. Die Buttons z.b. haben keine ParenBackground eigenschaft die man auf false setzen könnte. Die Paintbox auf ein Panel zu legen und das Panel auf DoubleBuffered = true zu setzen, brachte auch keinen Erfolg außer das die Paintbox flackert. Mfg Yannic |
Re: Double Buffered Bug
Zitat:
|
Re: Double Buffered Bug
Also ich glaube ParentBackground musste auf False gesetzt werden bei den Panels oder Forms wo die Buttons drauf liegen.
Zumindest habe ich keinerlei Probleme damit in meinem aktuellen Projekt. MfG Alaitoc Bsp: Hauptformular mit Panel, auf Panel liegt ein Button und Parentbackground vom Panel ist auf False. Gibt keinerlei Probleme wenn ich dann DoubleBuffered anwende. |
Re: Double Buffered Bug
@ Alitoc
Danke so hat es jetzt geklappt. @ Medium Das Problem ist nur das es das Programm so nicht hergibt ohne sich die Kompletten Daten für den Hintergrund der bmp komplett neu berechnen zu lassen. Außerdem dürfen die nachträglichen Elemente auch nicht mit gestrecht werden. Das würde so mehr Probleme produzieren als das es welche löst. Mfg Yannic |
Re: Double Buffered Bug
Du verstehst Medium falsch: er meint du sollst alles was du auf deiner Paintbox jetzt rumdüdelst, sollst du auf einem nicht angezeigten Bitmap machen und dieses danach einfach nur auf die Paintbox ausgeben...
|
Re: Double Buffered Bug
Sekunde.
Zitat:
Edit: Roter Kasten is Montags auch noch nich so fit, hm? Ich glaub der Teekeks hat recht, auch wenn ich grad nicht verstehe wie du mich verstanden hast :) Edit2: Das mit dem komplett erst "offline" (also unsichtbar) Zeichnen, und in einem Schwupps ausgeben ist übrigens auch die gängige Praxis. DoubleBuffered ist eine Krücke um dies auf einem Umweg zu erreichen. Besser gleich selber sauber bauen, spart mittelfristig einen Haufen Nerven (und Zeit). |
Re: Double Buffered Bug
Hi,
dann versuch ich mich nochmal besser auszudrücken. 1. Hintergrund wird einmal in eine Bitmap gezeichnet und dann der Paintbox übergeben. Nun sollen noch verschiedene Time Lines gezeichnet werden die sich alle 20ms über den timer ändern. Der Hintergrund soll dabei aber dennoch konstant bleiben. Nun mein Problem. Wenn ich die Timeline direkt auf das Hintergrund Bitmap zeichne, dann würde sich ja nach jedem Timerintervall die Timeline einfach ein stück weiter rechts zeichnen die vorige Timeline allerdings nicht gelöscht werden. So ergibt sich unter der Annahme die Timeline ist blau dann ein langer blauer balken. Nun ist die Frage was passiert wenn ich das Hintergrund Bitmap an die Paintbox übergebe und dann eine zweite Bitmap drüber lege und nur diese zweite Bitmap jedes mal geleert und die neue Timeline eingezeichnet wird. |
Re: Double Buffered Bug
Dann:
Grundbild wie bisher als Bitmap haben und dann noch ein weiteres wo du folgendes machst: 1. Hintergrund drauf kopieren 2. Deine Linien draufzeichnen 3. Das ganze der Paintbox übergeben. |
Re: Double Buffered Bug
Mach es bitte nicht mit so vielen Bitmaps. Alle Vektordaten (Text, Linien etc.) solltest du direkt auf das Canvas zeichnen.
Im Normalfall alles im OnPaint-Ereignis. Wenn dies nicht funktioniert, dann leite mal vom TPanel ab (dort kannst du OnPaint überschreiben) und setzt DoubleBuffered auf true (ggf. noch ParentBackground anpassen). Zum einen sparst du einiges an Speicher (6MB bei 1920x1080), Geschwindigkeit (gut sollte sich net viel tun) und hast am Schluss auch viel weniger Probleme wenn du z.B. auch Drucken willst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 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