Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Timer nur in einer Unit zur Laufzeit erzeugen ?? (https://www.delphipraxis.net/16596-timer-nur-einer-unit-zur-laufzeit-erzeugen.html)

SirThornberry 20. Feb 2004 06:16

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
Ging es nicht aber darum das ganze außerhalb von jeglicher Klasse zu definieren??
Ich hab gestern auch kramphaft versucht das hin zu bekommen und hab auch
Delphi-Quellcode:
procedure myTimerProc(Sender: TObject)
begin
  //anweisungen
end;

mytimer := TTimer.Create(nil);
mytimer.interval := 2000;
@mytimer.ontimer = @myTimerProc;
versucht weil das ja mal hier im forum so gepostet wurde das dies angeblich funktioniert. Irgendwie kommt immer die meldung incompatible typen in allen varianten, je nachdem ob mit oder ohne "@" etc.

minimops 20. Feb 2004 06:54

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
Guckst Du hier:
Code:
type TNotifyEvent = procedure (Sender: TObject) of object;
"of object": muß also eine Klassenmethode sein.

Kannst Du aber so umgehen:
Delphi-Quellcode:
procedure MyProcedure;
begin
  ...
end;

procedure MeineKlasse.TimerEvent(Sender: TObject);
begin
  // Aufruf eine Prozedur außerhalb der Klasse
  MyProcedure;
end;
Du mußt nur dafür sorgen, daß MeineKlasse irgendwo erzeugt wurde...

SirThornberry 20. Feb 2004 07:02

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
damit muss man aber wieder eine hilfsklasse basteln. Es wäre ja aber nicht schlecht wenn man ganz ohne klassen den timer benutzen könnte (mal abgesehen von der TTimer-Klasse)

hm988 20. Feb 2004 20:06

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
also nach langer Suche .... hab ich eine winzige Hilfsklasse gebastelt :coder: , und das ganze in einer eigenen Unit.
Also der Timer läuft jetzt so wie ich es gesucht habe einzeln in einer Unit siehe hier:

Delphi-Quellcode:
unit Unit2;

interface

uses ExtCtrls;  

type
  TMyTimerClass = class(TObject)
    procedure MyTimer;
  private
    Timer : TTimer;
  end;

implementation

 uses Unit1;

procedure TMyTimerClass.MyTimer;
begin
 Timer := TTimer.Create(nil);
 Timer.OnTimer := Form1.TimerEvent;
 Timer.Interval := 1000;
 Timer.Enabled := True;
end;
um zu sehen dass der Timer auch funktioniert, natürlich noch eine Form mit folgendem Code
Delphi-Quellcode:
procedure TForm1.TimerEvent(Sender : TObject);
begin
  Form1.Caption := TimeToStr(now);
end;
Die procedur ist in public deklariert
und noch einen Button zum starten
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var TimerCreate : TMyTimerClass;
begin
   TimerCreate.MyTimer;      // Funktion MyTimer der Klasse TMyTimerClass ausführen,
                              // Timer wird erzeugt und gestartet
end;
:dp: :bounce1:

TStringlist 20. Feb 2004 22:29

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
Hi,

also wenn ich das richtig verstanden hatte, dann hat diese Hilfsklasse (ich nenn sie jetzt mal 'TMyTimerHelpClass') doch überhaupt nur die eine Funktion, deinem Timer als anspringbare Routine eine Methode anzubieten. Absolut nichts anderes sollte diese Klasse daher auch beinhalten, als nur eben diese Methode ...in der du dann also auch immer den Code eintragen solltest, den du mittels des Timers intervallmäßig aufgerufen haben möchtest. Der Timer selbst steht dann aber wieder ganz normal außerhalb dieser Klasse.

Ich habe das Ganze also kurz mal in diesem Sinne so umgebaut:

Code:
unit Unit2;

interface

uses ExtCtrls, SysUtils;

type
  TMyTimerHelpClass = class(TObject)
  public
    procedure MyTimerSub(Sender : TObject);
  end;

var
  ATimerSub : TMyTimerHelpClass;
  ATimer : TTimer;

implementation

uses unit1;

procedure TMyTimerHelpClass.MyTimerSub(Sender : TObject);
begin
  form1.Caption := TimeToStr(now);
end;

end.

Sowohl den Timer (ATimer) als auch (erstmal nur) eine Instanz von 'TMyTimerClass' (ATimerSub) kannst du dann einfach im FormCreate-Eventhandler von Form1 erzeugen, etwa so:

Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ATimerSub := TMyTimerHelpClass.Create;
  ATimer := TTimer.Create(nil);
  ATimer.Interval := 1000;
  ATimer.Enabled := True;
  ATimer.OnTimer := ATimerSub.MyTimerSub;
end;
Dann müsste es eigentlich funktionieren (bei mir jedenfalls gings).

Luckie 20. Feb 2004 22:32

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
Aber seine Lösung ist besser / schöner. Warum? Du hast da jetzt eine globale variable, wo man nicht so recht weiß wohin sie gehört. Er hat sie schon sauber in seine Klasse verpackt. ;)

TStringlist 20. Feb 2004 23:01

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
nur bringt seine Version irgendwie keinen Sinn. Es ging ja primär darum, den Timer quasi bloß in irgendeiner Unit zu erzeugen und ihn dann auf irgendwelche Routinen dort zeigen zu lassen. Und diese Routinen mussten aber eben leider Methoden sein ...und nur dafür diese Hilfsklasse! Um diese Routinen dann eben den dazu notwendigen Methodencharakter verleihen zu können.

Und um einen Timer einfach nur zu erzeugen braucht man keine Klasse. Das kann er ohne tun oder mit...

Luckie 20. Feb 2004 23:04

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
Und was ist das bei dir:
Delphi-Quellcode:
type
  TMyTimerHelpClass = class(TObject)
  public
    procedure MyTimerSub(Sender : TObject);
  end;
Heißt auch noch bei dir TmyTimerhelpClass. :? Und warum jetzt nicht noch den Timer gleich mit reinpacken?

Aber wenn man es ganz ohne Klasse machen will... Hier mal ein Timer in einem Konsolenprogramm:
Delphi-Quellcode:
program Project2;

{$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;
    T.Enabled := false; // deaktiviert den Timer
  finally
    T.Free;
  end;
end.
Edit: Source korrigiert.

TStringlist 20. Feb 2004 23:35

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
TMyTimerHelpClass heißt die Klasse deswegen, weil sie die Methode als Hilfestellung für einen in dieser Unit deklarierten Timer anbietet, ...um dass dieser eben auch dort Routinen aufrufen kann, die dann eben da als eine Methode dieser Klasse geschrieben werden müssen. Und er hatte ja seine TMyTimerClass-Methode nur zur Erzeugung des Timers selbst benutzt und mit seiner Konstruktion damit also eben gerade keine Möglichkeit aufgebaut, Procedures in dieser Unit Timer-mäßig aufrufen zu können.

Und der Timer hat da nichts drin zu suchen, weil ein Timer ja beispielsweise auch hintereinander auf mehrere solcher Methoden ausgerichtet werden kann. Und warum sollte dazu immer auch jedesmal noch ein neuer Timer mit zusätzlich erzeugt werden? Das wäre doch zumindest mal wenigstens völlig überflüssig wenn nicht unsinnig.

Luckie 20. Feb 2004 23:38

Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
 
Gut, dann sind wir da unterschiedlicher Meinung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.
Seite 2 von 2     12   

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