Bonjour,
je develope mon logiciel sous Borland C++ 6. J'ai souhaité ajouter depuis peu dans mon logiciel un TLabel permettant d'afficher si mon moteur est en mouvement ou pas.

Voici un peu comment j'ai codé tout ça :

Lorsque je souhaite bouger mon moteur je fait appel à cette fonction :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
void  PM_Engine::SetPositionAxeZWaitStop(double p_position)
{
        if (!ControlEngine->Cb_testAuto->Checked ==true)
        {
                #if (MODELE_FOCALE == 122)
                ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetVitesse(GetVitesseFocal().ToDouble());
                ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetMouvementAbsoluWaitStop(p_position);
                #else if (MODELE_FOCALE == 111)
                 double positionActuelle = ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->GetPosition();
                 if ( fabs(positionActuelle-p_position)<FOCALE_M111_ERREUR)
                        return;
 
                 static_cast <TControlEngine*>(GetModuleForm(NULL))->SetMouvementAbsolu_M111(true,p_position,true); // <<<<<<< FONCTION QUI ME POSE PROBLEME
                 double vitesse = GetVitesseFocal().ToDouble();
 
                 ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetVitesse(vitesse);
                 ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetMouvementAbsoluWaitStop(p_position+FOCALE_M111_OFFSET);
                 ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetVitesse(FOCALE_M111_VITESSE_OFFSET);
                 ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetMouvementAbsoluWaitStop(p_position);
                 ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetVitesse(vitesse);
 
 
                static_cast <TControlEngine*>(GetModuleForm(NULL))->SetMouvementAbsolu_M111(false);
                #endif
        }
}
Et c'est dans cette fonction


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
void TControlEngine::SetMouvementAbsolu_M111(bool etat, double cible,bool litho)
{
 
        #if (MODELE_FOCALE == 111)
        try
        {
                Label_focalM111->Visible = true;
                if ( etat == true)
                {
 
                        Label_focalM111->Caption = GetTraduction ("Mise en position ... Patientez...");
                        Label_focalM111->Font->Color = clRed;
 
                        repositionnement = true;
                        compteur =0;
                }
                else
                {
                        Label_focalM111->Caption = GetTraduction ("Prêt");
                        Label_focalM111->Font->Color = clGreen;
                }
                positionZCible = cible;
                if ( (litho == false) || (etat== false))
                        Timer_focalM111->Enabled = etat;
        }
        catch(...)
        {
                int a= 0;
        }
        #endif
 
}
sur les lignes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
Label_focalM111->Caption = GetTraduction ("Mise en position ... Patientez...");
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Label_focalM111->Caption = GetTraduction ("Prêt");
que j'obtiens de manière totalement aléatoire le message suivant "Canvas does not allow drawing". J'ai du mal a comprendre ce que je peux faire de plus. Je ne suis pas dans un thread secondaire pour l'appel de cette fonction je ne peut donc pas utilisé de Synchronize comme j'ai pu voir lors de mes recherche. Es ce que mettre un mutex serai judicieux? mais pourquoi ai-je ce problème ici alors que j'utilise exactement la meme façon de faire ailleurs sans que cela me fasse ce genre de problème.

Pourriez vous m'aider s'il vous plais.
Merci d'avance.