Folgende Prozedur als OnClick-Event des Buttons spinnt:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
if dclk.value = false then label1.Caption := 'false' else label1.Caption := 'true';
While Dclk.Value = false do
begin
label2.caption := 'Running';
end;
end;
Irgendeine Idee was da schief läuft?
Und noch eine weitere Frage hinterher: Ich würde gerne eine Art Watchdog programmieren der die Schleife nach einer Zeit X abbricht.
Von AVRs bin ich es gewohnt einen Timer zu starten dessen ISR nach eben dieser Zeit ein Flag setzt welches dann in der Schleife ausgewertet wird und diese abbricht.
Mein Versuch: 'Flag' wird im FormCreate auf '0' gesetzt, in der Timer-ISR wird 'Flag' dann auf 1 geändert. Im Objektinspektor ist Timer1 disabled.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
if dclk.value = false then label1.Caption := 'false' else label1.Caption := 'true';
timer1.enabled := true;
While Dclk.Value = false do
begin
if Flag = 1 then break;
label2.caption := 'Running';
end;
end;
Aber jetzt wirds schräg: Wenn ich im Objektinspektor den Timer direkt enable dann funktionierts, inklusive Anzeige des _ersten_ Labels...aber nur dann wenn ich den Button erst _nach_ Ablauf der Timerzeit klicke. D.h. das Flag wird dann auch innerhalb der Schleife ausgewertet und das _erste_ Label angezeigt - das zweite aber wiederum nicht! Die while...do Schleife blockiert also auch den Timer so dass er das Flag nicht setzen kann, er muss schon vor Start der Schleife das Flag gesetzt haben. Dann wird auch die Schleife verlassen und das Programm kann auch normal beendet werden...nur der zweite Label-Befehl wird nicht ausgeführt, obwohl die Schleife mit diesem Befehl ja x-mal durchlaufen worden sein muss. Warum ich das erwähne: Vertausche ich die Reihenfolge der Flagauswertung und des Label-Befehls...
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
if dclk.value = false then label1.Caption := 'false' else label1.Caption := 'true';
timer1.enabled := true;
While Dclk.Value = false do
begin
label2.caption := 'Running';
if Flag = 1 then break;
end;
end;
Ich stehe irgendwie total auf dem Schlauch...