Delphi-PRAXiS

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 TTimer - OnTimer Event wird nicht ausgeführt (https://www.delphipraxis.net/30416-ttimer-ontimer-event-wird-nicht-ausgefuehrt.html)

unerwartet 24. Sep 2004 13:49


TTimer - OnTimer Event wird nicht ausgeführt
 
Hallo,

ich habe folgenden Code (in Ausschnitten):

Delphi-Quellcode:
type
   TAgentStatusLogger = class(TObject)
      private
               saveTimer: TTimer;
      public
         procedure saveLogList(Sender: TObject);
         constructor Create(LogFile: string);
    end;

implementation

constructor TAgentStatusLogger.Create(LogFile: string);
begin
  inherited Create;

  saveTimer:= TTimer.Create(nil);
  saveTimer.OnTimer:= saveLogList;
  saveTimer.Interval:= 20;
  saveTimer.Enabled:= True;
end;

procedure TAgentStatusLogger.saveLogList(Sender: TObject);
begin
  ...
end;
Nun bin ich darauf gestoßen, dass TTImer ja unbedingt ein TComponent übergeben bekommen möchte. Da ich kein solches habe, hab ich einfach mal nil übergeben. Hat nicht funktioniert. Problem ist, das die Methode saveLogList nie aufgerufen wird. Ich dachte mir dass es vlt. genau daran liegt und habe meine Klasse testweise von TComponent abgeleitet und Self an den TTimer Konstruktor übergeben, aber auch da wird das OnTimer-Ereignis nicht ausgelöst. Was kann ich hier falsch gemacht haben?

Gruß
Marco

nailor 24. Sep 2004 13:52

Re: TTimer - OnTimer Event wird nicht ausgeführt
 
an dem owner, der im konstruktor übergeben wird, sollte es eigentlich nicht liegen. der wird ja erst beim destroy wieder gebraucht. da muss was anderes faul sein.

jfheins 24. Sep 2004 13:58

Re: TTimer - OnTimer Event wird nicht ausgeführt
 
Bei mir geht das ohne Probleme, du must da irgendwas anderes falsch gemacht haben ...
Hier mein Code:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TAgentStatusLogger = class(TObject)
      private
               saveTimer: TTimer;
      public
         procedure saveLogList(Sender: TObject);
         constructor Create(LogFile: string);
    end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TAgentStatusLogger.Create(LogFile: string);
begin
  inherited Create;

  saveTimer:= TTimer.Create(nil);
  saveTimer.OnTimer:= saveLogList;
  saveTimer.Interval:= 20;
  saveTimer.Enabled:= True;
end;

procedure TAgentStatusLogger.saveLogList(Sender: TObject);
begin
 Beep;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TAgentStatusLogger.Create('Hallo');
end;

end.

Sprint 24. Sep 2004 14:23

Re: TTimer - OnTimer Event wird nicht ausgeführt
 
Zitat:

Zitat von unerwartet
Nun bin ich darauf gestoßen, dass TTImer ja unbedingt ein TComponent übergeben bekommen möchte. Da ich kein solches habe, hab ich einfach mal nil übergeben. Hat nicht funktioniert. Problem ist, das die Methode saveLogList nie aufgerufen wird. Ich dachte mir dass es vlt. genau daran liegt und habe meine Klasse testweise von TComponent abgeleitet und Self an den TTimer Konstruktor übergeben, aber auch da wird das OnTimer-Ereignis nicht ausgelöst. Was kann ich hier falsch gemacht haben?

Die TTimer Komponente führt die WinAPI Funktion SetTimer aus. Windows will eine WM_TIMER Nachricht an ein Fenster schicken.
Aber wo soll die Nachricht hingeschickt werden? ;)
Kannst dir da ja mal paar Gedanken drum machen.

alcaeus 24. Sep 2004 14:40

Re: TTimer - OnTimer Event wird nicht ausgeführt
 
Hi Marco,

Zitat:

Zitat von unerwartet
Nun bin ich darauf gestoßen, dass TTImer ja unbedingt ein TComponent übergeben bekommen möchte. Da ich kein solches habe, hab ich einfach mal nil übergeben. Hat nicht funktioniert. Problem ist, das die Methode saveLogList nie aufgerufen wird. Ich dachte mir dass es vlt. genau daran liegt und habe meine Klasse testweise von TComponent abgeleitet und Self an den TTimer Konstruktor übergeben, aber auch da wird das OnTimer-Ereignis nicht ausgelöst. Was kann ich hier falsch gemacht haben?

Der Parameter den du übergeben musst ist der Owner. Falls du nil übergibst, bist du selbst dafür verantwortlich, den verwendeten Speicher (also das TTimer-Objekt) wieder freizugeben. Gibst du hingegen z.B. Form1 oder self an, so wird das Objekt beim zerstören des Owners (also Form1 oder self) auch zerstört. Mit der Funktionsweise des Timers hat dies nicht zu tun.
Prüfe aber mal, ob der Timer auch erstellt wird, nachdem es ja bei Julius einwandfrei funktioniert.

Greetz
alcaeus

teebee 24. Sep 2004 14:49

Re: TTimer - OnTimer Event wird nicht ausgeführt
 
Zitat:

Zitat von Sprint
Die TTimer Komponente führt die WinAPI Funktion SetTimer aus. Windows will eine WM_TIMER Nachricht an ein Fenster schicken.
Aber wo soll die Nachricht hingeschickt werden? ;)
Kannst dir da ja mal paar Gedanken drum machen.

Ein TTimer erzeugt sein eigenes Fenster-Handle mit enstprechender Window-Prozedur, ist also nicht das Problem.

Gruß, teebee

unerwartet 24. Sep 2004 14:50

Re: TTimer - OnTimer Event wird nicht ausgeführt
 
Also ein bisschen näher bin ich dem Problem gerade gekommen.
Julius hat den Timer ja in der gleichen Unit deklariert wie sein Formular. Bei mir war das in einer eigenen Unit. Ich hab testweise den Code in die Hauptunit kopiert und dann wird das ganze auch aufgerufen. Nur ist mir nicht klar, wo da der Unterschied sein soll. In beiden Fällen sind es ja immer noch getrennte Klassen. Habt ihr irgendwelche Ideen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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