Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TTimer.OnTimer ersetzen (https://www.delphipraxis.net/72247-ttimer-ontimer-ersetzen.html)

fLaSh11 27. Jun 2006 16:55


TTimer.OnTimer ersetzen
 
Hallo,

ich habe folgendes Problem (wie kann ich es am einfachsten lösen?):

Ich habe eine Unit gemacht und ein Timer "created" :stupid:.
Nun will ich als Timer1.OnTimer eine selbst gemachte Prozedur setzen, wie geht das?

//Edit: ich habe keine Lust ein TNotifyEvent zu machen, etc.
:wiejetzt:

Für schnelle Hilfe bin ich immer dankbar! :wink:

mkinzler 27. Jun 2006 16:57

Re: TTimer.OnTimer ersetzen
 
Und warum nicht? Du brauchst doch nur eine Methode mit der selben Signatur erzeugen und diese der Property zuweisen.

fLaSh11 27. Jun 2006 17:00

Re: TTimer.OnTimer ersetzen
 
ich wollte es so machen:
Delphi-Quellcode:
//...
Timer1.OnTimer:=func1;
//...

procedure func1;
begin
  //blah
end;
so funzt es nicht! Was muss ich ergänzen? :)

Neutral General 27. Jun 2006 17:01

Re: TTimer.OnTimer ersetzen
 
Delphi-Quellcode:
type
 TForm1 = class(TForm)
  ...
  public
   procedure Timern(Sender: TObject);
 end;
 
var
 ATimer: TTimer;

procedure TForm1.Timern(Sender: TObject);
begin
 // Irgendwas;
end;

procedure Wasweißich;
begin
ATimer := TTimer.Create(*Parameter?!*);
ATimer.Intervall := 100;
ATimer.OnTimer := Timern;
end;
Meinst du das ? :)

Gruß
Neutral General

fLaSh11 27. Jun 2006 17:04

Re: TTimer.OnTimer ersetzen
 
achso, muss es eine public procedure sein, ich habe nämlich leider keine Form in meiner Unti deklariert...

Neutral General 27. Jun 2006 17:08

Re: TTimer.OnTimer ersetzen
 
Ich glaube schon :(
Ich habs mal ohne probiert und es ging nicht.. aber das geht mit Sicherheit auch ohne das die Procedure in einer Klasse drin ist .. oder ?

mkinzler 27. Jun 2006 17:12

Re: TTimer.OnTimer ersetzen
 
Zitat:

achso, muss es eine public procedure sein, ich habe nämlich leider keine Form in meiner Unti deklariert...
Es muß ne Methode sein. Die Klasse ist egal du kannst auch eine Dummy-Klasse mit einer Methode mit TNotifyEvent-Signatur erzeuge und diese zuordnen.

SirThornberry 27. Jun 2006 17:13

Re: TTimer.OnTimer ersetzen
 
es muss nicht im Public sein, aber es muss auf jeden Fall eine Methode (Procedure eines Objectes) sein.
Wenn du kein Form hast, hast du dann wenigstens eine Nachrichtenschleife? Ansonsten arbeitet der Timer auch nicht richtig.
Im übrigen kannst du dir auch eine Hilfsklasse schreiben.
Delphi-Quellcode:
type
  THelpClass = class(TObject)
  public
    procedure TimerEventProc(Sender: TObject);
  end;
[...]
procedure THelpClass.TimerEventProc(Sender:TObject)
begin
  //Do something
end;
[...]
helpinstance := THelpClass.Create;
Timer.OnTimer = helpinstance.TimerEventProc;
Es gibt auch eine Möglichkeit ohne Methode. Dabei sollte man jedoch wissen das man macht. Und wenn man das weiß kommt man selbst auf die Idee. (Man sollte wissen was der Intern der Unterschied zwischen einer Methode und einer Procedure ist)

alleinherrscher 27. Jun 2006 17:14

Re: TTimer.OnTimer ersetzen
 
Sagt mal, wenn man ne Unit ohne Form hat: TTimer.Create erwartet als Parameter TComponent. Was gebe ich ihm da an? Kann ich das einfach durch "NIL" ersetzten?

SirThornberry 27. Jun 2006 17:15

Re: TTimer.OnTimer ersetzen
 
genau, einfach nil übergeben. Der Owner dient ja lediglich dazu das die Komponente automatisch zerstört wird bzw. per FindComponent gefunden wird.

mkinzler 27. Jun 2006 17:16

Re: TTimer.OnTimer ersetzen
 
Zitat:

Sagt mal, wenn man ne Unit ohne Form hat: TTimer.Create erwartet als Parameter TComponent. Was gebe ich ihm da an? Kann ich das einfach durch "NIL" ersetzten?
Grundsätzlich ja. Aber ich würde Komponenten nicht unabhängig von einer Form einsetzen.

Muetze1 27. Jun 2006 17:16

Re: TTimer.OnTimer ersetzen
 
Natürlich muss sie Public oder Published sein, schliesslich woll ihr sie doch von ausserhalb der Klasse zuweisen - und dort sind nunmal nur öffentliche und veröffentlichte Methoden sichtbar. Ansonsten könnt ihr die Methode auch Private oder Protected deklarieren, dann müsst ihr sie nur halt innerhalb der Klasse zuweisen.

Nehmt doch eine statische Methode, dann könnt ihr euch das Instanz erstellen auch sparen...

Delphi-Quellcode:
Type
  TStaticHelper = Class
  Public
    Class Procedure MyOnTimer(Sender: TObject);
  End;

...

Procedure TStaticHelper.MyOnTimer(Sender: TObject);
Begin
  ShowMessage('Schon da');
End;

Begin
  Timer.OnTimer := TStaticHelper.MyOnTimer;
End.
Und vor allem spart ihr euch dies rumgematsche und gefake mit den "ich mache mir eine Procedure und tarne sie als Methode".

/EDIT: *Argh* Da nölt man rum und macht es selber nicht mal richtig... :wall: :wall:

Hawkeye219 27. Jun 2006 17:34

Re: TTimer.OnTimer ersetzen
 
Thomas, du hast das class vergessen:

Delphi-Quellcode:
Type
  TStaticHelper = Class
  Public
    class Procedure MyOnTimer(Sender: TObject); // <-- hier class
  End;

...

class Procedure TStaticHelper.MyOnTimer(Sender: TObject); // <-- hier class
Begin
  ShowMessage('Schon da');
End;

Begin
  Timer.OnTimer := TStaticHelper.MyOnTimer;
End.
Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 Uhr.

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