bonjour à tous,
je cherche à utiliser composant dans un thread.
D'habitude, j'utilise une forme et j'y insère mes composants.
Mais là ??? :?
Quelqu'un pourrait-il m'aider.
Merci d'avance.
Version imprimable
bonjour à tous,
je cherche à utiliser composant dans un thread.
D'habitude, j'utilise une forme et j'y insère mes composants.
Mais là ??? :?
Quelqu'un pourrait-il m'aider.
Merci d'avance.
Explique toi un peu mieux... Quels composants, de quels façon tu veux les utiliser? etc.
Par exemple je veux utiliser un timer dans un thread
Avec le peu d'info qu'on a là, je dirais que tu veux créer dynamiquement ton composant
par exemple pour utiliser un TEdit il faudra le déclarer puis le créer par la code
[EDIT] pour le timer : [/EDIT]Code:
1
2
3
4
5
6
7
8
9 (...) var MonEdit : TEdit; begin MonEdit := TEdit.create(self); MonEdit.text:='Bonjour le monde !'; Showmessage(MonEdit.text); (...)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 (...) var MonTimer : TTimer; begin MonTimer := TTimer.create(self); MonTimer.interval := 3000; MonTimer.OnTimer:=MaProcedureTimer end; procedure TForm1.MaProcedureTimer(Sender : TObject); begin Showmessage('Voilà déjà 3 secondes d''écoulé, que le temps passe vite !'); end; (...)
J'ai déclaré
Puis j'ai créé la procédure suivante:Code:
1
2 Timer1:TTimer
Mais le programme ne rentre pas dans la procédure.Code:
1
2
3
4
5 procedure TThread.Timer1(sender:TObject) begin showmessage('salut'); end;
Je ne comprends pas pourquoi :?
je ne sais pas si tu as eu le temps de lire mon [EDIT] plus haut mais
est très importantCode:MonTimer.OnTimer:=MaProcedureTimer
As-tu bien assigné OnTimer de ton Timer avec ta procedure?
Code:
1
2 MonTimer.OnTimer:=Timer1;
J'ai une erreur de compilation à la ligne suivante :
Erreur :Code:
1
2 MonTimer := TTimer.create(self);
Voici mon code:Citation:
Type incompatibles : TComponent et THread_MaThread
Code:
1
2
3
4
5
6
7 procedure TThread.Timer1(sender:TObject) begin Timer1:=TTimer.create(self); Timer1.Interval:=2000; showmessage('salut'); end;
De plus Timer1 est déclaré en global.
Je ne sais pas si le pb peut venir de la
8O C'est bizarre ton truc:
Tu appelles ton TTimer Timer1 et ta procedure s'appelle aussi Timer1?
Je pense que tu t'es mélangé les pinceaux... :wink:
En général, il faut créer l'objet dans le OnCreate du Thread...
Non en fait ma procédure s'apelle Timer1Timer
Code:
1
2
3
4
5
6
7 procedure TThread.Timer1Timer(sender:TObject) begin Timer1:=TTimer.create(self); Timer1.Interval:=2000; showmessage('salut'); end;
n'empêche que tu t'es vraiment mélangé les pinceaux quand meme !
la déclaration de la variable TTimer en global, ça c'est bon.
mais la création, l'initialisation de l'interval et la liaison du OnTimer doit se faire sur un create ou un OnCreate, mais surtout pas dans l'évenement onTimer.
enlève donc le Create et l'initialisation de l'interval de ta procédure Timer1timer1 ça marchera mieux, et n'oublie pas de lier l'évenement OnTimer à ta procédure comme écrit plus haut
Bon courage !
Attention à la création de composants graphiques dans des threads. Seul le thread principal doit normalement manipuler de tels éléments, il faut alors passer par Synchronize.
Pour ajouter des objets dans un autre objet, ici un timer dans un Thread, le plus simple est de déclarer l'objet comme membre privé/protégé de l'objet qui accueuille, de le construire dans le constructeur de ce dernier et de le détruire dans le destructeur :
Il faut ensuite éventuellement lier les procédures d'évènements (ce qui a été expliqué plus haut) dans le constructeur de l'objet...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 type TMyThread = class(TThread) private FTimer: TTimer; public constructor Create(ACreateSuspended: Boolean); //de mémoire... destructor Destroy; override; end; implementation constructor TMyThread.Create(ACreateSuspended: Boolean); begin inherited; FTimer := TTimer.Create(nil); end; destructor TMyThread.Destroy; begin inherited; FTimer.Free; end;
Merci à tous pour votre aide précieuse.
mon problème est maintenant résolu