Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Uhrzeit in Statusbar (https://www.delphipraxis.net/80525-uhrzeit-statusbar.html)

Darkchild 10. Nov 2006 11:10


Uhrzeit in Statusbar
 
Mahlzeit,

ich habe in meinem frmMain eine Statusbar, diese zeigt mir an welcher Benutzer gerade Angemeldet ist, die passenden AutoHints zu den dort liegenden Buttons und die Uhrzeit.

Das Problem für mich ist jetzt ich gehe an die Uhrzeit so ran:

Delphi-Quellcode:
procedure TfrmMain.statusbarzeit();
var
Zeit:Ttime;
begin
Zeit := getTime;
dxstatbarfrmmain.Panels[0].text := timetostr(Zeit);
dxstatbarfrmmain.Panels[1].text := mitarbeitername;
end;
Das hat zur folge das er die Uhrzeit ausliesst diese aber nicht fortlaufend aktuell hält.

Frage jetzt : Was muss ich machen damit die Uhrzeit in meiner StatusBar fortlaufend tickt mit Stunden,Minuten und Sekunden ?

Gibt es da eine Funktion oder Procedure in der DateUtils die ich aufrufen kann und wenn wo muss die dann eingebunden werden oder muss ich da ganz anders vorgehen ?

Gruss
Darkchild

Luckie 10. Nov 2006 11:13

Re: Uhrzeit in Statusbar
 
Warum sollte sie auch aktualisiert werden? Du weißt dem Panel ja nur einmal die aktuelle Uhrzeit zu. Woher soll das Panel wissen, das sie andauernd aktualisiert werden soll? Nimm einen Timer und weiß die aktuelle Uhrzeit im OnTimer-Ereignis dem Panel zu.

JonnyGuitar 10. Nov 2006 11:13

Re: Uhrzeit in Statusbar
 
hi,

du könntest zb. einen ttimer benutzen und in dessem event die uhrzeit jede sekunde an die statusbar schicken

Delphi-Quellcode:
procedure TForm1.tmr1Timer(Sender: TObject);
begin
  dxstatbarfrmmain.Panels[0].text := timetostr(now)
end;
mfg Jonny

Darkchild 10. Nov 2006 11:17

Re: Uhrzeit in Statusbar
 
Das die nicht aktuallisiert werden konnte so wie ich das gemacht habe war mir schon klar.

Deshalb ja die frage womit das anders geht. Den Timer habe ich auch gerade in der Mangel, hatte mir aber gedacht das es vieleicht eine fertige Geschichte gibt die ich nur aufrufen muss und die das für mich übernimmt.

Aber dennoch Danke, mit dem Timer war jetzt zufall das ich den gerade gefunden habe, sonst hätte ich da wohl auch noch überlegt.

Naja, manchmal sieht man halt den Wald vor lauter Bäumen nicht mehr :wall: .

Gruss
Darkchild

Darkchild 10. Nov 2006 11:24

Re: Uhrzeit in Statusbar
 
@Jonny Guitar

Jo funzt, habe erst die einmalige Initialisierung der Zeit in der Procedure und dannach übernimmt der Timer jetzt die weitere Funktion, läuft rund und im Sekunden Takt. :thumb:

thx und Gruss
Darkchild :idea:

smudo 10. Nov 2006 12:03

Re: Uhrzeit in Statusbar
 
Hier noch eine Kanone für Spatzen:

Delphi-Quellcode:
  TTimerLabel = class(TThread)
  private
    FTimeLabel: TLabel; //hier die gewünschte Komponente verwenden
    FStop: Boolean;
    FDelay: Cardinal;
  protected
    procedure Execute; override;
    procedure ShowTime;
  public
    constructor Create(const aLabel: TLabel; const aDelay: Cardinal; ThreadPriority: TThreadPriority);
    procedure Stop;
    property Delay: Cardinal read FDelay write FDelay;
  end;

constructor TTimerLabel.Create(const aLabel: TLabel; const aDelay: Cardinal;
  ThreadPriority: TThreadPriority);
begin
  inherited Create(True);
  Priority := ThreadPriority;
  FStop := False;
  FDelay := aDelay;
  FTimeLabel := aLabel;
  FreeOnTerminate := True;
  Resume;
end;

procedure TTimerLabel.Execute;
begin
  inherited;
  ShowTime;
end;

procedure TTimerLabel.ShowTime;
begin
  while not FStop do
  begin
    FTimeLabel.Caption := TimeToStr(Now);
    Sleep(Delay);
  end;
end;

procedure TTimerLabel.Stop;
begin
  if not FStop then FStop := True;
end;
Und im verwendeten Proc so aufrufen:
Delphi-Quellcode:
TL: TTimerLabel;

procedure TfrmTest.FormShow(Sender: TObject);
begin
  TL := TTimerLabel.Create(lbTime, 10, tpNormal); //10 ist OK, mind. 1 verwenden und max 1000 ;)
end;

procedure TfrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TL.Stop;
end;
Gruß

René

Luckie 10. Nov 2006 12:07

Re: Uhrzeit in Statusbar
 
Du greifst ohne zu Synchronisieren auf visuelle Komponenten des Formulares zu:
Delphi-Quellcode:
procedure TTimerLabel.Execute;
begin
  inherited;
  ShowTime;
end;

procedure TTimerLabel.ShowTime;
begin
  while not FStop do
  begin
    FTimeLabel.Caption := TimeToStr(Now);
    Sleep(Delay);
  end;
end;
Da die visuellen Komponenten von Delphi nicht threadsafe sind, kann das zu Programmfehlern führen. Siehe dazu auch die Delphi Hilde: Delphi-Referenz durchsuchensynchronize.

smudo 10. Nov 2006 12:11

Re: Uhrzeit in Statusbar
 
Richtig. Sollte auch nur ein kleines Beispiel für eine andere Variante sein.
Da kann und sollte man, wenn man's wirklich verwenden will, noch einiges dran tun.

Danke Luckie für den wichtigen Hinweis.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz