Acc�s � Word dans un thread
Bonjour,
Afin de proposer aux utilisateurs un bouton Arr�ter l'impression, j'ai cr�� un Thread, le programme principal est une DLL.
Ce thread lance une proc�dure (fonctionnant parfaitement dans le contexte du programme principal) qui plante : Indice de liste hors limite(2). Cette erreur ne semble pas concern� le thread puisqu'il continue � fonctionner jusqu'au bout sans erreur.
La proc�dure utilise une liste de signets Word (j'ai initialis� cette liste avec ThreadList), ouvre Word et acc�de � la base de donn�es via BDE pour renseigner les signets d'un mod�le de document.
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| Initialisations:
TList *signetsWord=new TList();
threadsignetsWord=new TThreadList();
threadsignetsWord->Add(signetsWord);
signetsWord=threadsignetsWord->LockList();
TfImprime *fImprime=new TfImprime(Screen->Forms[0]);
fImprime->Threaded=true;
fImprime->typeModele=typeModele;
fImprime->statut_bonlabo=statut_bonlabo;
fImprime->statut_dialyse=statut_dialyse;
fImprime->ShowModal();
Lancement du thread � partir de la fen�tre fImprime :
void __fastcall TfImprime::btAnnuleClick(TObject *Sender)
{
Suspended=true;
btAnnule->Enabled=false;
if (Threaded)
ThreadImp->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TfImprime::Termine(TObject *Sender) {
delete ThreadImp;
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfImprime::Timer1Timer(TObject *Sender)
{
Timer1->Enabled=false;
if (Threaded) {
ThreadImp=new TThreadExe(true);
ThreadImp->typeModele=typeModele;
ThreadImp->statut_bonlabo=statut_bonlabo;
ThreadImp->statut_dialyse=statut_dialyse;
ThreadImp->Priority=tpNormal;
ThreadImp->FreeOnTerminate=false;
ThreadImp->OnTerminate=Termine;
ThreadImp->Resume();
}
}
//---------------------------------------------------------------------------
void __fastcall TfImprime::FormShow(TObject *Sender)
{
Timer1->Enabled=true; // oui le timer n'est pas utile....
}
//---------------------------------------------------------------------------
Voici la classe TThread :
//---------------------------------------------------------------------------
__fastcall TThreadExe::TThreadExe (bool CreateSuspended):TThread(CreateSuspended){
}
//---------------------------------------------------------------------------
void __fastcall TThreadExe::Execute(){
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
Lance();
CoUninitialize();
}
//---------------------------------------------------------------------------
void __fastcall TThreadExe::Lance(void) {
TSignet::Word->printBoucle(typeModele,statut_bonlabo,statut_dialyse);
}
//---------------------------------------------------------------------------
Le code de recherche des signets :
for(int i=0; i<signetsWord->Count; i++){
unSignet=(TSignet *)signetsWord->Items[i];
....<suite du code>... |
tous les try catch que j'ai pu mettre sont sans effet m�me au niveau de l'exe.
Quelqu'un aurait-il une id�e d'o� vient l'erreur ?
Merci d'avance.