Autor Beitrag
XpreZz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Do 13.10.05 23:35 
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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);

begin
procedure TFRM_zahlenraten.Timer1Timer(Sender: TObject)
.Abbrechen; // ganz Wage nur dargestellt wie ich das als Leihe
            //mir ungefähr vorstelle
end;

end.


und einmal möchte ich die Prozedur:
procedure TForm1.Timer1Timer(Sender: TObject);
so abbrechen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if zahl1 = zahl2
    then gewonnen (sender)
procedure TFRM_zahlenraten.Timer1Timer(Sender: TObject)
.Abbrechen; // und Prozedur abbrechen wenn zahl1 gleich der                //zahl2 ist.


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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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:
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 14.10.05 00:59 
Moin!

user profile iconUGrohne 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:

user profile iconXpreZz 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