![]() |
Edit-Felder bei jedem Schleifendurchlauf aktualisieren
Hallo,
vielleicht kann mir hier jemand weiterhelfen. Ich habe ein Problem mit Schleifen mal zu folgendem Beispiel vereinfacht: Auf einer Form sind - ein Button - zwei Edit-Felder - ein GaugeBar Klickt man auf den Button, werden die Schleifen ausgeführt und in den Edit-Felder sollen die Variablen iCount1 und iCount2 angezeigt werden. Desweiteren wird der Wert der while-Schleife noch durch ein GaugeBar angezeigt.
Delphi-Quellcode:
Der GaugeBar wird bei jedem Schleifendurchlauf aktualisiert, so dass der Balken richtig angezeigt wird, sich also ständig erhöht. Die Einträge der Edit -Felder werden aber erst dann angezeigt, wenn alle Schleifen fertig durchlaufen sind, so dass zum Zeitpunkt des Durchlaufs nichts angezeigt wird, dann erscheint die letzte Zahl.
procedure TForm1.Button1Click(Sender: TObject);
var iCount1 : integer; // Counter für die for-Schleife iCount2 : integer; // Counter für die while-Schleife begin iCount2 := 0; for iCount1 := 0 to 10 do begin Edit2.Text := IntToStr(iCount1); // Zahl der for-Schleife in Edit2 anzeigen while iCount2 < 5 do begin Edit1.Text := IntToStr(iCount2); // Zahl der while-Schleife in Edit1 anzeigen Gauge1.Progress := iCount2; // Gleichzeitig durch Gauge visualisieren iCount2 := iCount2+1; // Counter erhöhen sleep(250); // Warten, so dass man auch was sieht ;) end; end; end; Ist es möglich, die aktuellen Werte der Edit-Felder sofort anzuzeigen, so dass in diesen hochgezählt wird? |
Re: Edit-Felder bei jedem Schleifendurchlauf aktualisieren
Setz in die inner Schleife mal ein Application.processmessages. Du mußt deinem Fenster auch die Chance geben sich zu aktualisieren.
|
Re: Edit-Felder bei jedem Schleifendurchlauf aktualisieren
Probiers mal mit
Delphi-Quellcode:
Application.ProcessMessages
|
Re: Edit-Felder bei jedem Schleifendurchlauf aktualisieren
Ich würde nicht Application.ProcessMessages verwenden, wenn es auch anders geht. Schließlich wird jede Benutzer-Interaktion (z.B. Alt+F4) bei einem ProcessMessages verarbeitet, was Dein Programm total durcheinanderbringen kann.
Was spricht stattdessen gegen ein simples Edit.Repaint ? Roderich |
Re: Edit-Felder bei jedem Schleifendurchlauf aktualisieren
Ich schon. Wenn das Fenster zwischenzeitlich überdenkt wird, werden nur die Edits neugezeichnet, verschieben und so weiter läßt es sich mit deiner Methode auch nicht mehr. Spielt allerdings nur eine Rolle, wenn die Schleife länger braucht. Das mit den Benutzereingaben muß er eben entsprechend verhindern.
|
Re: Edit-Felder bei jedem Schleifendurchlauf aktualisieren
Klasse, Application.ProcessMessages und Edit.Repaint funktionieren wunderbar. Jetzt muss ich nur noch schauen, was besser geeignet ist. Die Vor- und Nachteile habt ihr ja schon angesprochen.
Vielen Dank, für die Hilfe! |
Re: Edit-Felder bei jedem Schleifendurchlauf aktualisieren
Soweit klar!:-D
Die Frage, welche sich mir jetzt stellt ist aber noch: Wie kann man es erreichen, daß die Aktualisierung auch von statten geht, während das Fenster verschoben wird oder man während bzw. nach dem Verschieben noch die Maustaste gedrückt hält. Bei mir ist es bislang so, daß zwar das Fenster schön aktualisiert wird, aber während der Verschiebens usw. eben nicht mehr. :gruebel: |
Re: Edit-Felder bei jedem Schleifendurchlauf aktualisieren
Logisch. Dein Programm kann auch nur wie du eine Sache auf einmal machen. Und wärend du verschiebst, kann es eben die Schleife nicht weiter ausführen, weil ja wegen Application.Processmessages alle Nachrchiten verabreitet werden. Willst du dein gewünschtes Verhalten erreichen, musst du die Schleife in einen Thread packen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 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