Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Fehler bei Erzeugung TTimer zur Laufzeit (https://www.delphipraxis.net/206611-fehler-bei-erzeugung-ttimer-zur-laufzeit.html)

weinberger 12. Jan 2021 11:03

Fehler bei Erzeugung TTimer zur Laufzeit
 
Hallo,

ich möchte eine TTimer-Komponente zur Laufzeit erzeugen und OnTimer zuweisen. Dabei bekomme ich die Folgende Fehlermeldung:

[dcc32 Fehler] Main1.pas(8041): E2010 Inkompatible Typen: 'TNotifyEvent' und 'procedure, untyped pointer or untyped parameter'

Hier der Quelltext (Auszüge)

type
TMain = class(TForm)
.
.
.
procedure MyTimer(Sender: TObject);
.
.
.

implementation

uses ....



{$R *.DFM}
.
.
.
.

procedure TMain.MyTimer(Sender: TObject);
begin
MessageDlg('15Min um!', mtInformation, [mbOk], 0, mbOk);
end;

.
.
.

procedure TMain.BitBtn267Click(Sender: TObject);
var
edTimer: TTimer;
begin
//Timer mit 15 Min starten
if TTimer(FindComponent('Timer1')) = Nil then
begin
edTimer := TTimer.Create(Self);
edTimer.Enabled := False;
edTimer.Name := 'Timer1';
edTimer.Interval := 3240000;
edTimer.OnTimer := MyTimer(Self);
edTimer.Enabled := True;
end;
end;

Habe hier im Forum schon gesucht aber nichts brauchbares gefunden.
Kann mir da jemand helfen?

DeddyH 12. Jan 2021 11:09

AW: Fehler bei Erzeugung TTimer zur Laufzeit
 
Benutze künftig bitte Delphi-Tags, dann ist der Code besser lesbar. Zum Problem:
Delphi-Quellcode:
edTimer.OnTimer := MyTimer(self);
-->
edTimer.OnTimer := MyTimer;

weinberger 12. Jan 2021 13:16

AW: Fehler bei Erzeugung TTimer zur Laufzeit
 
Danke jetzt gehts :-D

himitsu 12. Jan 2021 14:38

AW: Fehler bei Erzeugung TTimer zur Laufzeit
 
Delphi-Quellcode:
:= MyTimer
entspricht implizit einem
Delphi-Quellcode:
:= @MyTimer;
(speichere den Zeiger auf diese Methode),

aber
Delphi-Quellcode:
MyTimer(irgendwas)
ist ein Aufruf dieser Funkton/Prozedur und hier wird das "Result" der Funktion für die Zuweisung verwendet (rufe Funktion auf und speicher das, was sie zurückliefert).
Und natürlich stimmt die Signatur des "nichtvorhandenen" Results nicht mit dem Typ der Variable des Property überein, was dann der Compiler auch richtig bemängelt hat.

haentschman 12. Jan 2021 15:21

AW: Fehler bei Erzeugung TTimer zur Laufzeit
 
Moin...:P

Delphi-Quellcode:
if TTimer(FindComponent('Timer1')) = Nil then
...warum erst auf der Form/Datamodule gucken und dann den Timer dynamisch erzeugen? Du mußt doch wissen was du auf die Form gepackt hast. Wenn du keinen Timer auf der Form hast, dann ist die Zeile überflüssig... :zwinker:

PS: weißt du eigentlich noch was "BitBtn267" ist? :shock:

PS:
1. Mit dem Button erzeugst du jedesmal einen neuen Timer. Die Timer werden aber erst mit der Anwendung freigegeben! :roll:
2. Die erzeugten Timer werden nie angehalten!
3. Wenn du 3 Mal gedrückt hast, hast du 3 Timer die "regelmäßig" nach 15min nach ihrem Start das Event auslösen!

bernau 12. Jan 2021 16:04

AW: Fehler bei Erzeugung TTimer zur Laufzeit
 
Zitat:

Zitat von haentschman (Beitrag 1480857)
Moin...:P

Delphi-Quellcode:
if TTimer(FindComponent('Timer1')) = Nil then
...warum erst auf der Form/Datamodule gucken und dann den Timer dynamisch erzeugen? Du mußt doch wissen was du auf die Form gepackt hast. Wenn du keinen Timer auf der Form hast, dann ist die Zeile überflüssig... :zwinker:

PS: weißt du eigentlich noch was "BitBtn267" ist? :shock:

PS:
1. Mit dem Button erzeugst du jedesmal einen neuen Timer. Die Timer werden aber erst mit der Anwendung freigegeben! :roll:
2. Die erzeugten Timer werden nie angehalten!
3. Wenn du 3 Mal gedrückt hast, hast du 3 Timer die "regelmäßig" nach 15min nach ihrem Start das Event auslösen!

So wie ich das sehe wird mit dem Button der Timer genau ein einziges mal erzeugt. Danach gibt die Funktion
Delphi-Quellcode:
if TTimer(FindComponent('Timer1')) = Nil
immer false zurück und der Zweig, im dem ein neuer Timer zugefügt wird, wird nicht durchlaufen.

haentschman 13. Jan 2021 06:15

AW: Fehler bei Erzeugung TTimer zur Laufzeit
 
Moin...:P
Delphi-Quellcode:
if TTimer(FindComponent('Timer1')) = Nil
...imho findet FindComponents nur die statisch auf der Form liegenden Components. Die dynamisch erzeugten sind nicht im Components Array...oder? :gruebel:
http://docwiki.embarcadero.com/Libra....FindComponent

DeddyH 13. Jan 2021 06:47

AW: Fehler bei Erzeugung TTimer zur Laufzeit
 
AFAIK sind diejenigen Komponenten im Components-Array, deren Owner die jeweilige Komponente ist. Äquivalent dazu sind diejenigen im Controls-Array, deren Parent sie ist. Ob sie zur Lauf- oder Designzeit angelegt wurden spielt dabei keine Rolle. Sollte ich mich irren, bitte korrigieren.

haentschman 13. Jan 2021 06:59

AW: Fehler bei Erzeugung TTimer zur Laufzeit
 
Zitat:

Ob sie zur Lauf- oder Designzeit angelegt wurden spielt dabei keine Rolle
...aha, der Owner/Parent ist ausschlaggebend...again what learned. :stupid:

himitsu 13. Jan 2021 15:47

AW: Fehler bei Erzeugung TTimer zur Laufzeit
 
Owner -> Components
Parent -> Controls

PS: Delphi-Referenz durchsuchenFindControl :angle:



Delphi-Quellcode:
C := TC.Create(X); -> X.Components[] und X.FindComponent(C.Name) // ab TComponent
C.Parent := X; -> X.Controls[] und X.FindControl(C.Name) // ab TWinControl


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr.

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