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

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

Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 01:15
Hallo zusammen,

EDIT: zur kurzen Erläuterung: Das Programm ist eine art Stoppuhr, die auf Millisekunde genau anzeigt. Das Label wird durch einen Timer der es relativ oft updatet. Bis jetzt war der auf 64, weil ich da auch tipps gelesen hatte bezüglich der 60Hz aktualisierungs Rate, damit es weniger zwischen zwei frames geupdated wird.

Ich habe das Problem, das ein durch einen TTimer geupdatetes Label ab und zu flackert.
Ich weiß dass es schon viele Threads dazu im Internet gibt, und ich habe mich durch sehr viele durchgewälzt, aber keine Lösung hat wirklich gefruchtet... Das Problem ist: es scheint für jeden Rechner anders zu sein, daher kann ich auch nicht gut testen.

Kurze Zusammenfassung, was ich bis jetzt probiert habe:
- statt einem Label ein TLabel benutzen
- Form1.DoubleBuffered:=true;
- TLabel1.DoubleBuffered:=true;
- Form1.ParentBackground:=false;
- XPManifest entfernt
- Timer auf 64 ms gesetzt (annäherung and updaterate(?))
- Windows Aero aktiviert/deaktiviert

und bereits ein paar Kombinationen.

Es scheint ja keine allgemeine Lösung zu geben - zumindest habe ich in keinem Thread bis jetzt eine gefunden - deswegen frage ich vorallem nach Erklärung warum das passiert; ob es da ein paar Tipps gibt es zumindest zu minimieren...

Es ist grade schon relativ spät, und genauer erklären was es für ein Programm ist, oder Quelltext zeigen kann ich ja auf Nachfrage. Das Problem müsste an sich ja einfach sein nach zu vollziehen...


Bin im Moment relativ hilflos da ich auch nicht genauer weiß wie das ganze rendering des Programms funktioniert und es wäre echt super, wenn sich eine Lösung finden würde! Aber das Program funktioniert ja an sich und das flackern ist nicht allzu schlimm...


Vielen Dank im Vorraus
und Liebe Grüße

Geändert von MisterIXI (12. Sep 2015 um 10:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 01:48
Was möchtest du denn da bauen? Ein Hochgeschwindigkeits-Label-Kino?

Wenn du ein wenig mehr Zen dort hineinbringst, dann reicht auch eine Aktualisierungrate von einer Sekunde. Das kann man dann auch noch halbwegs erkennen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.100 Beiträge
 
Delphi 12 Athens
 
#3

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 09:11
Was zeigst du denn überhaupt an ?
Ich würde auf jeden selber Fall prüfen und nur Änderungen schreiben,
und mich nicht dabei auf das Label verlassen.

Code:
if Label1.Text <> txtNeu then
begin
  Label1.Text := txtNeu;
  ...
  Label1.Repaint;
end
Kann das helfen die Changerate zu vermindern ?

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 09:38
Kann das helfen die Changerate zu vermindern ?
Nein, denn das hier passiert beim Setzen von Caption
Delphi-Quellcode:
procedure TControl.SetText(const Value: TCaption);
begin
  if GetText <> Value then // <- aha
{$IF DEFINED(CLR)}
  begin
    FText := Value;
    Perform(CM_TEXTCHANGED, 0, 0);
  end;
{$ELSE}
  SetTextBuf(PChar(Value));
{$ENDIF}
end;
Somit ist die Überprüfung einfach nur DoppelMoppel und reduziert nichts (bremst nur ein wenig)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
MisterIXI

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

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 10:12
Was möchtest du denn da bauen? Ein Hochgeschwindigkeits-Label-Kino?

Wenn du ein wenig mehr Zen dort hineinbringst, dann reicht auch eine Aktualisierungrate von einer Sekunde. Das kann man dann auch noch halbwegs erkennen.
Also ich habe einen relativ genauen Zeitmesser programmiert, der halt ansonsten ziemlich unflüssig aussehen würde.
Aber selbst auf deutlich langsameren Raten tritt das flackern ab und zu auf...

Und ich kann absolut keine Muster in dem ganzen erkennen.


Ich könnte natürlich die aktualiesieren ausbremsen und den Timer, der momentan auch Berechnungen mit der Zeit ausführt aufteilen, aber das würde halt nicht mehr so schön aussehen.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 14: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
 
#7

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 16: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
 
#8

AW: Flackern eines Label/TLabel verhindern

  Alt 12. Sep 2015, 17: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
 
#9

AW: Flackern eines Label/TLabel verhindern

  Alt 13. Sep 2015, 00: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
 
#10

AW: Flackern eines Label/TLabel verhindern

  Alt 13. Sep 2015, 20: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
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 17:33 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