Voor een competitie programma moet er tijdens het starten van een ronde een 'timer' opgestart, die 15 minuten doorloopt. Hieronder staat de code, die ik heb gebruikt. De doelstelling is: een tijd laten lopen en toch interactie met het programma hebben. Nu mijn vragen:
- Is dit de juiste manier?
- zo ja, kan het nog worden verbeterd.
- zo niet, wat is een andere/betere manier om het uit te voeren?
Delphi Code:
unit Unit1;
interface
uses
System.SysUtils, System.Variants, System.Classes,
Vcl.Controls, Vcl.Forms, Vcl.StdCtrls;
type
TTimeProgressEvent = procedure(const aDisplayTime : TTime) of object;
TMyStopwatch = class(TThread)
private
fStartTime : TTime;
fCalculatedTime : TTime;
FOnProgress : TTimeProgressEvent;
procedure DoProgress;
public
procedure execute; override;
property OnProgress: TTimeProgressEvent read FOnProgress
write FOnProgress;
end;
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
procedure displayTime(const aDisplayTime : TTime);
public
{ Public declarations }
St : TMyStopwatch;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
st := TMyStopwatch.Create(true);
st.fStartTime := now;
st.OnProgress := displayTime;
st.Start
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
st.Terminate
end;
procedure TForm1.displayTime(const aDisplayTime: TTime);
begin
label1.Caption := Formatdatetime('nn:ss',aDisplayTime);
end;
procedure TMyStopwatch.execute;
var EndTime : TTime;
begin
try
while not terminated do
begin
sleep(1000);
EndTime := now;
fCalculatedTime := EndTime - fStartTime;
Synchronize(DoProgress);
end;
finally
FreeOnTerminate := True;
end;
end;
procedure TMyStopwatch.DoProgress;
begin
if Assigned(FOnProgress) then
FOnProgress(fCalculatedTime);
end;
end.
Bookmarks