Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   eigenartiges Verhalten von tlabel u. a. in for - to Schleifen (https://www.delphipraxis.net/160781-eigenartiges-verhalten-von-tlabel-u-schleifen.html)

DrUArn 31. Mai 2011 16:02

Delphi-Version: XE

eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Hallo,

habe bisher immer 'mal beim Testen tlabels u.a. genutzt, um
Variablenänderungenzu beobachten (bisher in Turbodelphi), z.B.


Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  I: Integer;
begin
for I := 0 to 10 do
 begin
    caption:=inttostr(i);
    Button2.Caption:=inttostr(i);
    edit1.text:=inttostr(i);
    label1.Caption:=inttostr(i);
    RichEdit1.Lines.Add(inttostr(i));
    sleep(250);
 end;
end;
Jetzt beobachte ich, daß tform.caption und Button2.Caption die i's alle darstellen, bei den anderen wird nur i= 10 dargestellt - also das Ende der Schleife. Zwischendurch erfolgt keine Neudarstellung.
Manchmal -insbesonder wenn ich tbutton benutze, kommt kurzfritig - "Das programm antwortet nicht" - mag aber an sleep liegen!

Weiß jemand, woran das liegt - irgendeine Delphi- oder Windows-Optimierung (Windows 7 64 bit) ? Muß man eine Neudarstellung erzwingen?

Mit gespannten Grüßen
Uwe

mkinzler 31. Mai 2011 16:04

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Erzwinge ein Neuzeichnen bzw. gib dem Formular die Chance

Delphi-Quellcode:
Application.ProcessMessages;

Bjoerk 31. Mai 2011 16:07

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
in die Schleife vor Sleep:

Delphi-Quellcode:
Application.ProcessMessages;
// Edit: Moderator war schneller

DrUArn 31. Mai 2011 16:13

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Das ist es,
mir war dieser Befehl entfallen!

danke , Bjoerk und Markus Kinzler!

Warum geht das ohne Application.ProcessMessages bei einigen "Darstellern", bei anderen nicht?

Es ist mir auch schon passiert aus einem trichedit.onchange - jeder tastenclick solte im Tlabel etwas darstellen - da wurde nur das erste Klicken bearbeitet und dann kein weiteres!

MfG
Uwe

mkinzler 31. Mai 2011 16:14

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Es wird keine Rechenzeit an den "zeichenen" Prozess abgegeben

wicht 31. Mai 2011 16:16

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Zitat:

Warum geht das ohne Application.ProcessMessages bei einigen "Darstellern", bei anderen nicht?
Bei welchen Komponenten funktioniert das denn? Weißt du ungefähr, wie das Messaging-System funktioniert/was ProcessMessages() tut? Ich konnte noch nie beobachten, dass das ohne klappt (in einer Situation wie von dir beschrieben).

DrUArn 31. Mai 2011 16:21

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Danke Markus,
verstehe ich - dann muß den Knecht eben zwingen!

Klappt aber auch nicht immer - benutzt man in einem etwas umfangreicheren Programm obiges Konstrukt, erweist sich tlabel als am stursten - will sich nicht neu darstellen, auch wenn man sofort nach der string-Zuordnung zu caption ein application.processmessages auslöst!

Hier beim Testen funktionierte es (siehe mein Delphi-Beispiel) in tform.caption und tbutton.caption (da nicht immer) ohne application.processmessages! - Wie dieses Messaging funktioniert, weiß ich auch nicht!

Danke für's mitdenken
Uwe

mkinzler 31. Mai 2011 16:30

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Das Fenter ( Ein Control ist unter Windows ein fenster) bekommt eine Nachricht gesendet, dass es sich neu Zeichnen soll.
Delphi-Quellcode:
Application.ProcessMessages;
sogt dafür, dass alle untergeordneten "Fenster" ihre "Messages" abarbeiten.

himitsu 31. Mai 2011 18:00

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Einige Komponenten zeichnen sich bei jeder Kleinigkeit neu, was schonmal ganz schön Zeit fressen kann, wenn man Mehreres ändert.

TLabel sendet sich nur eine Nachricht "zeichne dich mal neu", welcher immer nur einmal in der Nachrichtenschlange landet.
Somit wird das Label quasi nur neu gezeichnet, wenn sich Form das nächtes Mal reagiert und alle bisherigen Nachrichten verarbeitet hat.
PS: Das TLabel kennt noch die Methoden Refresh und Repaint, um sich sofort neu zu zeichnen.

DrUArn 1. Jun 2011 10:08

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Zitat:

Zitat von himitsu (Beitrag 1103977)
Einige Komponenten zeichnen sich bei jeder Kleinigkeit neu, was schonmal ganz schön Zeit fressen kann, wenn man Mehreres ändert.
PS: Das TLabel kennt noch die Methoden Refresh und Repaint, um sich sofort neu zu zeichnen.


Hallo, in scheinbar rechenaufwändigen Programmen läßt sich als einziges tlabel von den genannten nicht einmal durch direktes Aufrufen von refresh oder repaint zu einer Neudarstellung vor Ende der Schleife zwingen!

Gruß Uwe

mkinzler 1. Jun 2011 10:11

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Zitat:

Hallo, in scheinbar rechenaufwändigen Programmen läßt sich als einziges tlabel von den genannten nicht einmal durch direktes Aufrufen von refresh oder repaint zu einer Neudarstellung vor Ende der Schleife zwingen!
Dann wird aber auch nur ein Message an das Control gesendet.

Sir Rufo 1. Jun 2011 10:31

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
Zitat:

Zitat von DrUArn (Beitrag 1104069)
Zitat:

Zitat von himitsu (Beitrag 1103977)
Einige Komponenten zeichnen sich bei jeder Kleinigkeit neu, was schonmal ganz schön Zeit fressen kann, wenn man Mehreres ändert.
PS: Das TLabel kennt noch die Methoden Refresh und Repaint, um sich sofort neu zu zeichnen.


Hallo, in scheinbar rechenaufwändigen Programmen läßt sich als einziges tlabel von den genannten nicht einmal durch direktes Aufrufen von refresh oder repaint zu einer Neudarstellung vor Ende der Schleife zwingen!

Gruß Uwe

Darum packt man sowas rechenaufwändiges in einen Thread und schon ist die Anzeige schick ;)

himitsu 1. Jun 2011 11:19

AW: eigenartiges Verhalten von tlabel u. a. in for - to Schleifen
 
@DrUArn: Hab mal nachgesehn und teilweise hast du Recht.

@mkinzler: Stimmt ebenfalls nur halb.

@Sir Rufo: Recht hast du.


Wenn das Label nicht transparent ist, dann zeichnet es sich komplett selber und beim Repaint zeichenet es sich sofort.

Idt das Label dageben transparent, schickt es dem Parent eine Nachricht, daß dieses sich neu zeichnen soll und wenn das geschieht, dann malt sich das Label dann wieder über alles drüber.
Denn es kennt die Hintergrundfarbe nicht, bzw. es weiß nicht vielleicht ob ein Bild dahinterliegt und kann demnach seinen Hintergrund nicht zeichnen, da es nicht sein Hintergrund ist.

Label ist ein Spezialfall, denn es ist kein WinControl, sondern eine delphieigene Komponente, ohne eigener Zeichenfläche ... es zeichnet sich immer nur auf dem Canvas des Parents.
Das echte WinControl, welches einem Label entspricht, wäre das TStaticText, welches dem Label (STATIC) von Windows entspricht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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