![]() |
Abbrechen einer Schleife mit Button
Hallo,
wie kann eine Schleife durch Drücken eines Buttons abgebrochen werden? Das Problem ist, dass während die Schleife läuft mein Stop Button garnicht akzeptiert wird!! Vielen Dank, Raena :o
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) b_start: TButton; b_stop: TButton; procedure b_startClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.b_startClick(Sender: TObject); begin repeat sleep (200); until 1=0; end; end. |
Re: Abbrechen einer Schleife mit Button
|
Re: Abbrechen einer Schleife mit Button
Hai raena,
zum einen solltest Du nicht Sleep verwenden sondern lieber ein Delay (funktionen dafür findest Du in der Codelibrary). Dann musst Du in der Schleife noch dafür sorgen das die Windowsnachrichten von deinem Programm "abgerufen" werden. Also ein ![]() |
Re: Abbrechen einer Schleife mit Button
Zitat:
Überdenk doch nitte nochmal, was Du genau machen willst. |
Re: Abbrechen einer Schleife mit Button
Hallo Forlan,
das klappt schon gut mit der ESC Taste. Die Schleife wird schön abgebrochen. Wie kann man das jetzt mit einem Button machen oder geht das nicht? Danke. :?: Zitat:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) b_start: TButton; b_stop: TButton; procedure b_startClick(Sender: TObject); procedure ResetEscPressed; function EscPressed():Boolean; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.b_startClick(Sender: TObject); begin resetescpressed; repeat sleep (200); until EscPressed(); end; procedure TForm1.ResetEscPressed; begin GetAsyncKeyState(VK_ESCAPE); GetAsyncKeyState(VK_PAUSE); end; function TForm1.EscPressed():Boolean; begin Result := ((GetAsyncKeyState(VK_ESCAPE) and $8001) <> 0) or ((GetAsyncKeyState(VK_PAUSE) and $8001) <> 0); end; end. |
Re: Abbrechen einer Schleife mit Button
Zitat:
Z.B. ord('W') für W gedrückt etc... Für F1 etc --> ord(VK_F1) Für Pfeil nach oben --> ord(VK_Up) wobei man das ord bei den VK_ Sachen glaub ich auch weglassen kann^^ |
Re: Abbrechen einer Schleife mit Button
Liste der Anhänge anzeigen (Anzahl: 1)
nö ich meine mit so einem BUTTON.
:? |
Re: Abbrechen einer Schleife mit Button
Zitat:
müsste das nicht über das onClick event laufen??? :gruebel: |
Re: Abbrechen einer Schleife mit Button
Tut es ja auch, allerdings kann der Hauptthread natürlich nur einen Eventhandler auf einmal bearbeiten, wenn man nicht so Krücken wie Application.ProcessMessages verwendet, die einem später dann immer wieder ganz derbe Probleme bringen können.
Die richtige Lösung wäre ein Workerthread, der die Arbeit tut und dem signalisiert wird, dass er abbrechen soll. Damit hätte man zum einen eine GUI die ständig auf Benutzereingaben reagiert, und zum anderen den Pfusch mit Application.ProcessMessages vermieden. Ist zwar einmal etwas Einarbeitungsaufwand, sich in das Thema Threads einzulesen, aber früher oder später kommt man eh nicht mehr darum herum. von daher: Erst gar keinen Pfusch zur Gewohnheit werden lassen, gleich richtig machen. |
Re: Abbrechen einer Schleife mit Button
Gehe ich recht in der Annahme, dass Du folgendes machen willst:
- beim Anzeigen des Forms soll eine Schleife loslaufen - die Schliefe macht ständig irgendwelche Sachen - wird auf dem Formular ein Button gedrückt, soll die Schleife gestoppt werden Dann würde ich: - in FormShow die Schleife rein setzen - in der Schleife Application.ProcessMessages aufrufen - dann in der Schleife die Arbeit erledigen - weiterhin braucht man eine Member-Variable fAbbrechen: Boolean (im private-Abschnitt) - vor der Schleife diese auf False setzen - in ButtonClick fAbbrechen := True - die Schleife: while not fAbbrechen do Falls Du etwas anderes erreichen wolltest, hab ich Dich wohl falsch verstanden. Dann musst Du es mir nochmal erläutern. P.S. der Hinweis mit dem Thread ist absolut richtig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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