Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TNotifyEvent (https://www.delphipraxis.net/38213-tnotifyevent.html)

glkgereon 16. Jan 2005 11:10


TNotifyEvent
 
also

ich erstelle mit dynamisch nen timer, und möchte dem OnTimer jetzt eine procedure zuweisen

wie geht das?

ich hab folgende sachen probiert(nur damit ihr net danek ich hätte nix gemacht *ggg*):

Delphi-Quellcode:
procedure OnTimer(Sender: TObject);

Timer.OnTimer:=OnTimer;
Timer.OnTimer:=OnTimer^;
Timer.OnTimer:=@OnTimer;
Timer.OnTimer:=TNotifyEvent(OnTimer);
Timer.OnTimer:=TNotifyEvent(OnTimer^);
Timer.OnTimer:=TNotifyEvent(@OnTimer);
Timer.OnTimer:=TNotifyEvent(OnTimer(Timer));
Timer.OnTimer:=TNotifyEvent(OnTimer(Timer)^);
Timer.OnTimer:=TNotifyEvent(OnTimer^(Timer));
Timer.OnTimer:=TNotifyEvent(@OnTimer(Timer));
wie geht das?

Nightshade 16. Jan 2005 11:22

Re: TNotifyEvent
 
Wichtig ist nur, das MyOnTimer mit zum TForm1 gehört.


Delphi-Quellcode:
uses ExtCtrls;

procedure TForm1.FormCreate(Sender: TObject);
var
  timer : TTimer;
begin
  Timer := TTimer.Create(self);
  Timer.OnTimer := MyOnTimer;
end;

procedure TForm1.MyOnTimer(Sender : TObject);
begin
  // Do something....
end;

glkgereon 16. Jan 2005 11:25

Re: TNotifyEvent
 
hmm, nee, das is ne konsolenanwendung...

was kann/muss/soll ich da statt der form1 nehmen?

ich hatte biher als owner den timer selbst angegeben....muss da dann die Application rein???

mirage228 16. Jan 2005 11:30

Re: TNotifyEvent
 
Hi,

TNotifyEvent ist eine procedure of object, d.h., dass sie darauf "ausgelegt" ist, in einer Klasse zu sein. Sie beinhaltet nämlich noch den versteckten "Self" Paramter.

Du hast folgende Möglichkeiten:
  • Du packst Sie als (class)-Procedure in eigene Klasse
  • Du machst es so:
    Delphi-Quellcode:
    procedure MyOnTimer(Self, Sender : TObject);
    begin
      // Do something....
    end;

    var
      Event: TNotifyEvent;
    begin
      TMethod(Event).Code := @MyOnTimer;
      TMethod(Event).Data := nil; // Self in der procedure ist dann = nil!
      // ...
      Timer.OnTimer := Event;
    end.

mfG
mirage228

Luckie 16. Jan 2005 11:45

Re: TNotifyEvent
 
Guckst du hier: http://www.luckie-online.de/Delphi/S...onsole%20.html

Aber eine Suche im Forum nach Hier im Forum suchenTimer Konsole wäre auch nicht falsch gewesen.

SirThornberry 16. Jan 2005 11:48

Re: TNotifyEvent
 
Macht ein Timer in einer Console überhaupt Sinn? Bei der Delphistandard Konsolenanwendung existiert doch gar keine Nachrichtenschleife in dem sinne. also funktioniert der Timer überhaupt in eine Konsolenanwendung? Die Callbackmessage geht ja schon an den Timer aber die messages kommen ja dann eigentlich von der Anwendungs-Nachrichtenschleife oder lieg ich da total falsch?

glkgereon 16. Jan 2005 12:24

Re: TNotifyEvent
 
hmm, scheint wirklich so....

kannich wirklich keinen timer nehmen?

gibt es sowas wie keyhit? oder KeyPressed?

jbg 16. Jan 2005 15:48

Re: TNotifyEvent
 
Zitat:

Zitat von glkgereon
gibt es sowas wie keyhit? oder KeyPressed?

Du solltest dich mit den Windows.XxxConsoleXxx Funktionen mal auseinandersetzen.

Mit Windows.SetTimer kannst du eine Prozedur angeben, die anstatt einer WM_TIMER Message aufgerufen werden soll. Den Timer solltest du dann aber auch mit KillTimer wieder freigeben.


@Luckie:
Zitat:

Guckst du hier: ...
War das ein anderes Delphi, oder warum deklarierst du TMethodPointer wenn es bereits in System.pas ein TMethod gibt?

RalfOne 7. Jun 2005 10:46

Re: TNotifyEvent
 
Hallo zusammen,

ich habe jetzt schon alles gelesen und auch in der Suche mich bemüht etwas zu finden aber irgendwie finde ich nicht das passende womit ich persönlich weiterkomme.
Also ich habe folgendes problem.
Ich habe eine Konsolenanwendung welche immer laufen muss.
Also bilde ich eine Endlosschleife.
In dieser Endlosschleife würde ich gerne auf den OnTimer reagieren. Dies klappt aber leider nicht!
Dieser wird immer ignoriert!
Das auslagern in einem Thread habe ich auch probiert klappt aber bei mir leider auch nicht?!!
Warum keine Ahung........
Hier mal einen Auszug meines Sources.
Erster Versuch.....
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,QExtCtrls;


var
  aTimer : TTimer;
procedure aOnTimer(Sender:TObject);
begin
  writeln('Test');
end;



begin
  aTimer := TTimer.Create(nil);
  aTimer.Interval := 1*10*1000;
  aTimer.OnTimer := aOnTimer;
  aTimer.Enabled := True;
  sleep(0);
  while true do begin
    sleep(0);
  end;
end.

Der zweite Versuch mit Luckie Code............
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ExtCtrls,
  Classes;

type
  PMethodPointer = ^TMethodPointer;
  TMethodPointer = packed record
    pMethod: Pointer;
    pObject: TObject;
  end;

var
  T           : TTimer;
  p           : TMethodPointer;
  i           : Integer;


procedure NotifyEvent(Self: TMethodPointer; Sender: TObject);
begin
  writeln('yes');
  beep;
end;

begin
  T := TTimer.Create(nil);
  T.Interval := 200; // -> löst alle 200 ms das OnTimer-Event aus
  try
    p.pMethod := @NotifyEvent;
    p.pObject := nil;
    T.OnTimer := TNotifyEvent(p);

    T.Enabled := true; // aktiviert den Timer
    writeln('Warte auf Event: ');
    for i := 1 to 5 do
    begin
      sleep(500);
      writeln('warte ' + inttostr(i * 500) + 'ms...');
      NotifyEvent(p, T);
    end;
    while true do begin
      sleep(0);
    end;
    T.Enabled := false; // deaktiviert den Timer
  finally
    T.Free;
  end;
end.
Danke im voraus für Vorschläge!!

Luckie 7. Jun 2005 10:52

Re: TNotifyEvent
 
Wie soll denn da was reagieren, wenn du dein Progarmm mit der Endlosschleife beschäftigst?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 Uhr.
Seite 1 von 2  1 2      

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