AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timer in einer Unit

Ein Thema von Popov · begonnen am 19. Mär 2015 · letzter Beitrag vom 23. Mär 2015
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
Popov
(Gast)

n/a Beiträge
 
#31

AW: Timer in einer Unit

  Alt 21. Mär 2015, 10:56
@Dejan Vu

Vielleicht hast du auch Recht, denn irgendwann wird es dann doch peinlich wenn man merkt, dass jemand denkt, dass man das hier
Delphi-Quellcode:
procedure MyTimerCreate;
begin
  MyTimer := TMyTimer.Create(nil);
  with MyTimer do
  begin
    Interval := 1000;
    Enabled := True;
    OnTimer := TimerTick;
  end;
end;

initialization
  MyTimerCreate;
nur deshalb so geschrieben hat, weil man es nicht besser drauf hat, und nicht, weil dahinter eine Absicht steckt und man an die denkt, die evtl. in den nächsten Jahren danach suchen und eher den Sinn verstehen wollen.

Und für die, die noch immer nicht verstanden haben wieso der Code so zerlegt ist und es eine procedure TimerTick gibt, den Grund erkennen die, die das Problem man haben werden. Denn es ist nicht ohne Grund so. Denn gelegentlich braucht man die Prozedur nicht. Also ist sie separat. Ich werde das jetzt aber nicht vertiefen.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#32

AW: Timer in einer Unit

  Alt 21. Mär 2015, 13:39
Hi.hi..


Nur ne kleine Anmerkung:

SetTimer( 0, nIDEvent, Interval, @OnTimer );

benötigt eine nIDEvent > 0 !!

Also hier einfach

SetTimer( 0, 1, Interval, @OnTimer );

Da mit dieser Minimalroutine eh nur ein Teimer erzeugt werden kann

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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#33

AW: Timer in einer Unit

  Alt 21. Mär 2015, 16:20
Hi.hi..


Nur ne kleine Anmerkung:

SetTimer( 0, nIDEvent, Interval, @OnTimer );

benötigt eine nIDEvent > 0 !!
Könntest du das einmal erläutern, warum. Dann können wir das bei MS einreichen, auf dass die ihre Doku anpassen, denn die wäre dann ja wohl falsch.

Evtl. liegt es auch daran, dass ich es mir angewöhnt habe den gesamten Abschnitt der Dokumentation zu lesen und nicht nur das erste Schlagwort.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#34

AW: Timer in einer Unit

  Alt 22. Mär 2015, 03:28
Schau doch mal in den Post Nr. 5 von diesem Thema, da habe ich versucht es zu erklären...

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Zitat:
nIDEvent [in]
Type: UINT_PTR
A nonzero timer identifier. If the hWnd parameter is NULL, and the nIDEvent does not match an existing timer then it is ignored and a new timer ID is generated. If the hWnd parameter is not NULL and the window specified by hWnd already has a timer with the value nIDEvent, then the existing timer is replaced by the new timer. When SetTimer replaces a timer, the timer is reset. Therefore, a message will be sent after the current time-out value elapses, but the previously set time-out value is ignored. If the call is not intended to replace an existing timer, nIDEvent should be 0 if the hWnd is NULL.

OK, da weiß wohl MS selber nicht was es will.

A nonzero timer identifier.
..nIDEvent should be 0 if the hWnd is NULL


Hi.hi..


Nur ne kleine Anmerkung:

SetTimer( 0, nIDEvent, Interval, @OnTimer );

benötigt eine nIDEvent > 0 !!
Könntest du das einmal erläutern, warum. Dann können wir das bei MS einreichen, auf dass die ihre Doku anpassen, denn die wäre dann ja wohl falsch.

Evtl. liegt es auch daran, dass ich es mir angewöhnt habe den gesamten Abschnitt der Dokumentation zu lesen und nicht nur das erste Schlagwort.

Geändert von HolgerX (22. Mär 2015 um 03:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.343 Beiträge
 
Delphi 11 Alexandria
 
#35

AW: Timer in einer Unit

  Alt 22. Mär 2015, 06:14
OK, da weiß wohl MS selber nicht was es will.

A nonzero timer identifier.
..nIDEvent should be 0 if the hWnd is NULL
Es ist vielleicht etwas missverständlich ausgedrückt, aber gemeint ist, dass die ID um einen Timer zu identifizieren nicht 0 sein kann, sondern bei 1 startet. Ansonsten hätte jemand auf die Idee kommen können bei 0 anzufangen mit dem ersten Timer.
Sprich es heißt nicht, dass der Parameter nicht 0 sein darf, sondern der Identifizierer für einen Timer.

In dem Fall muss man das einfach nur wörtlich nehmen...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#36

AW: Timer in einer Unit

  Alt 22. Mär 2015, 07:32
aber der Event wird nur 1x ausgelöst, d.h. es handelt sich nicht um einen periodischen Timer (den man aber sehr leicht anhand des Codes erstellen kann)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#37

AW: Timer in einer Unit

  Alt 22. Mär 2015, 07:35
aber der Event wird nur 1x ausgelöst, d.h. es handelt sich nicht um einen periodischen Timer (den man aber sehr leicht anhand des Codes erstellen kann)
Wo wie was wann wird da nur einmal etwas ausgelöst? Der Timer, wenn erfolgreich gesetzt, löst nach jedem Intervall aus bis es den Timer nicht mehr gibt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#38

AW: Timer in einer Unit

  Alt 22. Mär 2015, 11:24
aber der Event wird nur 1x ausgelöst, d.h. es handelt sich nicht um einen periodischen Timer (den man aber sehr leicht anhand des Codes erstellen kann)
Einmal abgesehen davon, dass die Aussage falsch ist, hätte man dennoch als Antwort die Code-Änderung posten können, welche dann die angebliche richtige Lösung enthalten würde.

So ist es halt nur wieder das übliche BlaBla.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#39

AW: Timer in einer Unit

  Alt 22. Mär 2015, 12:22
Ich hatte die MSDN-Beschreibung so verstanden, aber -so im nachhinein- wäre das auch ziemlich blöd, wenn es nur 1x gefeuert würde.
So ist es halt nur wieder das übliche BlaBla.
Niveau ist das Denkmal des Verstandes.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#40

AW: Timer in einer Unit

  Alt 22. Mär 2015, 12:45
Ich hab das mal übersetzt:

SetTimer
Code:
function SetTimer(Wnd: HWnd; IDEvent: Integer; Elapse: Word; TimerFunc: TFarProc): Word;
Die Funktion SetTimer erzeugt ein System-Timer-Ereignis. Ein Time-Out-Wert wird festgelegt. Immer wenn ein Time-Out eintritt, sendet das System eine WM_TIMER-Meldung an die installierte Anwendungswarteschlange, oder übergibt die Meldung an eine anwendungsdefinierte TimerProc-Callback-Funktion.

ParameterBeschreibung
WndLegt das Fenster fest, das dem Timer zugeordnet werden soll. Ist der Parameter TimerFunc nil, erhält die mit diesem Fenster verbundene Fenster-Prozedur die Meldungen WM_TIMER von dem Timer. Ist dieser Parameter Null, wird kein Fenster mit dem Timer verbunden.
IDEventLegt einen von Null verschiedenen Bezeichner für ein Timer-Ereignis fest. Ist der Parameter Wnd Null, wird dieser Parameter ignoriert.
ElapseBestimmt die abgelaufene Zeit zwischen Timer-Ereignissen in Millisekunden.
TimerFuncBestimmt die Adresse der Prozedurinstanz der Callback-Funktion, die die Meldungen WM_TIMER weitergibt. Ist dieser Parameter nil, werden die Meldungen WM_TIMER in der Anwendungswarteschlange plaziert, und das hwnd-Mitglied der Struktur TMSG enthält das durch den Parameter Wnd bestimmte Fenster-Handle. Weitere Informationen finden Sie in der Beschreibung der Callback-Funktion TimerProc

Rückgabewert
Der Rückgabewert legt den Integer-Bezeichner für das neue Timer-Ereignis fest, wenn der Parameter Wnd Null ist, und die Funktion erfolgreich ausgeführt wurde. Eine Anwendung übergibt diesen Wert an die Funktion KillTimer, um das Timer-Ereignis zu beseitigen. Der Rückgabewert ist ungleich Null, wenn der Parameter Wnd ein gültiges Fenster-Handle ist, und die Funktion erfolgreich ausgeführt wurde. Andernfalls ist der Rückgabewert Null.

Hinweis
Timer sind eine eingeschränkt verfügbare, globale Ressource. Aus diesem Grund ist es wichtig, daß eine Anwendung den durch die Funktion SetTimer zurückgegeben Wert überprüft, um sicherzustellen, daß ein Timer verfügbar ist.

Um eine Timer-Funktion zu installieren, muß TimerFunc eine Adresse der Prozedurinstanz einer Callback-Funktion bestimmen und die Funktion muß in der Moduldefinitionsdatei der Anwendung exportiert werden. Die Adresse sollte mit Hilfe der Funktion MakeProcInstance erzeugt werden.

Die Callback-Funktion muß die Pascal-Aufrufkonvention verwenden und als FAR deklariert werden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


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 07:51 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