AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Flackern eines Label/TLabel verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

Flackern eines Label/TLabel verhindern

Ein Thema von MisterIXI · begonnen am 12. Sep 2015 · letzter Beitrag vom 14. Sep 2015
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 13:32
Wie siehts aus, wenn du statt eines Labels die PaintBox verwendest und dann diesen Trick nutzt:
http://www.delphipraxis.net/1315249-post2.html
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 15:13
Bei mir XE7, WIN8.1 flackert nichts.
Vielleicht liegt es daran, dass neuere WIN-Versionen die Desktop-Grafik anders behandelt.

Timer.interval:= 50;
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label2.Caption:= FormatDateTime('hh:nn:ss.zzz', Now);
end;
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#3

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 16:05
Hallo MisterIXI,

ich hatte/habe das gleiche Problem. Bei mir ist es die Ausgabe eines Video-Timecodes (Aktualisierungsinterval 16,66... bis 41,66... ms). Statt TLabel besser TPanel oder TStaticText verwenden. Auf jedenfalls eine Klasse welche von TWinControl stammt. Grund alles was nur von TControl und nicht von TWinConrol stammt wird vom Parent gezeichnet. Dort lassen sich Flackereffekte nur schwer abstellen. Vermutlich wirst du dir eine eigene Klasse (wie ich) bauen müssen. Dabei auf WM_ERASEBKGND achten.

einbeliebigername.
  Mit Zitat antworten Zitat
MisterIXI

Registriert seit: 4. Jun 2015
15 Beiträge
 
Delphi 7 Personal
 
#4

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 23:41
Wie siehts aus, wenn du statt eines Labels die PaintBox verwendest und dann diesen Trick nutzt:
http://www.delphipraxis.net/1315249-post2.html
Wenn ich das ganze richtig verstanden und implementiert habe, dann scheint das wohl auch nicht wirklich zu klappen... Es scheint ein kleines bisschen besser geworden zu sein, aber da bin ich mir auch nicht sicher


ich hatte/habe das gleiche Problem. Bei mir ist es die Ausgabe eines Video-Timecodes (Aktualisierungsinterval 16,66... bis 41,66... ms). Statt TLabel besser TPanel oder TStaticText verwenden. Auf jedenfalls eine Klasse welche von TWinControl stammt. Grund alles was nur von TControl und nicht von TWinConrol stammt wird vom Parent gezeichnet. Dort lassen sich Flackereffekte nur schwer abstellen. Vermutlich wirst du dir eine eigene Klasse (wie ich) bauen müssen. Dabei auf WM_ERASEBKGND achten.
Hört sich für mich ähnlich zu der Antwort von Zacher an. (Ich muss dazu sagen, dass ich davor noch nie wirklich mit Klassen im Programmieren zu tun hatte :< )

Effektiv habe ich zum testen ein Panel hinzugefügt, und ein PaintBox objekt reingesetzt. Den Timer entsprechend umgeschrieben und noch folgenden Code implementiert (vom Link der Lösung von Zacher):
Code:
type
  TPanel = class(ExtCtrls.TPanel)
    procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
    end;
  TForm1 = class(TForm)
Code:
 procedure TPanel.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
  Message.Result := 0;
end;
wobei ich diesen Wert auch auf 1 gesetzt habe und es hat wohl ein bisschen besser funktioniert (?).
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#5

AW: Flackern eines Label/TLabel verhindern

  Alt 13. Sep 2015, 19:42
Hört sich für mich ähnlich zu der Antwort von Zacher an. (Ich muss dazu sagen, dass ich davor noch nie wirklich mit Klassen im Programmieren zu tun hatte :< )
Da hast du mich nicht vollständig verstanden. Die Lösung von Zacher ist ein TControl auf ein TWinControl gelegt. Das TControl bekommt ständig neuen Text und animiert das TWinControl sich neuzuzeichnen.

Hast du mal TStaticText ausprobiert? Oder wenn du unter dem Label/PaintBox aktuell ein Panel hast, schmeiße das Label/die PaintBox weg und setzt die Caption vom Panel. Beim Panel (auch das Panel unter dem Anzeigeelement) mit FullRepaint und ParentBackground experimentieren.

Effektiv habe ich zum testen ein Panel hinzugefügt, und ein PaintBox objekt reingesetzt. Den Timer entsprechend umgeschrieben und noch folgenden Code implementiert (vom Link der Lösung von Zacher):
Code:
type
  TPanel = class(ExtCtrls.TPanel)
    procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
    end;
  TForm1 = class(TForm)
Code:
 procedure TPanel.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
  Message.Result := 0;
end;
wobei ich diesen Wert auch auf 1 gesetzt habe und es hat wohl ein bisschen besser funktioniert (?).
Zum Testen kannst du das so machen, aber besser ist es ein eigene Panel-Klasse zu bauen, diese zu registrieren und im Formulardesigner dann die zu nehmen. Es sollte aber laut meinem Verständnis der Windows-Doku http://msdn.microsoft.com/en-us/libr...55(VS.85).aspx Message.Result := 1; sein, damit Windows nicht selbst den Hintergrund löscht/zeichnet.

einbeliebigername.
  Mit Zitat antworten Zitat
MisterIXI

Registriert seit: 4. Jun 2015
15 Beiträge
 
Delphi 7 Personal
 
#6

AW: Flackern eines Label/TLabel verhindern

  Alt 13. Sep 2015, 21:15
Hast du mal TStaticText ausprobiert? Oder wenn du unter dem Label/PaintBox aktuell ein Panel hast, schmeiße das Label/die PaintBox weg und setzt die Caption vom Panel. Beim Panel (auch das Panel unter dem Anzeigeelement) mit FullRepaint und ParentBackground experimentieren.
Ja TStaticText hatte ich jetzt die längste Zeit (hatte einmal direkt das Label mit StaticText ersetzt)... ParentBackground hatte ich ebenfals getestet.
FullRepaint habe ich grade mal auf false bzw true gesetzt, hat auch nichts geändert


Zum Testen kannst du das so machen, aber besser ist es ein eigene Panel-Klasse zu bauen, diese zu registrieren und im Formulardesigner dann die zu nehmen. Es sollte aber laut meinem Verständnis der Windows-Doku http://msdn.microsoft.com/en-us/libr...55(VS.85).aspx Message.Result := 1; sein, damit Windows nicht selbst den Hintergrund löscht/zeichnet.

einbeliebigername.
Würde es einen Unterschied machen eine eigene Panel-Klasse zu bauen? (Ich habe bis jetzt 0 mit selbstgebauten Klassen zu tun gehabt - bzw habe ich auch sonst noch nichts darüber gelernt :> )
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.490 Beiträge
 
Delphi 12 Athens
 
#7

AW: Flackern eines Label/TLabel verhindern

  Alt 14. Sep 2015, 09:15
Würde es einen Unterschied machen eine eigene Panel-Klasse zu bauen? (Ich habe bis jetzt 0 mit selbstgebauten Klassen zu tun gehabt - bzw habe ich auch sonst noch nichts darüber gelernt :> )
Nein, nur das du bereits in der Entwicklungsumgebung die entsprechende Klasse auswählen kannst.

Das Problem mit dem Flackern entsteht vermutlich durch die getrennten Zeichenvorgänge für den Hintergrund ( WM_ERASEBKGND ) und dem Vordergrund ( WM_PAINT ).
Zeichnet man den Hintergrund bei WM_ERASEBKGND nicht, muss man das aber bei WM_PAINT nachholen. Diverse Transparent-Effekte funktionieren so aber nicht mehr richtig.
Deshalb löst man dieses Problem besser mit "Doppelbuffered := True", allerdings muss das vermutlich bei allen Wincontrols angeschalten werden, die unter dem Label liegen.
(angefangen beim Formular, über alle verschachtelten Panels)

Die Kombination mit Windows-Themen ist nicht möglich, da diese die Steuerelemente selbst zeichnen.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 15:49 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