ButtonClick in einer While Schleife abfragen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Biertrinker
Beiträge: 16
Registriert: Mo 18. Mär 2013, 17:19
OS, Lazarus, FPC: MAC OSX
CPU-Target: xxBit

ButtonClick in einer While Schleife abfragen

Beitrag von Biertrinker »

Hallo zusammen,

ich suche nach einen Tip wie ich in einer While Schleife
überprüfen kann ob der Button1 geklickt wurde
" Button1 soll das PRG beenden können "

ich habe im DelphiForum was mit SENDER gelesen aber ich gebe
zu nicht schlau daraus geworden zu sein

Alles was ich brauche ist halt ein weg damit das Programm wärend
der Schleife noch auf den Ende Button reagiert.

Aktuell wirkt das Prg immer wie eingefroren bis die Schleife durch ist. :(

lg
mfg
Horst Sammler

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ButtonClick in einer While Schleife abfragen

Beitrag von Michl »

Was du wahrscheinlich suchst ist "Application.ProcessMessages"

siehe z.B. http://wiki.freepascal.org/Multithreade ... chaften.3F

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

g3sh
Beiträge: 21
Registriert: Mi 3. Jul 2013, 10:04

Re: ButtonClick in einer While Schleife abfragen

Beitrag von g3sh »

Hi,

ist die Schleife dafür da um eine Aktion beim beenden des Programms auszuführen ?
Dann wäre das OnClose Ereignis von Form1 (bzw. eines Formulares TForm) hier das richtige und man bräuchte die Schleife nicht.

MfG

Biertrinker
Beiträge: 16
Registriert: Mo 18. Mär 2013, 17:19
OS, Lazarus, FPC: MAC OSX
CPU-Target: xxBit

Re: ButtonClick in einer While Schleife abfragen

Beitrag von Biertrinker »

Hallo
vielen Dank für den Tip mit application.ProcessMessages
Das Fenster bzw der Button lassen sich nun auch klicken :-),
das Grundproblem das die While Schleife erst Ihre Arbeit beendet
bevor die Auswertung des Buttons abgearbeite wird, ist noch vorhanden.

( naja laut dem was ich hier zusammengeschrieben habe ja auch irgendwo logisch )

ich würde gerne oberhalb des application.ProcessMessages; noch soetwas einfügen wie

----
wurde Button1 geklickt dann mache xyz
----

wenn ich :
if Sender = Button1 then
xyz

schreibe bekomme ich die Fehlermeldung
identifier not found Sender

ich google mich blöd wie man das nun per Syntax schreibt

ggf hat ja noch jemand einen Tip

hier mal dir procedure um die es geht

Code: Alles auswählen

 
 
procedure TForm1.anzeigerunden();
var
a : integer;
begin
     aktuelle_runde:=aktuelle_runde+1;
 
    while (runden < aktuelle_runde) do
    begin
 
      TImage(FindComponent('image'+IntToStr(zahlenpool[runden]))).Visible:=true;
      form1.Repaint;
      form1.Refresh;
 
 
       for a := 1 to 300 do
        begin
          sleep(10);
          application.ProcessMessages;
        end;
 
 
      { TODO : das sleep durch was anderes ersetzen
        was es möglich macht das der ENDE Button geklickt werden kann }
 
      ausblendenrunde();
    end;
 
 
 
mfg
Horst Sammler

g3sh
Beiträge: 21
Registriert: Mi 3. Jul 2013, 10:04

Re: ButtonClick in einer While Schleife abfragen

Beitrag von g3sh »

Du könntest mit dem Button einfach eine Globale Variable, die den Typ Boolean hat setzen und diese Variable dann in der Schleife (oder Timer) abfragen.
Und statt Schleifen würde ich hier Timer holen, dann hat man auch das Problem nicht das die ganze Eingabe blockiert wird.

MfG

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ButtonClick in einer While Schleife abfragen

Beitrag von Michl »

Das könntest du in deiner Procedure z.B. so lösen:

Code: Alles auswählen

var
  Stopp: boolean;
 
procedure TForm1.anzeigerunden;
var
  a : integer;
begin
  aktuelle_runde:=aktuelle_runde+1;
 
  while (runden < aktuelle_runde) and not Stopp do begin  //Variable Stopp vom Typ Boolean
 
    TImage(FindComponent('image'+IntToStr(zahlenpool[runden]))).Visible:=true;
//    form1.Repaint;
    form1.Refresh;
 
    a:=1;
    while (a<301) and not Stopp do begin  //Variable Stopp vom Typ Boolean
//      do something
      application.ProcessMessages;
    end;
 
    ausblendenrunde();
  end;
end.
 
procedure TForm1.Button1Click(Sender: TObject);  //beim Aufruf deiner Procedure Stopp als False definieren
begin
  Stopp:=False;
  anzeigerunden;
end;
 
procedure TForm1.Button2Click(Sender: TObject);  //solange deine Procedure aufrufen, bis Button2 geklickt wurde
begin
  Stopp:=true;
end; 
Zuletzt geändert von Michl am Di 3. Sep 2013, 15:38, insgesamt 2-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Biertrinker
Beiträge: 16
Registriert: Mo 18. Mär 2013, 17:19
OS, Lazarus, FPC: MAC OSX
CPU-Target: xxBit

Re: ButtonClick in einer While Schleife abfragen

Beitrag von Biertrinker »

Hallo

:D vielen Dank für die Tips :D
nun funkt es so wie gedacht
mfg
Horst Sammler

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: ButtonClick in einer While Schleife abfragen

Beitrag von mschnell »

Warte-Schleifen im Mainthread sind in einer Ereignis-gesteuerten Sprache ganz schlechter Stil und immer vermeidbar. Sie erzeugen entweder hohe Latenz oder drosseln die Leistung des ganzen Rechners durch 100 % CPU-Last. Das hat Object-Pascal nicht verdient :( .

(Siehe Post von g3sh oben.)

-Michael

Antworten