AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Abbrechen einer Schleife mit Button
Thema durchsuchen
Ansicht
Themen-Optionen

Abbrechen einer Schleife mit Button

Ein Thema von raena · begonnen am 15. Jul 2008 · letzter Beitrag vom 15. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
raena

Registriert seit: 30. Dez 2007
124 Beiträge
 
#1

Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 09:58
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von Forlan
Forlan

Registriert seit: 17. Feb 2008
Ort: Herford
265 Beiträge
 
Delphi 2007 Architect
 
#2

Re: Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 10:00
Klick mich!

hättest du hier erst geguckt dann wüsstest du es!
Marcel
マルセル
www.youtube.com/beethoven1990
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 10:01
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 Delphi-Referenz durchsuchenApplication.ProcessMessages in die Schleife. Jetzt noch eine zusätzliche Variable die beim drücken des Button gesetzt wird und und in die Abbruchbedingung einbinden.
Stephan B.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 10:27
Zitat von Sharky:
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 Delphi-Referenz durchsuchenApplication.ProcessMessages in die Schleife. Jetzt noch eine zusätzliche Variable die beim drücken des Button gesetzt wird und und in die Abbruchbedingung einbinden.
Das nützt alles nichts, weil der Ansatz schon falsch ist.
Überdenk doch nitte nochmal, was Du genau machen willst.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
raena

Registriert seit: 30. Dez 2007
124 Beiträge
 
#5

Re: Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 10:34
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 von Forlan:
Klick mich!

hättest du hier erst geguckt dann wüsstest du es!


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.
  Mit Zitat antworten Zitat
Benutzerbild von Forlan
Forlan

Registriert seit: 17. Feb 2008
Ort: Herford
265 Beiträge
 
Delphi 2007 Architect
 
#6

Re: Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 10:39
Zitat von raena:
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?
Schau dir mal die onKeyDown events an...

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^^
Marcel
マルセル
www.youtube.com/beethoven1990
  Mit Zitat antworten Zitat
raena

Registriert seit: 30. Dez 2007
124 Beiträge
 
#7

Re: Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 10:48
nö ich meine mit so einem BUTTON.

Miniaturansicht angehängter Grafiken
clipboard-1_194.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Forlan
Forlan

Registriert seit: 17. Feb 2008
Ort: Herford
265 Beiträge
 
Delphi 2007 Architect
 
#8

Re: Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 10:50
Zitat von raena:
nö ich meine mit so einem BUTTON.

ach so einen button meinst du

müsste das nicht über das onClick event laufen???
Marcel
マルセル
www.youtube.com/beethoven1990
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 10:54
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.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Abbrechen einer Schleife mit Button

  Alt 15. Jul 2008, 10:56
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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:53 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