Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schleife unterbrechen (break) (https://www.delphipraxis.net/135651-schleife-unterbrechen-break.html)

thomasku 15. Jun 2009 13:36


Schleife unterbrechen (break)
 
Hi,

ich möchte gern eine schleife per Tastatureingabe unterbrechen.
Delphi-Quellcode:
 
 a:Boolean;
implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var b,c:Integer;
begin
   For b:=0 to 20000 do
   //sleep(50);
   If a=true then
     break
   else
   c:=b;
   label1.Caption:=inttostr(c);
end;

procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  If Key=VK_RETURN then
    a:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  a:=false;
end;
Habe es auch mit (Button1)KeyPress probiert.
Mfg Thomas

freak4fun 15. Jun 2009 13:38

Re: Schleife unterbrechen (break)
 
Delphi-Quellcode:
Application.ProcessMessages;

DeddyH 15. Jun 2009 13:39

Re: Schleife unterbrechen (break)
 
Oder einen Thread verwenden.

fui-tak 16. Jun 2009 17:09

Re: Schleife unterbrechen (break)
 
So müsste es eigentlich funktionieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var b,c:Integer;
begin
   For b:=0 to 20000 do
   //sleep(50);
   if getasynckeystate(VK_RETURN)<>0 then
     break
   else
   c:=b;
   label1.Caption:=inttostr(c);
end;

thomasku 18. Jun 2009 09:36

Re: Schleife unterbrechen (break)
 
Hallo und Danke erstmal an alle!

@freak4fun
Habe im obigen (Post1) Code probiert es in der (1)Schleife bzw in der (2) If-Anw. einzufuegen, jedoch ohne Erfolg.
Alternativ habe ich noch folgendes probiert:
Delphi-Quellcode:
 Variante2
procedure TForm1.Button1Click(Sender: TObject);
Var b,c:Integer;
begin
   For b:=0 to 20000 do
   begin
     Application.ProcessMessages;
     if application.Terminated then
     begin
 //    showmessage(inttostr(b));
       break;
     end
     else
     begin
       sleep(50);
        c:=b;
     end;
   end;
   label1.Caption:=inttostr(b);
end;

procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   If Key=VK_RETURN then
     application.Terminate;
end;
leider auch ohne Erfolg.

@DeddyH
Habe noch nie mit Threads gearbeitet, werde es mir mal anschauen (jedoch erst in den Ferien :stupid: )


@fui-tak
Danke für die Prozedur, kannte ich vorher noch nicht. Deine gepostete Version ging bei mir leider auch nicht. Ich habe als Rückgabewert einen int64 (uint64))bekommen, also keinen Wert aus dem intervall 0-20001.
Allerdings so ging es dann:
Delphi-Quellcode:
 procedure TForm1.Button1Click(Sender: TObject);
Var b,c:Integer;
begin
   For b:=0 to 20000 do
   begin
     application.processmessages;
     if getasynckeystate(VK_RETURN)<>0 then
       break
     else
     begin
       c:=b;
       sleep(50);
     end;
   end;
   label1.Caption:=inttostr(c);
end;
Mfg thomas

Forlan 18. Jun 2009 09:59

Re: Schleife unterbrechen (break)
 
Noch ein Tipp:

Überpüfe einen Boolean nicht auf = True.
In deinem Fall also:

Delphi-Quellcode:
if a then

thomasku 20. Jun 2009 19:10

Re: Schleife unterbrechen (break)
 
Hi Forlan und vielen Dank,

dachte das ist nur eine unnötige Abfrage mehr, habe es aber mal nach gelesen.

Allerdings hilft mir dass auch nicht wirklich bei einer lauffaehigen Variante mit den Buttondown bzw press Ereignis.
Bin das We erstmal nicht da aber poste am Mo nochmal meine Ergebnisse.

Mfg thomas

hadschi92 20. Jun 2009 19:21

Re: Schleife unterbrechen (break)
 
Ich denke, dass es an deinem Sleep liegt, damit hälst du dein ganzes Programm an und es kann auch keine Tastendrücke mehr abfangen. So funktioniert es bei mir hervorragend:
Delphi-Quellcode:
procedure TForm2.Button3Click(Sender: TObject);
var b: Integer;
begin
  aus := false;
  ProgressBar1.Max := 200000;
  for b := 0 to 200000 do
   begin
    Application.ProcessMessages;
    if aus then
      break;
    //tue hier sonst die normale schleife
    ProgressBar1.Position := b;
   end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 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