AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wieder mal das leidige Thema "Flackern"

Ein Thema von skoschke · begonnen am 28. Aug 2019 · letzter Beitrag vom 1. Sep 2019
Antwort Antwort
Seite 1 von 3  1 23      
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#1

Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 09:18
Hallo,

in einen "Designer"-Programm muss ich einen Hintergrund sowie mehrere Linien und Bitmaps zeichnen, die mit der Maus bewegt werden können.
Nach vielen Versuchen bin ich nun zu einer Paintbox gekommen, in deren OnPaint nur

Delphi-Quellcode:
  BitBlt(Paintbox1.Canvas.Handle, 0, 0, offscreenbitmap.Width, offscreenbitmap.Height, offscreenbitmap.Canvas.Handle, 0,
    0, SRCCOPY);
steht.
Das ganze Zeichnen passiert in die offscreenbitmap beim Mousemove (hier testweise nur ein bildfüllendes Hintergrundbild, eine Linie und eine kleine Bitmap:

Delphi-Quellcode:
  //die Offscreenbitmap ist global vorhanden
  if ssLeft in Shift then
  begin
    lx := X;
    ly := Y;
    // Offscreen Bitmap bemalen
    r.Width := Paintbox1.Width;
    r.Height := Paintbox1.Height;
    //das Hintergrundbild
    offscreenbitmap.Canvas.StretchDraw(r, fbitmap1);
    //eine Linie
    offscreenbitmap.Canvas.MoveTo(0, Mouse.y);
    offscreenbitmap.Canvas.LineTo(Paintbox1.Width, Mouse.y);
    r.Left := Mouse.x;
    r.Top := Mouse.y;
    r.Width := 150;
    r.Height := 100;
    //das kleine Bitmap
    offscreenbitmap.Canvas.StretchDraw(r, fbitmap2);
    Paintbox1.Invalidate;
  end;
Das Ganze funktioniert zwar, flackert aber trotzdem entsetzlich, doublebuffered ist auf true gesetzt.

Ich vermute es liegt an der Größe (bildschirmfüllend) des Offscreenbitmaps, wie bekomme ich das Flackern weg???

Ciao
Stefan
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 09:24
Jetzt ein gezipptes und minimales Formular-Projekt zum runterladen und dir wird geholfen.
Denn in 9 von 10 Fällen ist das Problem genau in der Codezeile, die du uns nicht zeigst.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#3

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 09:27
DoubleBuffered ist hier eher schädlich, da du ja selbst bereits das Bitmap offline zeichnest und dann per BitBlt auf den Bildschirm bringst. Wenn das noch DoubleBuffered ausgeführt wird, ist das doch doppelt gemoppelt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
KarstenK

Registriert seit: 4. Dez 2007
Ort: Bärenthal
29 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 10:07
DoubleBuffered ist hier eher schädlich, da du ja selbst bereits das Bitmap offline zeichnest und dann per BitBlt auf den Bildschirm bringst. Wenn das noch DoubleBuffered ausgeführt wird, ist das doch doppelt gemoppelt.
DoubleBuffered hilft hier (Zumindest noch Unter Delphi 2009). Soweit ich mich erinnere die Paintbox löscht/überschreibt mit einer Farbe ihre Zeichenfläche erst und ruft dann onpaint erst auf.

Alternative wenn ohne doublebuffered und das Bitmap die ganze Fläche ausfüllt, eine eigene Componente von der Paintbox ableiten ohne löschen des Hintergrundes.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 10:14
Ich habe mal eigene "Controls" in einem Thread berechnen und auf einem Bitmap zeichnen lassen.
Die Ausgabe erfolgte dann synchronisiert im Mainthread durch kopieren des Bitmaps auf den Formularcanvas. Vom Mainthread aus wurden dann die Maus- und Tastaturereignisse auch wieder nur in den "Controls-Thread" gegeben.

Wie das aussah kannst Du hier sehen: https://www.delphipraxis.net/1294946-post59.html
Rappelschnell.

Leider habe ich die Quellen nicht mehr. Könnte mich gerade selbst in den A... beißen, weil ich damit gern noch etwas testen würde...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (28. Aug 2019 um 10:17 Uhr)
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 11:02
Hallo Stahli,

ich habe mir die Exe mal angesehen, absolute Supersahne!

Im Prinzip geht es bei mir genau darum, ich erzeuge eigene Panels (von TPanel abgeleitet) und platziere die per Maus auf einem Hauptpanel mit einem TImage als Hintergrund.

Jetzt soll man diese per Maus anfassen und verschieben können.
Das flackerte entsetzlich (besonders wenn diese eigenen Panels Images enthalten) so daß ich dachte, ich mach einen Screenshot des gesamten Fensters und schiebe darin wiederum Bilder der Panels...

Bei Dir sieht es aber aus als ob dort Controls flackerfrei im Formular "rumtanzen", ist das richtig?

Wenn Du leider den Code nicht mehr hast, hast Du noch ein paar Denkanstöße zur Realisierung für mich?

Ich habe in Deinem Gesamtthread aber leider jetzt gesehen, dass es um FMX geht, ich muß (leider) ein VCL-Projekt erstellen!

Ciao
Stefan

Geändert von skoschke (28. Aug 2019 um 11:08 Uhr)
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 11:26
Jetzt ein gezipptes und minimales Formular-Projekt zum runterladen und dir wird geholfen.
Denn in 9 von 10 Fällen ist das Problem genau in der Codezeile, die du uns nicht zeigst.
Siehe meine Antwort an Stahli, eigentlich möchte ich Controls flackerfrei bewegen können, der Umweg über die Paintbox war ein Ansatz das zu umgehen...

Ciao
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 11:28
Danke für das Lob.

Das ist rein VCL (quasi ein Versuch mal FMX-Light (sehr, sehr light ) umzusetzen.)

Es sind keine Controls, sie sollten sich nur so anfühlen.


Das funktioniert so:

Im "Control-Thread":
- Bitmap füllen mit Hintergrundfarbe.
- Pro "Control" Rechteck zeichnen (mit oder ohne Hintergrund, Rahmen, Text)
- Pro Control Z-Order und Positionen merken.
- evtl. 1 focussiertes Control merken.
- Bitmap an Mainthread übergeben

Im Mainthread:
- Bitmap auf Canvas kopieren
- Maus- und Tastaturereignise an den "Control-Thread" übergeben

Im "Control-Thread":
- Maus- und Tatsaturereignisse verarbeiten und z.B. Control-Positionen ändern.
- wieder zeichnen


Das Formular ist in dem Fall nur eine Zeichenfläche und Eingabeschnittstelle.


Wenn Bei Dir von der Bedienung her grundsätzlich alles schon in einer Paintbox funktioniert (abgesehen vom Flackern) und Du mit Threads umgehen kannst, dann sollte sich das bei Dir auch so realisieren lassen.

Die Maus- und Tastaturereignisse habe ich in Ques an den Thread übergeben und das Bitmap dann einfach synchronisiert an den Mainthread.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
skoschke

Registriert seit: 6. Jan 2009
523 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 12:30
Hallo,

danke für die Hinweise, da kann ich schon mal ansetzen.
Ein Problem, was ich dabei aber habe, ist, dass ich sozusagen die Inhalte der zu bewegenden Panels brauche um sie in die Bitmap zu kopieren.
Die zu bewegenden Panels können Texte, Images, etc. enthalten, ich brauchte dabei dann eben einen "Screenshot der Panels"...

Hast Du noch dazu eine Idee?

Ciao
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli
Online

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 13:09
Nein, leider nicht.

Wenn es JETZT läuft kannst Du da auch nicht sicher sein, dass es auf dem nächsten Windows oder mit dem nächsten Delphi noch läuft.

So eine Mischung kann halt immer Probleme machen weil Du nicht immer im Detail beeinflussen kannst, wann welche Teile vom System gezeichnet werden...


Aber warte mal....


Ich hatte da doch mal so etwas wie ein Raster....


Such mal in den 3 Threads nach "Raster"...
https://www.delphipraxis.net/184641-...e-basteln.html
https://www.delphipraxis.net/124761-...scrollbox.html
https://www.delphipraxis.net/109527-...-zeichnen.html

So hatte ich das bei mir umgesetzt:
https://youtu.be/BSNroTVq9FM?list=UU...Kph7r2dP3vtu_w

Ich hatte das damals so gelöst, weil es am flüssigsten war.
Details weiß ich aber nicht mehr.
Wenn Du Interesse hast, kann ich es mal raussuchen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 09:54 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