AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

prozedur beenden

Ein Thema von he_rules_world · begonnen am 27. Nov 2009 · letzter Beitrag vom 28. Nov 2009
Antwort Antwort
he_rules_world

Registriert seit: 27. Nov 2009
Ort: Frankfurt am Main
5 Beiträge
 
#1

prozedur beenden

  Alt 27. Nov 2009, 21:56
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?
Zu wenig wissen ist gefährlich. Zu viel wissen auch.

Albert Einstein
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

Re: prozedur beenden

  Alt 27. Nov 2009, 22:04
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: prozedur beenden

  Alt 27. Nov 2009, 22:44
4. Ein Application.ProcessMessages in der Schleife.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

Re: prozedur beenden

  Alt 27. Nov 2009, 22:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: prozedur beenden

  Alt 27. Nov 2009, 22:48
Jupp.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
he_rules_world

Registriert seit: 27. Nov 2009
Ort: Frankfurt am Main
5 Beiträge
 
#6

Re: prozedur beenden

  Alt 28. Nov 2009, 09:32
Danke für den Tipp mit dem Application.ProcessMesseges aber die hatte ich schon drin und hab sie der Einfachkeit halber weggelassen ^^

@
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.
Zu wenig wissen ist gefährlich. Zu viel wissen auch.

Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#7

Re: prozedur beenden

  Alt 28. Nov 2009, 09:52
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
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#8

Re: prozedur beenden

  Alt 28. Nov 2009, 13:42
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
  Mit Zitat antworten Zitat
he_rules_world

Registriert seit: 27. Nov 2009
Ort: Frankfurt am Main
5 Beiträge
 
#9

Re: prozedur beenden

  Alt 28. Nov 2009, 13:55
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
Zu wenig wissen ist gefährlich. Zu viel wissen auch.

Albert Einstein
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 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