AGB  ·  Datenschutz  ·  Impressum  







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

Label in Schleife zeichnen lassen

Ein Thema von Gruber_Hans_12345 · begonnen am 23. Mär 2022 · letzter Beitrag vom 25. Mär 2022
Antwort Antwort
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.441 Beiträge
 
Delphi 2007 Professional
 
#1

Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 08:59
Eine kurze frage:

Ich habe eine Schleife die von 1 bis 1.000.000 zählt.
Nun möchte ich möglichst schnell in der Schleife ein Label aktualisieren - deswegen habe ich KEIN Application.Processmessages drinnen (dauert zu lange)

wollte es einfach mit:
Delphi-Quellcode:
Label1.Caption := IntToStr(i);
TCrackedLabel(Label1).Paint;
Das Label ist nicht transparent.
Problem ist, das es flackert bzw teilweise nur der clBtnFace hintergrund zu sehen ist, also der Text gar nicht.

Wie wenn im Hintergrund wer noch mal drüber zeichnet, oder wie wenn der Text erst verzögert gezeichnet werden würde.

Habe selbiges auch mal getestet das ich den Text selber auf den Canvas zeichne, das hat auch nicht funktioniert.

Wer könnte mir da noch dazwischenfunken?
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.869 Beiträge
 
Delphi 12 Athens
 
#2

AW: Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 09:10
Das Problem ist, dass es nicht anders geht, als auch den Hintergrund neu zu zeichnen. Denn der neue Text deckt ja nicht unbedingt den alten komplett ab. Normalerweise kann man Flackern vermindern, indem man das Neuzeichnen zeitweise unterbindet. Bei so schnellen Aktualisierungen hilft das aber auch nicht.

Ein TStaticText sollte weniger flackern.

Sinnvoller ist aber eine bessere Lösung:
So schnell kann das doch ohnehin niemand wahrnehmen. Sinnvoller ist daher, dass du die Aktualisierungen nicht bei jedem Durchlauf machst, sondern nur z.B. alle x Durchläufe oder alle x Millisekunden. Das reduziert effektiv das Flackern und verringert zudem den Aufwand für das Neuzeichnen, weshalb der Ablauf selbst beschleunigt wird.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.441 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 09:14
Ja das wäre mir schon klar, deswegen habe ich das Label auf Transparent := FALSE gesetzt, dadurch zeichnet das Label ja voher den Hintergrund auf clBtnFace.

Zweitens ich habe es schon das ich nur alle 20ms mal zeichne.

Aber trotzdem passiert es bei mir dann, das ich teilweise dann für ne sekunde oder so nur den hintergrund sehe also alles clBtnFace ist, und KEIN text, öfters blinkt dann der Text mal auf.
Wie wenn der Text nicht gleich gezeichnet wird

Werde aber auf jeden Fall auf static Text umstellen
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.441 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 09:16
Was mir auch komisch vorkommt.
Wenn ich es mit dem Debuger durchgehe, und nebenbei das Fenster sehe.

Dann sehe ich das wenn er den FillRect macht, ist der Text im Fenster weg (logisch)
Aber nach dem DrawText, sieht man im Fenster noch nix.
Erst wenn er das nächste mal wieder zum FillRect kommt im Debugger, dann sehe ich im Fenster das nun der alte Text da steht.
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 10:41
Hallo,
1 bis 1.000.000 zählt.

Willst Du jetzt 1.000.000 neu zeichnen.
Macht für mich keinen Sinn.

Besser z.B. in bestimmten Zeitpunkten (hier alle 1000)

Delphi-Quellcode:
if (i mod 1000)=0 then
begin
  Label.Caption:= 'bla';
  Application.ProcessMessages;
end;
Heiko
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.441 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Label in Schleife zeichnen lassen

  Alt 23. Mär 2022, 10:45
nein, ich zeichne nur alle 20ms sowas
Delphi-Quellcode:
if (fLastRepaint = 0) or (fRepaintEvery = 0) or (GetTickCount > fLastRepaint+fRepaintEvery) then begin
  fLastRepaint := GetTickCount;
  Label1.Paint;
end;
aber ich will eben keine ProcessMessages, sondenr nur das .paint
Gruss Hans

2B or not 2B, that is FF
  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 02:32 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 by Thomas Breitkreuz