[Delphi] Utiliser MessageDlg dans un thread ?

Utiliser MessageDlg dans un thread ? [Delphi] - Delphi/Pascal - Programmation

Marsh Posté le 18-12-2004 à 11:05:32    

Salut à tous,
 
Je n'arrive pas à utiliser MessageDlg dans un thread... si jamais je le fait, Delphi me renvoie ce message d'erreur en debug :
 

Code :
  1. ---------------------------
  2. Notification d'une exception du débogueur
  3. ---------------------------
  4. Le projet XXXXXX.exe a provoqué une classe d'exception EInvalidOperation avec le message 'Le canevas ne permet pas de dessiner'.  Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
  5. ---------------------------
  6. OK   Aide 
  7. ---------------------------


 
Voilà le code que j'utilise pour la partie qui pose problème :
 

Code :
  1. // Procédure Click sur bouton Send (Envoi de fichiers)
  2. procedure TFRM_UMMain.BTN_SendClick(Sender: TObject);
  3. var
  4.   id : cardinal;
  5. begin
  6.   if IdFTP1.Connected then CreateThread(nil,0,@UploadFile, nil,0,id);
  7. end;


 

Code :
  1. procedure UploadFile; stdcall;
  2. begin
  3. with FRM_UMMain do begin
  4. ../..
  5.     MessageDlg(UM_GetErrorMessage('UMLO04'), mtError, [mbOK], 0);
  6. ../..
  7. end;
  8. end;


 
La finalité de tout ça : c'est de renvoyer un message d'info/d'erreur selon le cas à l'utilisateur dans un thread qui fait une boucle de traitement.
 
Cette partie de code est utilisée pour uploader des fichiers via FTP pour remettre dans le contexte.
 
Merci de vos conseils et d'une aide éventuelle car je continue à chercher mais toujour rien... d'où ce post :)

Reply

Marsh Posté le 18-12-2004 à 11:05:32   

Reply

Marsh Posté le 18-12-2004 à 11:56:00    

Bon finallement, j'ai trouvé quelque chose pour éviter cela :
 

Code :
  1. MessageBox(0,PChar('mon texte de message'),'titre de la msg box',MB_OK);


 

Reply

Marsh Posté le 18-12-2004 à 16:40:54    

En effet, MessageBox ça fonctionne.
En fait dans un thread tu ne peux pas toucher à la VCL comme ça.
MessageBox étant un appel direct à une fonction de l'API Win32, ça passe.
 
Pour ton problème de MessageDlg, il aurait pu se résoudre comme ceci :
 
FLastMessage := UM_GetErrorMessage('UMLO04');
Synchronize(ShowLastMessage);
 
où FLastMessage est un attribut "string" de ton thread, et avec ShowLastMessage qui est une procédure de ton thread contenant juste :
 
MessageDlg(FLastMessage, mtError, [mbOK], 0);
 
Dès que tu veux modifier quelque chose qui appartient à l'interface graphique tu seras obligé de faire comme ça (passer par Synchronize, qui ne te permet que d'appeler une fonction sans paramètre).


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 18-12-2004 à 17:17:42    

Merci pour cette info également, j'avais vu sur quelques pages sur les thread et delphi les histoires de synchronisation de fenêtres mais ça me paraissait compliqué (bien que puissant :) ) pour ce que je voulais faire ;)
 
Merci encore pour l'info, c'est cool ! :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed