Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TTimer dynamisch erstellen und Event zuweisen...


knightkiller - Mo 15.07.02 11:17
Titel: TTimer dynamisch erstellen und Event zuweisen...
Wie kann ich einen TTimer dynamisch kreieren und einen Event zuweisen?

bekomme beim Event zuweisen immer:

Quelltext
1:
[Error] Unit1.pas(118): Incompatible types: method pointer and regular procedure                    


Habe ein Formular auf dem keine Funktionen und kein Timer sein darf und muss einen Timer haben, den ich nun in einer Unit kreieren, den Event zuweisen und starten will

hoffe irgend jemand verteht was ich meine


wwerner - Mo 15.07.02 11:20

http://home.pages.at/dbr-software/delphi/timer.htm


knightkiller - Mo 15.07.02 11:23

Danke funktioniert!!!


Freiberger - Fr 08.06.07 20:28

Hy,
ich habe genau das gleiche Problem.
Aber diese Seite gibt es leider nicht mehr.

Hat jemand ne Idee ?


HelgeLange - Fr 08.06.07 20:31

Timer ist eine nicht-visuelle Komponente, kann man also beruhigt drauflegen.
Ansonsten geht es über :


Delphi-Quelltext
1:
2:
Timer1 := TTimer.Create(Self);
Timer1.OnTimer := OnTimer1;


und irgendwo im Form-code dann noch eine OnTimer1 deklarieren als member vom Form (weil das event eine procedure of object erwartet...


Freiberger - Fr 08.06.07 20:39

Irgendwie bin ich zu blöd dazu.

Ich habe mein Programm mit der Form1.
Dazu habe ich eine extra Unit eingebunden.

Wenn ich in der Unit eine bestimme Procedure aufrufe, soll ein Timer gestartet werden.
Mit TTimer.create(self) bekomme ich nur Fehler.

In der Haupt-Unit funktioniert es mit TM1:= TTimer.create(self);

Aber in der anderen Unit kommt
"Undefinierter Bezeichner (self)" !!!

Der Timer muß aber in der Unit sein, da diese Unit auch von anderen Programmen genutzt werden soll...


Narses - Fr 08.06.07 20:56

Moin!

Übergib beim .Create halt NIL, aber dann mußt du die Komponente auch selbst wieder freigeben. :mahn: ;)

cu
Narses


HelgeLange - Fr 08.06.07 21:00

Wenn man den timer selbst erstellt, auch innerhalb des Formulars, sollte man ihn auch selber freigeben...


Freiberger - Fr 08.06.07 21:01

Heee, es klappt.
Dankeschön. Es sind eben manchmal die ganz einfachen Sachen...


Freiberger - Fr 08.06.07 21:14

OK, zu früh gefreut...
das Event kann ich auch nicht zuweisen...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Procedure Start();
begin
      TM:= TTimer.create(NIL);
      TM.OnTimer:= OnTM;                   <---   
      TM.Interval:= 1000;
      TM.Enabled:= true;
end;

procedure OnTM();
begin
      beep;
end;


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


alias5000 - Fr 08.06.07 21:18

Das Ereignis OnTimer ist ein TNotifyEvent. Das ist dasselbe, wie z.B. beim OnClick eines TButton.
Demnach muss deine Ereignismethode noch den Parameter "Sender: TObject" beinhalten.

Gruß
alias5000


Freiberger - Fr 08.06.07 21:23

OK


Delphi-Quelltext
1:
TM.OnTimer:= OnTM(Sender: TObject);                    


Aber da kommt OnTM ist Undefinierter Bezeichner.
auch mit OnTM:= TNotifyEvent; geht es nicht...

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


HelgeLange - Fr 08.06.07 21:27

wie schon erwähnt wurde, MUSS ein event eine objekt-Methode sein
Also geht nicht :


Delphi-Quelltext
1:
procedure OnTimer1(Sender: TObject);                    


es muss etwas sein wie


Delphi-Quelltext
1:
procedure Form1.OnTimer1(Sender: TObject);                    


Freiberger - Fr 08.06.07 21:29

Also kann ich kein Ereignis definieren, da die extra Unit je keine Form hat...
Oder wie ?


alias5000 - Fr 08.06.07 21:36

Naja, das muss halt in einem Objekt sein. Das muss nicht zwingend eine Form sein.
Mach dir ne neue Unit auf und schreibe folgendes, es wird funktionieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
unit einszweidrei;

interface

uses...;

type
class test = class(TObject)
private
  fTimer: TTimer;
public
  constructor Create;
  destructor Destroy; override;
  procedure TimerTimer(Sender: TObject);
end;

implementation

constructor Create;
begin
fTimer := TTimer.Create(...);
fTimer.OnTimer := TimerTimer;
...
end;

destructor Destroy;
begin
fTimer.free;
end;

procedure TimerTimer(Sender: TObject);
begin
//tu was
end;


Das kannst du natürlich nicht 1:1 kopieren, sollst du ja auch nicht.
Aber ich hoffe dir ist das Prinzip dan klarer, dass das halt eine Methode aus irgendeinem Objekt sein muss

Gruß
alias5000

Edit: Methode TimerTimer in der Implementation vergessen


Freiberger - Fr 08.06.07 21:39

OK, ich versuche es morgen mal.
Muß jetzt leider weg. Aber langsam steige ich dahinter...
Vielen Dank erstmal... :D


Lannes - Fr 08.06.07 23:27

Hallo,

user profile iconFreiberger hat folgendes geschrieben:
Hy,
ich habe genau das gleiche Problem.
Aber diese Seite gibt es leider nicht mehr.

Doch die Seite gibt es noch :)
http://www.dbr-software.de/delphi/timer.php


-Pl- - Sa 09.06.07 22:15

http://www.delphi-forum.de/viewtopic.php?t=59963&postdays=0&postorder=asc&start=20

Ich hatte am Ende das gleiche Problem, ist allerdings ein wenig unübersichtlich, das Problem ist aber gelöst.


Freiberger - Mo 11.06.07 19:05

Hy,
danke für die vielen Antworten.
Leider habe ich das mit CLASS nicht ganz hinbekommen.
Es ging alles, außer bei der ONTimer Zuweisung.

Aber mit http://www.dbr-software.de/delphi/timer.php hat es wunderbar geklappt.

DANKESCHÖN...