![]() |
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:
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.
procedure myTimerProc(Sender: TObject)
begin //anweisungen end; mytimer := TTimer.Create(nil); mytimer.interval := 2000; @mytimer.ontimer = @myTimerProc; |
Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
Guckst Du hier:
Code:
"of object": muß also eine Klassenmethode sein.
type TNotifyEvent = procedure (Sender: TObject) of object;
Kannst Du aber so umgehen:
Delphi-Quellcode:
Du mußt nur dafür sorgen, daß MeineKlasse irgendwo erzeugt wurde...
procedure MyProcedure;
begin ... end; procedure MeineKlasse.TimerEvent(Sender: TObject); begin // Aufruf eine Prozedur außerhalb der Klasse MyProcedure; end; |
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)
|
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:
um zu sehen dass der Timer auch funktioniert, natürlich noch eine Form mit folgendem Code
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;
Delphi-Quellcode:
Die procedur ist in public deklariert
procedure TForm1.TimerEvent(Sender : TObject);
begin Form1.Caption := TimeToStr(now); end; und noch einen Button zum starten
Delphi-Quellcode:
:dp: :bounce1:
procedure TForm1.Button1Click(Sender: TObject);
var TimerCreate : TMyTimerClass; begin TimerCreate.MyTimer; // Funktion MyTimer der Klasse TMyTimerClass ausführen, // Timer wird erzeugt und gestartet end; |
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:
Dann müsste es eigentlich funktionieren (bei mir jedenfalls gings).
procedure TForm1.FormCreate(Sender: TObject);
begin ATimerSub := TMyTimerHelpClass.Create; ATimer := TTimer.Create(nil); ATimer.Interval := 1000; ATimer.Enabled := True; ATimer.OnTimer := ATimerSub.MyTimerSub; end; |
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. ;)
|
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... |
Re: Timer nur in einer Unit zur Laufzeit erzeugen ??
Und was ist das bei dir:
Delphi-Quellcode:
Heißt auch noch bei dir TmyTimerhelpClass. :? Und warum jetzt nicht noch den Timer gleich mit reinpacken?
type
TMyTimerHelpClass = class(TObject) public procedure MyTimerSub(Sender : TObject); end; Aber wenn man es ganz ohne Klasse machen will... Hier mal ein Timer in einem Konsolenprogramm:
Delphi-Quellcode:
Edit: Source korrigiert.
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. |
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. |
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. |
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