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 2  1 2      
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.062 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
skoschke

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

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
TiGü

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

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 13:36

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...
Ich verstehe immer nicht, warum es vielen so schwer fällt ein kleines Programm mit den minimal notwendigen Inhalten zu erstellen.
Kein Hexenwerk: File -> New -> VCL Forms Application
Dann die notwendigen Teile deines bisherigen Quelltextes reinkopieren, kompilieren, kurz testen, ob das Problem daran reproduziert werden kann und hochladen.

Das hätte dich schon viel weiter gebracht, anstatt dir den esoterischen Lösungsvorschlag von Stahli erläutern zu lassen.
  Mit Zitat antworten Zitat
skoschke

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

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 13:48
Wenn das mit dem kleinen Beispielprojekt so einfach wäre...

Im Original stecken etliche eigene Controls sowie Fremdkomponenten drin, da ein Miniprojekt basteln was Panels verschiebt, bringt mich da wenig weiter!
Und wenn ich es mit den Fremdkomponenten baue kann es niemand compilieren.

Das Projekt, bei dem es jetzt klemmt, ist reiner Source bereits 2MB groß!

Ciao
Stefan
  Mit Zitat antworten Zitat
TiGü

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

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 14:03
Aha, also flackern nicht die VCL-Standard-Controls wie Panel, Button, Label und Edit beim verschieben, sondern die externen Fremdkomponenten.
Ist das so richtig?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

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

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 15:55
Das hätte dich schon viel weiter gebracht, anstatt dir den esoterischen Lösungsvorschlag von Stahli erläutern zu lassen.
Es war ca. 2012/13, als ich das so umgesetzt hatte.
Details weiß ich jetzt so genau nicht mehr, aber es war nicht so einfach, Controls und Graphik drum herum nahtlos darzustellen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
746 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Wieder mal das leidige Thema "Flackern"

  Alt 28. Aug 2019, 23:13
Wenn du das nicht mit FireMonkey programmieren willst/kannst, dann lade doch mal Graphics32 runter und verwende Layers.

Ein gutes Beispiel findest du unter:
Graphics32\Examples\Vcl\Layers\Sprites_Ex


Du kannst BitMaps (inkl. Transparenz, also ARGB) definieren, und die Z-Order festlegen.

Wenn du die Dinger dann rumschiebst, gibst du lediglich die neuen Koordinaten der Bitmaps an.

Das Ganze läuft ruckelfrei und schnell.
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

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
 
#10

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
Antwort Antwort
Seite 1 von 2  1 2      


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 01:16 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