Delphi: événement OnTimer de mon propre chronomètre n'arrive jamais
J'ai besoin d'un Minuterie dans un "non-forme" Delphi unité (il y a toujours une unité principale à l'aide d'un formulaire), donc ce que je fais:
unit ...
interface
type
TMyTimer = Class(TTimer)
public
procedure OnMyTimer(Sender: TObject);
end;
var
MyTimer: TMyTimer;
implementation
procedure TMyTimer.OnMyTimer(Sender: TObject);
begin
...
end;
initialization
MyTimer := TMyTimer.Create(nil);
with MyTimer do
begin
Interval := 1000;
Enabled := True;
OnTimer := OnMyTimer;
end;
finalization
FreeAndNil(MyTimer);
Le problème est que le OnMyTimer procédure n'est jamais exécuté. Je vais vraiment apprécier toutes les idées pour lesquelles 🙂
OriginalL'auteur Mikhail | 2010-04-14
Vous devez vous connecter pour publier un commentaire.
En dehors du fait que vous avez créé un
MyTimer
et libéré uneMouseTimer
, je ne vois rien de mal avec votre code (je ne supposent que vous utilisez votre code dans une application graphique ou au moins avoir un message boucle)Cet exemple de code fonctionne avec Delphi 5. Le
Hello World
est écrit dans le journal des événements à chaque seconde.Mikhail, je vous assure que les unités de l'utilisation de la commande n'a eu aucun effet sur la réussite d'un programme. Le problème était ailleurs.
J'Ai à la seconde.
OriginalL'auteur Lieven Keersmaekers
Pour une minuterie de travail, votre programme doit traiter les messages. Dans un programme graphique, la partie est automatique; le
TApplication
classe fournit pour vous. Mais vous dites que vous avez un "sans forme", donc je suppose que vous n'êtes probablement pas appelApplication.Run
dans votre RMR de fichier.D'utiliser une minuterie, vous avez besoin pour traiter les messages. Le point de départ type d'un message de la pompe est un code comme ceci:
Lorsqu'une minuterie de la période écoulée, l'OS place effectivement un
wm_Timer
message dans votre programme de la file d'attente de messages. LeGetMessage
appel récupère les messages de la file d'attente, etDispatchMessage
appelle la fenêtre de destination de la procédure de fenêtre.TTimer
crée une fenêtre masquée pour lui-même pour servir comme cible de ces messages, etDispatchMessage
permet de s'assurer qu'ils obtiennent.Absolument. J'ai pu continuer à longueur de temps sur les alternatives à TTimer, mais j'ai décidé de limiter ma réponse à la question à portée de main.
Je ne voulais pas de manque de respect. Je voulais juste, si quelqu'un lit-il, qu'ils sont conscients de cela.
OriginalL'auteur Rob Kennedy
Est votre unité utilisée par d'autres unités ou pas? Si cet appareil n'est pas utilisé par d'autres, il n'a même pas dans la section initialisation. Ou peut-être l'unité est achevé plus tôt que vous pensez.
Mettre un point d'arrêt à la MyTimer := TMyTimer.Create(nil); ligne et à la FreeAndNil(MyTimer) en ligne et exécuter votre application. Assurez-vous que la minuterie est créé lorsque vous le souhaitez et n'est pas détruit trop tôt.
OriginalL'auteur The_Fox