Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Timer in einer Unit (https://www.delphipraxis.net/184358-timer-einer-unit.html)

himitsu 20. Mär 2015 16:51

AW: Timer in einer Unit
 
Eigentlich würde ich lieber ein OOP-Turorial empfehlen, aber hier mal in Kurz, mit Kommentaren.
Delphi-Quellcode:
type
  TMyTimer = class(TTimer)
  protected
    procedure DoOnTimer; override;
  public
    constructor Create(Owner: TComponent); override;
    //procedure TimerTick(Sender: TObject); // wenn man schon vererbung benutzt, dann doch bitte richtig -> DoOnTimer
  end;

var
  MyTimer: TMyTimer; // OK, da mach ich noch mit, aber natürlich nur in Implementation deklariert, aber eigentlich als private Class-Var in die Klasse
  //a: Integer = 0; // warum ist das global, wo es doch nur im Timer benutzt wird?

//procedure TMyTimer.TimerTick(Sender: TObject);
procedure TMyTimer.DoOnTimer;
begin
  Tag := Tag + 1; //Inc(FCount); // privates Feld "FCount: Integer" mit Property oder das Entwicklerproperty "Tag"
  inherited;
end;

constructor TMyTimerCreate(Owner: TComponent);
begin
  inherited;
  Interval := 1000;
end;

//procedure MyTimerCreate;
//begin
//  MyTimer := TMyTimer.Create(nil); // alleine in Prozedur, also sinnlos hier
//  with MyTimer do
//  begin
//    Interval := 1000; // nja, 1000 ist zwar auch default, aber wenn es sein muß, dann wenigstens in den Constructor
//    Enabled := True; // es ist per Default immer Enabled
//    OnTimer := TimerTick; // sinnlos
//  end;
//end;

//procedure MyTimerFree;
//begin
//  MyTimer.Free;
//end;

initialization
  //MyTimerCreate;
  MyTimer := TMyTimer.Create(nil);

finalization
  MyTimer.Free; //MyTimerFree;

end.

Popov 20. Mär 2015 17:06

AW: Timer in einer Unit
 
@himitsu

Danke für die Kommentare, nur...

das war kein Auszug aus der fertigen Unit, es war nur ein Test. Mehr nicht. Nur ein Test.

Es ist toll, dass du eine Klasse konstruiert hast, nur wozu? Welchen Sinn hat das was du gemacht hast? Was soll ich damit? Was soll ich damit anfangen? Wenn ich eine Klasse brauche, dann nehme ich gleich die TTime Komponente. Letztendlich hast du einen Apfel genommen, ein Herzchen draufgeklebt, und das Ergebnis ist ein Apfel.

Bevor du also unnötige Verbesserungsvorschläge machst, frag lieber ob das die Frage ist.

himitsu 20. Mär 2015 17:14

AW: Timer in einer Unit
 
Die Klasse hattest du auch schon, nur so, wie der Code war, hätte man TTimer nicht ableiten müssen, da praktisch alle Funktion außerhalb lag. :zwinker:

Dejan Vu 20. Mär 2015 17:39

AW: Timer in einer Unit
 
Du hast also eine Unit und keine Klasse, aber eine Prozedur?

Ich würde keinen Timer ableiten, sondern das über den TEventHandler machen.

Aber eigentlich würde ich eine Klasse schreiben und einer der Methoden der Klassen dem 'OnTimer' zuweisen.

Aber wenn irgendwo legacy code rummschwirrt, würde ich mir die Mühe auch nicht machen und das kleinste Übel nehmen: Den TEventhandler.

Ich hab übrigens auch lange gedacht, so eine Komponente ist ein ziemlich großer Klumpen, denn ich bloß nicht in schlanken Klassen/Units verwenden darf. Aber -pah- drauf gebongt. Erstens sind die nicht groß und zweitens ist das Delphi und wenn Komponenten rumliegen, kann man sie doch benutzen. Ich würde jetzt natürlich auch kein TStringGrid nehmen, um ein Array of Array of String abzulegen, aber so ein Timer ist schon schlank.

Aber wenn Du drauf Wert legst: Wieso nicht einen Threaded-Timer? Also schlanker gehts nimmer.

jaenicke 20. Mär 2015 18:14

AW: Timer in einer Unit
 
Nur weil man kein Formular hat, heißt das ja nicht, dass man keine Komponenten als solche nutzen kann. Im Grunde ist der Fall hier ein Paradebeispiel für ein Datenmodul. Da kommt der Timer drauf, wird ganz normal genutzt, und der Rest der Funktionalität kommt auch in die Datenmodul-Klasse.

Popov 20. Mär 2015 18:20

AW: Timer in einer Unit
 
@himitsu

Ich will dich nicht dafür kritisieren, weil du etwas richtig machen willst, aber das ist ein Programmiererforum. Warum muss der Code optimiert sein? Kann doch jeder selbst machen. Wenn einer nicht weiß wie er A und B in einer Klasse addieren kann, dann schreibe ich in einer Button1Click Prozedur wie man A und B addiert, denn das ist wohl das Problem. Ich packe das nicht in eine Klasse, denn ich gehe davon aus, dass der Fragesteller weiß wie man eine Klasse schreibt. Ich konzentriere mich auf das Problem.

Die Beispiele oben beschreiben mögliche Lösungen des Problems, in Einzelteile zerlegt. Der eine Block beschreibt das eine Teil, der andere ein anderes. Wer wissen will wie man Klassen programmieren kann, der kann fragen wie man Klassen programmieren kann. Wer wissen will wie man das Beispiel eleganter programmieren kann, den kann danach fragen.


@Dejan Vu

Das was ich vorhabe ist etwas komplexer. Mich interessiert es nicht wirklich wie man mit Inc a erhöhen kann. Vielmehr ist es so, dass ich beim Aufruf einer Prozedur eine weitere für eine bestimmte Zeit getaktet starten will. Womit letztendlich mein erstes Beispiel im Post #1 der optimale wäre, denn da muss ich keine Objekte erzeugen oder freigeben, sondern nur den Timer starten und stoppen. Ist für eine Unit optimaler. Trotzdem habe ich auch andere Möglichkeiten geprüft (und die Ergebnisse gepostet falls einer eine ähnliche Frage hat).


@jaenicke

Ok, danke. Das mit der Komponente und Formular war etwas was ich zwar immer gemacht habe, aber stets nach anderen Möglichkeiten gesucht habe.

himitsu 20. Mär 2015 23:35

AW: Timer in einer Unit
 
Vielleicht nicht optimiert, aber wenigstens "aufgeräumt"? :angle2:

Popov 21. Mär 2015 00:38

AW: Timer in einer Unit
 
Du erinnerst mich etwas an ein HTML-Forum für Anfänger, in dem ich früher (so vor 10 Jahren) gelegentlich war. Regelmäßig wie das Amen in der Kirche kam dort ein Newbie vorbei der sich an einer Webseite versuchte und etwas in zwei Spalten schreiben wollte. Die simple Lösung die damals üblich war und selbst von wichtigen Portale noch genutzt wurde war die Tabelle. Man nehme einen Tabellen-Tag, einen Zeilen-Tag und zwei Spalten-Tags. Fertig.

Dafür muss man nichts lernen. Das sagt man dem Newbie, zeigt es ihm und er ist glücklich. Der will ja nichts groß lernen, er will eine Webseite mit Infos erstellen. Aber wehe einer kam mit der Tabellenlösung an.

Denn da gab es die Experten, und für die war die Tabellenlösung keine Lösung. Um etwas in zwei Spalten zu schreiben muß man erst CSS lernen - das war deren Antwort auf die Frage. Ohne CSS geht es nicht.

Da gab es dauerhaft Diskussionen. Ich weiß nicht ob je einer der Newbie seine Webseite vollendet hat oder gar extra wegen der zwei Spalten CSS gelernt hat. Aber das war in dem Forum nie wirklich wichtig. Wichtig war, dass man für Spalten CSS drauf haben sollte.

Dejan Vu 21. Mär 2015 06:27

AW: Timer in einer Unit
 
Und wer ist hier bei deinem Vergleich hier der Newbie?

Ein Programmierforum ist sehr wohl und zuallererst dazu da, Code nicht nur zu zeigen, sondern auch zu optimieren. Natürlich soll man die TE nicht überfordern, und insofern wäre ein echter Newbie bestimmt überfordert. Nun zähle ich dich aber nicht so direkt zu den, die froh sind, überhaupt die Compile-Funktion entdeckt zu haben.

Wenn Du in 2015 in einem Bauforum das Bohren eines Lochen in einer Wand damit demonstrierst, indem Du eine Lehmwand hochziehst, darf man schon darauf hinweisen, das es auch andere, bessererere Baustoffe gibt. Vor allen Dingen, weil bei einer dermaßen fundamentalen Frage auch Interessierte vorbeischauen, die neben den einfachen Tipps auch Optimierungen zu sehen bekommen.

Sir Rufo 21. Mär 2015 09:26

AW: Timer in einer Unit
 
Hier mal ein Minimalst-Beispiel, was auch komplett auf ein Handle verzichtet
Delphi-Quellcode:
unit Unit1;

interface

uses
  {Winapi.}Windows;

// Startet den Timer oder
// setzt ein neues Intervall für einen aktiven Timer
procedure TimerStart( Interval: UINT );
// Stoppt den Timer
procedure TimerStop;

implementation

var
  nIDEvent: UINT_PTR = 0; // Beim Start kein Timer, also nIDEvent = 0

procedure OnTimer;
begin
  // hier irgendwas machen
end;

procedure TimerStop;
begin
  if KillTimer( 0, nIDEvent )
  then
    nIDEvent := 0; // Wenn der Timer entfernt werden konnte, dann nIDEvent wieder auf 0 setzen
end;

procedure TimerStart( Interval: UINT );
begin
  nIDEvent := SetTimer( 0, nIDEvent, Interval, @OnTimer );
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 Uhr.
Seite 3 von 6     123 45     Letzte »    

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