Autor Beitrag
locutus2k5
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 33

Windows Vista Ultimate
BDS2005
BeitragVerfasst: Di 23.10.07 17:57 
Hallo!

wie kann man dynamisch Timer erzeugen, wobei die Anzahl der Timer erst zur Laufzeit bekannt wird?
Habe es mit der API "SetTimer" versucht und mittels MESSAGES das Event abgefangen, jedoch funktioniert das ganze nicht...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Type
  ...
  procedure WMTimer(Var Message: TWMTimer); message WM_TIMER;
  ...


...


procedure XY...
var IDTIMER,I: Integer;
begin
  for i:=0 To Count Do
  begin
    IDTIMER := 30000+I;
    SetTimer(hwnd, IDTIMER, 1000nil);
  end;
end;
...
Saubäär
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 376



BeitragVerfasst: Di 23.10.07 20:00 
Hallo locutus2k5,

es wäre interessant zu wissen, wie du die Events abfängst. Du vergibst außerdem immer das gleiche Intervall. Vielleicht hilft dir das Stückchen Code ein bisschen weiter.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
    procedure WM_TIMER(var Message: TWMTimer); message WM_TIMER;
...
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
 for i := 1 to 2 do begin
  SetTimer(Handle, i, i * 1000nil); // TimerID und Intervall setzen
 end;
end;

procedure TForm1.WM_TIMER(var Message: TWMTimer);
begin
 case Message.TimerID of
  // Beispiel
  1: Caption := IntToStr(StrToInt(Caption) + 1);
  2: Caption := IntToStr(StrToInt(Caption) - 3);
  end;
end;


Gruß
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Di 23.10.07 23:09 
Wenn du unbedinkt mit Timern arbeiten willst:
1) Dynamisches Array of TTimer.
2) Länge setzen und Timer initialisieren
3) TimerX.onTimer := aProcedure (procedure aProcedure(Sender: TObject); und teil vom Typ TForm1 )

Aber du kannst eigentlich *immer* auf mehr als 1 Timer verzichten, du kannst normalerweise alle Timer-Prozeduren in eine zusammenfassen.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
locutus2k5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 33

Windows Vista Ultimate
BDS2005
BeitragVerfasst: Fr 26.10.07 15:29 
Okay, die Timer werden ja dynamisch erzeugt, freilich, die ID ist auch immer ne andere, aber irgendwo muss ich einen Fehler haben, bekomme nämlich kein Event ausgelöst. Aber erstmal Danke!
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 26.10.07 19:16 
Also nochmal:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
uses {...},ExtCtrls;
//---
var Timer1: TTimer;

Procedure TForm1.TimerEvent(Sender: TObject);
begin
   Showmessage('moin!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Timer1 := TTimer.Create(self);
   Timer1.Interval := 1000;
   Timer1.onTimer := TimerEvent;
   Timer1.Enabled := true;
end;

Klappt bei mir 1 A.

Das da wiederhole ich nochmal:
user profile iconJayEff hat folgendes geschrieben:
Aber du kannst eigentlich *immer* auf mehr als 1 Timer verzichten, du kannst normalerweise alle Timer-Prozeduren in eine zusammenfassen.

Ganz gleich, wieviele Timer ein PC verkraftet, es macht einfach keinen Sinn, mehr als einen, vielleicht maximal 4 zu nehmen.
Setze den Interval des Timers auf den ggT der Intervalle, die du brauchst und schreibe in den Timer etwas wie das folgende:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var i: integer;
begin
   inc(i);
   if i mod 3 = 0 then
      TimerEvent1;
   if i mod 5 = 0 then
      TimerEvent2;
//etc
end;

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
locutus2k5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 33

Windows Vista Ultimate
BDS2005
BeitragVerfasst: Fr 26.10.07 22:41 
Okay, jetzt Versuch mal den Timer mittels SetTimer anzulegen und versuch mal ein event abzufangen...
Saubäär
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 376



BeitragVerfasst: Sa 27.10.07 00:30 
Hallo,

wo liegt denn das Problem? Der Code aus meinem ersten Post funktioniert doch einwandfrei - oder etwa nicht? Wie hast du denn die Methode "WMTimer" deklariert? Deklariere sie als Methode deiner Form, dann sollte das eigentlich klappen.

Gruß
locutus2k5 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 33

Windows Vista Ultimate
BDS2005
BeitragVerfasst: Sa 27.10.07 09:40 
@Saubäär: der letzte Post war vielmehr für JayEff gedacht als für dich ;-)