Delphi-PRAXiS
Seite 2 von 2     12   

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 Welcher Timer (https://www.delphipraxis.net/19589-welcher-timer.html)

ThunderX86 5. Apr 2004 21:29

Re: Welcher Timer
 
Danke für die zahlreichen Antworten. :)
Ich werds gleich mal ausprobieren.

tommie-lie 5. Apr 2004 21:31

Re: Welcher Timer
 
Zitat:

Zitat von himitsu
[OT]Na dann schämm dich :warn: :P [/OT]

Ja, reit' nur auf mir rum.
Nicht genug daß ich wegen diverser Ablenkungen zwei Minuten zu spät gepostet habe und nicht alle paarhundert Klassen auswendig kann, jetzt stellt sich auch noch die ganze DP-Gemeinde gegen mich. Toll, mein Ego ist am Boden zerstöert.

ThunderX86 5. Apr 2004 21:48

Re: Welcher Timer
 
Bisher funktionieren leider alle Lösungen nicht. :(

Liegt aber sicher an der Art wie ich die Timer erstelle... ich muss sie nämlich erstellen wärend das Programm läuft, und das mache ich so:

Delphi-Quellcode:
procedure TForm1.CreateTimers(Sender: TObject);

var
  TimerArray: ARRAY OF TTimer;
  i, j:         Integer;
 
begin

  SetLength(Timerarray, 0);

  frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0))+'frconfig.ini');
  i       := frconfig.ReadInteger('Counter', 'Foren', 0);

  j := i-1;
  SetLength(TimerArray, i);
  for i := i downto 1 do
    begin
      TimerArray[j] := TTimer.Create(nil);
      TimerArray[j].Interval := frconfig.ReadInteger('Foren', 'Timer'+IntToStr(i), 0);
      TimerArray[j].Enabled := true;
      TimerArray[j].OnTimer := TimerEvent;
      j := j-1;
    end;


end;
Ich Lese also die Dauer bis zum nächsten Aufruf aus einer Ini und Setze das Event so...

Wenn ich das jetzt mache wie oben beschrieben:

Delphi-Quellcode:
procedure TForm1.TimerEvent(Sender: TObject);
begin
  ShowMessage('Ich bin Timer: '+IntToStr(TTimer(Sender).Tag)); // Oder Sender.Tag oder auch If Sender = Timer1 ...
end;
Dann bekomme ich nur Fehler... entweder kennt der das "Tag" nicht oder es kommen andere Fehlermeldungen (Wenn ich das so aufbaue dass variable j geschickt wird).

/edit: Ich bin natürlich für allgemeine Tips zu Delphi oder Hinweise auf Schönheitsfehler dankbar!

himitsu 5. Apr 2004 23:27

Re: Welcher Timer
 
1. Zähler-Variable im Zähler verwendet :warn:
Code:
for i := [color=red]i[/color] downto 1 do
2. wozu das Array - das ist doch total sinnlos

3. bei mir geht's - bei dir sollte es aber zumindestens "0" anzeigen - da du's ja nicht zugewiesen hast ;)
PS: du solltest Tag natürlich auch festlegen

Delphi-Quellcode:
Type TForm1 = Class(TForm)
    ...
  Private
    Procedure TimerEvent(Sender: TObject);
  End;


Procedure TForm1.CreateTimers(Sender: TObject);
  Var Timer: TTimer;
    frconfig: TIniFile; // sowas sollte man doch eher lokal definieren
    i, j: Integer;
 
  Begin
    frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'frconfig.ini');
      i := frconfig.ReadInteger('Counter', 'Foren', 0);
      For j := 1 to i do Begin
        Timer := TTimer.Create(Form1); // wegen der Freigabe macht es sich besser, das Objekt irgendwo zuzuordnen (am einfachsten dem Formular)
        Timer.Interval := frconfig.ReadInteger('Foren', 'Timer' + IntToStr(j), 0);
        Timer.Tag := j; // einen Wert für Tag festlegen
        Timer.Enabled := true;
        Timer.OnTimer := TimerEvent;
      End;
    frconfig.Free; // Freigeben sollte man die Datei natürlich auch
  End;

Procedure TForm1.TimerEvent(Sender: TObject);
  Begin
    ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag));
  End;

ThunderX86 6. Apr 2004 00:11

Re: Welcher Timer
 
Zitat:

Zitat von himitsu
1. Zähler-Variable im Zähler verwendet :warn:
Code:
for i := [color=red]i[/color] downto 1 do
2. wozu das Array - das ist doch total sinnlos

Hm... jo da war ich zu dumm, hab ned gewusst wie ich das am besten mach und da ich ja einen wert zuweisen muss...
Array hab ich aus dem Grund verwendet weil ich ja später von über all drauf zugreifen will, woher weiß ich jetzt in welcher Variable der Timer ist? Ich brauch ja nicht nur einen sondern mehrere... wenn ich da nur hab Timer als eine Variable, wie soll ich der mehrere Timer geben? Das is doch irgendwie unlogisch oder?

/edit: Ich hab ja auch eine Bearbeitungsfunktion, und wenn ich da in der Ini den Zeitwert ändere, muss ich ihn gleich danach wärend das Programm läuft noch beim Timer direkt ändern... wie sollte ich den betroffenen Timer sonst ansprechen?

Zitat:

Zitat von himitsu
3. bei mir geht's - bei dir sollte es aber zumindestens "0" anzeigen - da du's ja nicht zugewiesen hast ;)
PS: du solltest Tag natürlich auch festlegen

:| Jetzt weiß ich wieso das nicht ging, wenn ich den Tag nicht definier kann da ja nix sein... :|
Ja, Null stand da.

Zitat:

Zitat von himitsu
Delphi-Quellcode:
Procedure TForm1.CreateTimers(Sender: TObject);
  Var Timer: TTimer;
    frconfig: TIniFile; // sowas sollte man doch eher lokal definieren
    i, j: Integer;

Hab gelernt dass man die Ini Global machen sollte wenn man sie öfter braucht.

Aber danke, ich denk so wirds gehen. :)
Echt nett hier das Forum! :D

himitsu 6. Apr 2004 14:35

Re: Welcher Timer
 
Es geht in diesem Fall auch mit nur einer Variable, da es sich hier nur um einen Zeiger auf den mit TTimer.Create(Form1) erstellten Timer.

OK, wenn du später drauf zugreifen willst, dann sollte natürlich das Array für die Timer Global definiert sein, oder du greifst nicht über die Zeiger in einem Timer-Array zu, sondern läßt dir den entsprechenden Timer suchen.

Das mit der INI: Wenn du es so gelernt hast, dann mach es halt so - Delphi ist ja flexiebel und es gibt ja mehrere Möglichkeiten, die nicht unbedingt Falsch sind ^^


Über ein Timer-Array:
Delphi-Quellcode:
Type TForm1 = Class(TForm)
    ...
  Private
    Procedure TimerEvent(Sender: TObject);
  End;

Var Timer: Array of TTimer;


Procedure TForm1.CreateTimers(Sender: TObject);
  Var frconfig: TIniFile;
    i, j: Integer;

  Begin
    frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'frconfig.ini');
      i := frconfig.ReadInteger('Counter', 'Foren', 0);
      SetLength(Timer, i);
      For j := 1 to i do Begin
        Timer[i - 1] := TTimer.Create(Form1);
        Timer[i - 1].Interval := frconfig.ReadInteger('Foren', 'Timer' + IntToStr(j), 0);
        Timer[i - 1].Tag := j;
        Timer[i - 1].Enabled := True;
        Timer[i - 1].OnTimer := TimerEvent;
      End;
    frconfig.Free;
  End;

Procedure TForm1.TimerEvent(Sender: TObject);
  Begin
    ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag));
  End;

Procedure ...
  Begin
    Timer[0].Enabled := False; // Timer1
    Timer[1].Enabled := False; // Timer2
  End;
Ohne Timer-Array:
Delphi-Quellcode:
Type TForm1 = Class(TForm)
    ...
  Private
    Procedure TimerEvent(Sender: TObject);
  End;


Procedure TForm1.CreateTimers(Sender: TObject);
  Var frconfig: TIniFile;
    Timer: TTimer;
    i, j: Integer;

  Begin
    frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'frconfig.ini');
      i := frconfig.ReadInteger('Counter', 'Foren', 0);
      SetLength(Timer, i);
      For j := 1 to i do Begin
        Timer := TTimer.Create(Form1);
        Timer.Name := 'Timer' + IntToStr(j);
        Timer.Interval := frconfig.ReadInteger('Foren', 'Timer' + IntToStr(j), 0);
        Timer.Tag := j;
        Timer.Enabled := True;
        Timer.OnTimer := TimerEvent;
      End;
    frconfig.Free;
  End;

Procedure TForm1.TimerEvent(Sender: TObject);
  Begin
    ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag));
  End;

Procedure ...
  Var Timer: TTimer;

  Begin
    Timer := TTimer(Form1.FindComponent('Timer' + IntToStr(1)));
    Timer.Enabled := False; // Timer1
    {oder}
    TTimer(Form1.FindComponent('Timer' + IntToStr(2))).Enabled := False; // Timer2
  End;
Ohne Timer-Variable:
Delphi-Quellcode:
Type TForm1 = Class(TForm)
    ...
  Private
    Procedure TimerEvent(Sender: TObject);
  End;


Procedure TForm1.CreateTimers(Sender: TObject);
  Var frconfig: TIniFile;
    i, j: Integer;

  Begin
    frconfig := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'frconfig.ini');
      i := frconfig.ReadInteger('Counter', 'Foren', 0);
      SetLength(Timer, i);
      For j := 1 to i do
        With TTimer.Create(Form1) do Begin
          Name := 'Timer' + IntToStr(j);
          Interval := frconfig.ReadInteger('Foren', 'Timer' + IntToStr(j), 0);
          Tag := j;
          Enabled := True;
          OnTimer := TimerEvent;
        End;
    frconfig.Free;
  End;

Procedure TForm1.TimerEvent(Sender: TObject);
  Begin
    ShowMessage('Ich bin Timer: ' + IntToStr(TTimer(Sender).Tag));
  End;

Procedure ...
  Var Timer: TTimer;

  Begin
    Timer := TTimer(Form1.FindComponent('Timer' + IntToStr(1)));
    Timer.Enabled := False; // Timer1
    {oder}
    TTimer(Form1.FindComponent('Timer' + IntToStr(2))).Enabled := False; // Timer2
  End;

ThunderX86 6. Apr 2004 16:10

Re: Welcher Timer
 
Danke für die Hilfe, klingt alles einleuchtend. :)
Nur muss ich mein Prog nochmal neu Anfangen (saß jetzt 3 Tage dran, aber da ich mich jetzt "auskenne" sollte ich das in ein paar Stunden schaffen) weil ich zu viele Fehler durch ausprobieren eingebaut habe.

Ich hoffe dass ich das jetzt schaffe, THX!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.
Seite 2 von 2     12   

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