ich bastle derzeit an einem Programm welches Würfeln simuliert. Am Ende werden die Ergebniss ausgegeben.
Nun möchte ich (als kleinen Nebeneffekt) die Wiederholungsschleife so verlangsamen, dass man sieht wie die Würfe sich mehren, wenn man es möchte (CHeckBox).
Habe es derzeit so gelöst:
procedure TForm1.StartClick(Sender: TObject);
if checkbox1.Checked = True then
Timer1.Enabled := true
else
{Wiederholungsschleife}
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{Wiederholungsschleife}
end;
Allerdings passiert im moment folgendes:
Wenn die CheckBox nicht aktiv ist, funktioniert das Programm reibungslos. Ist allerdings die TimerProzedure an, wartet das Programm eine Sekunde, führt die Wiederholungsschleife aus und hängt sich auf.
Wie schaffe ich es also das die Wiederholungsschleife immer einen Moment wartet bevor sie erneut beginnt?
Und gibt es evtl. eine ganz andere Lösungsmöglichkeit wo ich die Wiederholungsschleife nicht doppelt schreiben muss?
ich habe die Sache nicht überprüft, aber Du solltest in der Timer-Prozedur als erstes den Timer wieder abschalten, denn sonst startet er ja alle Sekunde die Wiederholungsschleife erneut.
wenn du einen Thread (Programm im Programm) programmierst, solltet du damit kaum Probleme haben. Ein Thread fungiert als manueller Timer und ich ziehe diese dem VCL Timer vor.
Diese Funktion beendet sich automatisch nach 5 Durchgängen:
function Wiederholungsschleife(dwParam: DWORD): DWORD; stdcall;
var
i: Integer;
begin
Result := 0;
i := 0;
while true do begin
if i \>= 5 then break; // nach 5 durchgängen abbrechen
{ dein text }
if Form1.CheckBox1.Checked then Sleep(300) // Wenn Checkbox aktiv, dann 300ms warten
Inc(i); // Durchgänge zählen
end;
end;
Aufgerufen wird die Funktion mit
var
dwThread: DWORD;
CloseHandle(CreateThread(nil, 0, @wiederholungsschleife, nil, NORMAL\_PRIORITY\_CLASS, dwThread));