Entwickler-Ecke
Sonstiges (Delphi) - Prozedur auf 2 verschiedene wege abbrechen ?
XpreZz - Do 13.10.05 23:35
Titel: Prozedur auf 2 verschiedene wege abbrechen ?
Hi !
Habe eine Timer prozedur die ich einmal durch einen Button Click beenden möchte und ein anderes mal in einer IF-Anweisung.
Also Konkret stelle ich mir das so vor:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject);
begin procedure TFRM_zahlenraten.Timer1Timer(Sender: TObject) .Abbrechen; end;
end. |
und einmal möchte ich die Prozedur:
procedure TForm1.Timer1Timer(Sender: TObject);
so abbrechen:
Delphi-Quelltext
1: 2: 3: 4:
| if zahl1 = zahl2 then gewonnen (sender) procedure TFRM_zahlenraten.Timer1Timer(Sender: TObject) .Abbrechen; |
Ich hoffe ich konnte bischen darstellen was mein Problem ist.
Danke für die Hilfeversuche !
Gibts nicht so etwas ähnliches wie:
Prozedurname.abort; oder
Prozedurname.stop; ???
UGrohne - Fr 14.10.05 00:03
Hi,
Du hast doch in der abzubrechenden Prozedur bestimmt eine Schleife? Dann bau da erstmal Application.ProcessMessages ein. Dann nimmst Du Dir eine globale Boolean-Variable, die Du aber am Anfang der Prozedur auf false setzt.
Mit Hilfe eines Buttons setzt Du die Variable einfach true.
In der Schleife in der Prozedur kannst Du dann per if die Schleife verlassen, entweder weil die Variable true ist oder weil die Bedingung mit den Zahlen stimmt.
Also in etwa so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var abbruch:Boolean;
procedure Button1Click(...) begin abbruch := true; end;
procedure Bearbeite begin while (not abbruch) and (zahl1<>zahl2) do begin Application.ProcessMessages; end; end; |
Die while-Schleife wird solange ausgeführt, bis entweder abbruch true ist oder zahl1=zahl2 ist. Im Inneren der Schleife sorgt Application.ProcessMessages dafür, dass der Klick auf den Button auch bearbeitet und die entsprechende Routine ausgeführt wird, hier eben Button1Click.
Musst das halt nur noch auf Dein Problem anpassen, weil Dein Code etwas "undurchsichtig" ist.
//EDIT:
Eine Alternative zu while will ich doch noch vorstellen. Du kannst eine if-Abfrage einbauen und darauf basierend die Prozedur mit Exit verlassen.
Delphi-Quelltext
1:
| if abbruch OR (zahl1=zahl2) then Exit; |
einfach in die Schleife einbauen, das reicht dann auch, wenn Du Deine Schleife nicht umprogrammieren willst/kannst.
Narses - Fr 14.10.05 00:59
Moin!
UGrohne hat ja schon sehr ausführlich und gut die Lösung deines Problems vorgestellt. Ich möchte dir aber noch auf deine Frage antworten und so vielleicht etwas mehr zum Verständnis beitragen:
XpreZz hat folgendes geschrieben: |
Gibts nicht so etwas ähnliches wie:
Prozedurname.abort; oder
Prozedurname.stop; ??? |
Nein. In einem Programm gibt es nicht sowas wie eine Kontrollinstanz, die es dir ermöglicht, Prozeduren nach Belieben - wie einen Prozess - zu beenden. Das geht nur mit Threads (ist mal eher für Fortgeschrittene). Oder anders formuliert: Wenn dein Programm startet, dann gibt es da nur einen "Weg" durch deinen Programmcode, den der Prozessor durchläuft. Wenn dieser also gerade eine bestimmte Prozedur abarbeitet, dann gibt es da nichts, was - quasi von "aussen" - dieser Prozedur "sagen" könnte, "hey, genug, mach dich vom Acker", weil die (Ereignis-)Prozedur erst beendet werden muss, bevor eine andere Prozedur abgearbeitet wird.
Zur Erklärung der Lösung, die dir angeboten wurde: Wenn die CPU also deine Timer-Prozedur abarbeitet, dann kannst du nicht in der Button-Klick-Prozedur ankommen, bis die Timer-Prozedur beendet ist. Ausweg: Das Application.ProcessMessages; gibt dem Programm die Möglichkeit, den Button-Klick festzustellen und zu bearbeiten (quasi "zwischendurch"), also z.B. in einer Variablen festzuhalten, dass die Prozedur beendet werden soll.
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!