Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Formular im Thread neu erzeugen (https://www.delphipraxis.net/185984-formular-im-thread-neu-erzeugen.html)

Mavarik 24. Jul 2015 11:57

AW: Formular im Thread neu erzeugen
 
Du hast Doch sicherlich im FormCreate die Abfrage nach dem Wochentag...

Dann brauchst Du doch nur daraus eine procedure machen und die Aufrufen...

Mavarik

khh 24. Jul 2015 12:18

AW: Formular im Thread neu erzeugen
 
alsoo,
ich habe jetzt einen Timer den ich alle 45 Sekunden aufrufe.
im OnTimer frage ich einfach ab, ob es 00:01 Uhr ist.
wenn ja gebe ich die alten Panels frei und erzeuge sie neu.

Klappt in einem ersten Test wunderbar. ;-)

Ich überlege nur, ob die Abfrage alle 45 Sekunden, also einmal pro Minute nötig ist.
ich denke schon, denn bei einem längeren Intervall "verpasst" der Timer die passende Uhrzeit, oder ?

stahli 24. Jul 2015 12:22

AW: Formular im Thread neu erzeugen
 
Du kannst auch die Differenzzeit bis 00:01 ermitteln und das Ergebnis in das Timerintervall schreiben (bzw. Maxint wenn die Millisekunden sonst zu viele wären).

khh 24. Jul 2015 12:28

AW: Formular im Thread neu erzeugen
 
Zitat:

Zitat von stahli (Beitrag 1309732)
Du kannst auch die Differenzzeit bis 00:01 ermitteln und das Ergebnis in das Timerintervall schreiben (bzw. Maxint wenn die Millisekunden sonst zu viele wären).

da steh ich jetzt auf der Leitung :-(

Du meinst ich ermittle im Timer die Differenz bis 00:01 und setze damit den Timerintervall jedesmal neu?

stahli 24. Jul 2015 12:37

AW: Formular im Thread neu erzeugen
 
So etwa wie Wecker stellen:

T: TTime;
MS: Real;
I: Integer;
...
T := (Morgen, 00:00:01) - Now;
MS := T als Millisekunden (bin jetzt nicht sicher, wie man das umrechnen muss)
if (MS > MaxInt) then I := MaxInt
else I := Round(MS);

Timer.Interval := I;

Und in der nächsten Timerbehandlung das gleiche wieder.
Dann feuert der Timer nicht unnötig oft.

frankyboy1974 24. Jul 2015 12:38

AW: Formular im Thread neu erzeugen
 
hallo,

du ermittelst wieviel Zeit noch bis 00:01 benötigt wird und setzt deinen Timer entsprechend neu.
Wenn du also um 22:10 nachschaust, brauchst du nicht alle 45 Sekunden neu prüfen, ob bereits Mitternacht ist.
Ich würde an dieser Stelle aber die allgemeine Relativitäts Theorie anführen. Wenn es bir jetzt 22:10 ist, und bei dir eine Sekunden vergangen ist, heisst dies nicht, dass bei mir auch nur eine Sekunde verganganen ist.:roll:

mfg

frank

Mavarik 24. Jul 2015 12:44

AW: Formular im Thread neu erzeugen
 
Zitat:

Zitat von stahli (Beitrag 1309737)
MS := T als Millisekunden (bin jetzt nicht sicher, wie man das umrechnen muss)
if (MS > MaxInt) then Und in der nächsten Timerbehandlung das gleiche wieder.
Dann feuert der Timer nicht unnötig oft.

Echt? Weil ein Timer ja auch nur ein Interval von 49 Tagen kann?

stahli 24. Jul 2015 12:50

AW: Formular im Thread neu erzeugen
 
[OT]
kleiner Vorschlag: Ändere Deine Antwort in "ein Timer kann ein Intervall von 49 Tagen, dann braucht es in dem Fall keine MaxInt-Prüfung"
(das klänge etwas netter)
[/OT]

khh 24. Jul 2015 13:17

AW: Formular im Thread neu erzeugen
 
Zitat:

Zitat von stahli (Beitrag 1309742)
[OT]
kleiner Vorschlag: Ändere Deine Antwort in "ein Timer kann ein Intervall von 49 Tagen, dann braucht es in dem Fall keine MaxInt-Prüfung"
(das klänge etwas netter)
[/OT]

und es wäre besser verständlich was gemeint ist ;-)

Sir Rufo 24. Jul 2015 13:19

AW: Formular im Thread neu erzeugen
 
Warum macht ihr euch das Leben so schwer? Ihr tut gerade so, als ob so ein Timer-Event die Monster-Performance-Bremse ist.
Delphi-Quellcode:
unit Form.MainForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TForm1 = class( TForm )
    EnsureCurrentDateTimer: TTimer;
    CurrentDateLabel: TLabel;
    procedure FormShow( Sender: TObject );
    procedure EnsureCurrentDateTimerTimer( Sender: TObject );
    procedure FormHide( Sender: TObject );
  private
    FCurrentDate: TDate;
    procedure SetCurrentDate( const Value: TDate );
    procedure DoRefreshFormData( );
    procedure DoEnsureCurrentDate( );
  protected
    property CurrentDate: TDate read FCurrentDate write SetCurrentDate;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  System.DateUtils;

procedure TForm1.DoEnsureCurrentDate;
begin
  CurrentDate := Date;
end;

procedure TForm1.DoRefreshFormData;
begin
  CurrentDateLabel.Caption := DateToStr( CurrentDate );
end;

procedure TForm1.EnsureCurrentDateTimerTimer( Sender: TObject );
begin
  DoEnsureCurrentDate( );
end;

procedure TForm1.FormHide( Sender: TObject );
begin
  EnsureCurrentDateTimer.Enabled := False;
end;

procedure TForm1.FormShow( Sender: TObject );
begin
  DoEnsureCurrentDate( );
  EnsureCurrentDateTimer.Enabled := True;
end;

procedure TForm1.SetCurrentDate( const Value: TDate );
var
  LValue: TDate;
begin
  LValue := DateOf( Value );
  if FCurrentDate <> LValue then
  begin
    FCurrentDate := LValue;
    DoRefreshFormData( );
  end;
end;

end.
Simpel und robust


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 Uhr.
Seite 2 von 3     12 3      

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-2025 by Thomas Breitkreuz