AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Timer nur in einer Unit zur Laufzeit erzeugen ??
Thema durchsuchen
Ansicht
Themen-Optionen

Timer nur in einer Unit zur Laufzeit erzeugen ??

Ein Thema von hm988 · begonnen am 19. Feb 2004 · letzter Beitrag vom 21. Feb 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#11

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

  Alt 20. Feb 2004, 07:16
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
minimops

Registriert seit: 22. Jan 2004
56 Beiträge
 
Delphi 2005 Professional
 
#12

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

  Alt 20. Feb 2004, 07:54
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...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#13

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

  Alt 20. Feb 2004, 08:02
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von hm988
hm988

Registriert seit: 20. Dez 2002
132 Beiträge
 
Delphi 7 Personal
 
#14

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

  Alt 20. Feb 2004, 21:06
also nach langer Suche .... hab ich eine winzige Hilfsklasse gebastelt , 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;
Grüsse, Steven
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#15

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

  Alt 20. Feb 2004, 23:29
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).
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#16

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

  Alt 20. Feb 2004, 23:32
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#17

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

  Alt 21. Feb 2004, 00:01
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...
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#18

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

  Alt 21. Feb 2004, 00:04
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#19

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

  Alt 21. Feb 2004, 00:35
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.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#20

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

  Alt 21. Feb 2004, 00:38
Gut, dann sind wir da unterschiedlicher Meinung.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 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