Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi prozedur beenden (https://www.delphipraxis.net/144007-prozedur-beenden.html)

he_rules_world 27. Nov 2009 21:56


prozedur beenden
 
Hey Leute wie kann ich in einer von einer Prozedur aus eine andere während diese läuft beenden?

Der code sieht vereinfacht so aus so aus:

Delphi-Quellcode:
procedure TForm1.B_StartClick(Sender: TObject);

begin
while (Auto.Left >= -100) do
  begin
    Auto.Left:=Auto.Left-1;
  end;
end;
Es handelt sich, wie unschwer zu erkennen, um das Bild eines Autos das fahren soll.


Ich will jetzt einen Stop Button hinzufügen, dabei dachte ich mir unterbreche ich am besten die prozedur.

Ich dachte da an sowas
Delphi-Quellcode:
procedure TForm1.B_StopClick(Sender: TObject);
begin
  exit procedure TForm1.B_StartClick
end;
oder so ähnlich

Ich will nur sichergehen dass ich mich klar ausdrücke, deshalb wiederhole ich mich wahrscheinlich auch ein paar mal ^^.

Ich will also von der 2. Prozedur aus die 1. beenden geht das überhaupt, bin nämlich im Internet auf nichts darüber gestoßen?

Namenloser 27. Nov 2009 22:04

Re: prozedur beenden
 
Das geht so direkt leider nicht. Du hast im Grunde folgende Möglichkeiten:
1. Du nimmst eine Boolean-Variable, die du in deiner While-Schleife regelmäßig abfragst
2. Du nimmst einen Thread
3. Du entfernst die Schleife und verlagerst stattdessen den Code in einen Timer.

Luckie 27. Nov 2009 22:44

Re: prozedur beenden
 
4. Ein Application.ProcessMessages in der Schleife.

Namenloser 27. Nov 2009 22:47

Re: prozedur beenden
 
Zitat:

Zitat von Luckie
4. Ein Application.ProcessMessages in der Schleife.

Das alleine löst noch nicht sein Problem, es ist lediglich die Voraussetzung für 1.

Luckie 27. Nov 2009 22:48

Re: prozedur beenden
 
Jupp.

he_rules_world 28. Nov 2009 09:32

Re: prozedur beenden
 
Danke für den Tipp mit dem Application.ProcessMesseges aber die hatte ich schon drin und hab sie der Einfachkeit halber weggelassen ^^

@
Zitat:

Zitat von NamenLozer
Du hast im Grunde folgende Möglichkeiten:
1. Du nimmst eine Boolean-Variable, die du in deiner While-Schleife regelmäßig abfragst
2. Du nimmst einen Thread
3. Du entfernst die Schleife und verlagerst stattdessen den Code in einen Timer.

Möglichkeit 1 ist simpel, aber gut - werd ich wahrscheinlich dann auch machen
Möglichkeit 3 kann ich auch nachvollziehen, aber is mir ein kleines bisschen zu viel arbeit, da ich diese aktion mehrere Male wiederholen müsste

Da ich aber ncoh ein ziemlicher Delphi Noob bin: Was ist ein Thread in Delpi? Falls es zu umfangreich ist dann sag einfach mal kurz in 1,2 Sätzen, damit ich mir was darunter vorstellen kann.

wicht 28. Nov 2009 09:52

Re: prozedur beenden
 
Also... weil du dich mit einer knappen Erklärung zufrieden gibst:
Alles was du auf deiner Form und in dem Code da machst wird im Prozess deines Programmes ausgeführt. Dabei kann immer nur eine Anweisung "gleichzeitig" ausgeführt werden (im Prinzip ist dein Programm ein Thread). Das ist auch der Grund, warum du das Application.ProcessMessages brauchst - solange in der Schleife gearbeitet wird, kommt der Button nicht zum Zuge, weil das Programm ja beschäftigt ist.
Ein Thread kann dabei helfen, weil er, wie ein zweites Programm "gleichzeitig" läuft. Dann würdest du die Schleife vielleicht in den Thread packen, der Button kann immer auf Klicks reagieren und ein Klick würde zum Beispiel den Thread töten, wobei dann die Schleife auch nicht mehr laufen würde.
Allerdings gibt es beim Thema Threads viele Fallstricke, zum Beispiel darf der Thread nicht direkt auf deine Form und alles was sich da drin befindet zugreifen, der Zugriff auf gemeinsame Daten (Variablen) muss abgesichert werden... also für deinen Anwendungsfall vermutlich nicht unbedingt erforderlich.

Dazu gibts auch sehr viel im Internet zu finden - ich meine Luckie hatte da ein sehr schönes Tutorial auf seiner Seite...?

HTH

Reinhard Kern 28. Nov 2009 13:42

Re: prozedur beenden
 
Zitat:

Zitat von wicht
...ein Klick würde zum Beispiel den Thread töten, wobei dann die Schleife auch nicht mehr laufen würde.

Das ist zwar bei Threads eine Möglichkeit, aber alles andere als "graceful" - eher so, als wenn man den Hammer nimmt, damit der Wecker aufhört zu klingeln. Nebenwirkungen sind nicht abzuschätzen.

Daher sollte man auch beim Thread eine Variable einführen, die in einer Schleife abgefragt wird (wie in einer normalen Prozedur auch). Das ist dann vergleichbar damit, ein Programm normal zu beenden anstatt mit Ctrl-Alt-Del.

Gruss Reinhard

he_rules_world 28. Nov 2009 13:55

Re: prozedur beenden
 
Danke für die Erklärungen über Threads erstmal. Ich hab es inzwischen wie von NamenLozer beschrieben mit der Boolean Variable gemacht ... merkwürdig ich programmiere schon seit mehreren Jahren in zahlreichen anderen Programmiersprachen und bin doch nicht selbst auf sowas simples gekommen :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz