Thread erreur

Signaler
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
-
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
-
Bonjour,

Voilà j'ai un souci avec un thread. J'essaye de lancer une connection ole avec excel depuis un thread mais j'ai une erreur lors de la création de l'objet ole. Vous avez ci dessous le code. Ce morceau de code fonctionne tres bien si je le lance dans une unité classique mais dans le thread j'ai l'erreur suivante :

---------------------------
Notification d'une exception du débogueur
---------------------------
Le projet async.exe a provoqué une classe d'exception EOleSysError avec le message 'CoInitialize n'a pas été appelé'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
---------------------------
OK Aide
---------------------------

Le code du thread :

unit ThreadAuto1;

interface

uses
Classes,ComObj;

type
ThreadCalAuto1 = class(TThread)
private
{ Déclarations privées }
protected
procedure Execute; override;
end;

implementation

{ ThreadCalAuto1 }

procedure ThreadCalAuto1.Execute;

var {Déclaration des variables locales}
OleApplication : Variant;

begin

Try
{Connection OLE avec excel}
OleApplication := CreateOleObject('Excel.Application'); //erreur ici
OleApplication.WorkBooks.Open('Imp_Async_BT_Bagues.xls');
OleApplication.Run('Start');
OleApplication.Run('Viewer');
OleApplication.Visible := True;
Except
OleApplication.Quit;
end;
end;

end.

Code du lancement du thread :

procedure TForm3.Button1Click(Sender: TObject);

var
Th1 : ThreadCalAuto1;

begin
Th1 := ThreadCalAuto1.Create(True);
Th1.FreeOnTerminate := true;
Th1.Priority := TpTimeCritical;
Th1.Resume;
end;

Merci de votre aide.

Bonne prog,
JMP.

2 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Je n'ai pas trouvé l'explication mais voici une solution.

Premièrement, déclarer un OleVariant au lieu d'un variant pour OleApplication.

Deuxièmement : ajouter une méthode à la classe de ton thread, par exemple StartExcel :
  ThreadCalAuto1 = class(TThread)
  private
    { Déclarations privées }
    procedure StartExcel;
  protected
    procedure Execute; override;
  end;


Troisièmement, lancer la procédure par l'intermédiaire d'un appel à Synchronize :
procedure ThreadCalAuto1.Execute;
begin
  Synchronize(StartExcel);
end;


Et pour finir, tu mets le code qui lance Excel dans cette procédure StartExcel :
procedure ThreadCalAuto1.StartExcel;
var 
  OleApplication: OleVariant;
begin
  try
    {Connection OLE avec excel}
    OleApplication := CreateOleObject('Excel.Application'); //erreur supprimée ici
    OleApplication.WorkBooks.Open('Imp_Async_BT_Bagues.xls');
     OleApplication.Run('Start');
    OleApplication.Run('Viewer');
    OleApplication.Visible := True;
    OleApplication.Quit;
  except
    OleApplication := UnAssigned;
  end;
end;


Et là, no problem.
Mystère...
May Delphi be with you
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
7
Salut delphiprog,

Merci à toi tu es vraiment le meilleur.

Encore merci et bon week end,
JMP.