IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC/ActiveX]Assertion d'erreur sur changement des propriété


Sujet :

MFC

  1. #1
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut [MFC/ActiveX]Assertion d'erreur sur changement des propriété
    Bonjour, j’ai crée un ActiveX avec un contrôle Group Box.
    Je souhaiterais pouvoir modifier le champ Caption de ce contrôle dans les propriétés de l’ActiveX.
    Pour cela j’ai crée une propriété dans l’onglet Automation du ClassWizard :

    CString m_faction1;
    void OnFaction1Changed();

    J’édite ensuite ma fonction comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void CWorkshiftCtrl::OnFaction1Changed() 
    {
    	// TODO: Add notification handler code
    	m_MyDialog.m_Fac1.SetWindowText(m_faction1);
    	m_MyDialog.Create(IDD_WORKSHIFT);
    	SetModifiedFlag();
    }
    Avec :
    m_MyDialog = variable membre de type CString de ma classe CWorkshiftCtrl
    m_Fac1= variable membre de type CButton de ma classe CWorkshiftDialog
    IDD_WORKSHIFT = ma boite de dialogue avec mon contrôle Group Box

    Je compile le tout, j’insère mon ActiveX dans une application conteneur, je fais un clic droit dessus pour afficher les propriétés.



    Sous l’onglet général j’ai mon champs Faction1 : si je change sa valeur j’ai une erreur d’assertion !! PROBLEME

    Merci pour votre aide…

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    quelle est l'assertion ?
    fait un essai avec un version debug de l'activex enregistré pour voir si tu peux tracer l'erreur.
    tu dois avois un probleme sur le traitement de l'affectation de cette zone dans ton activex.

  3. #3
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    L'assertion est:
    Debug Assertion Failed!
    Program: C:\Program Files\...\MSDEV.EXE
    File: winocc.cpp
    Line: 229
    Le problème est que pour debugger l'activex, il faudrait le lancer!
    Or moi je n'affiche pas ma page de propriétés en run time! Donc je vois pas comment je peux faire ça.
    Je sais pas si je suis bien clair...

  4. #4
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    Hello!
    J'ai supprimé tout ce que j'avais dans ma fonction OnFaction1Changed() et j'ai rajouté une méthode de sérialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void CWorkshiftCtrl::Serialize(CArchive& ar) 
    {
    	if (ar.IsStoring())
    	{	// storing code
    		     ar << m_faction1;
     
    	}
    	else
    	{	// loading code
    		     ar >> m_faction1;
    	}
    }
    Du coup je n'ai plus de plantage!
    Par contre ça ne change pas le caption de mon controle Group Box...
    Peut être faut-il que je rajoute une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void CWorkshiftCtrl::SetName(LPCTSTR name)
    Je vais essayer !

  5. #5
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    Non ça ne fonctionne pas mieux!
    Je n'ai pas d'erreur mais mon contrôle n'est pas modifié!

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    c'est donc bien ce que je te disais ..
    que faisais tu dans cette fonction ?

  7. #7
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    Dans cette fonction je chargeai la valeur entrée dans les propriétés et je l'affectai au caption de mon controle.
    Mais vu que je n'étais pas en RUN TIME j'avais une erreur d'assertion! Certainement parce que ma fenêtre n'étais pas encore crée à ce moment là de mon programme! Enfin je pense!
    Je vais essayer de mettre une fonction de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int CWorkshiftCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    Peut être que maintenant ça fonctionnera..... J'espère.....

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Il faut travailler avec AmbientUserMode() qui renvoie TRUE en mode utilisateur
    Et faux en mode conception.
    Donc ta valeur doit être stockée dans l’activex, et mise à jour uniquement en mode utilisateur.
    Autre remarque pourquoi créer une variable pour affecter le caption de la fenêtre alors que l’Activex dispose d’une liste de variable prédéfinies (« stock property ») dont la variable text pour le titre du contrôle.
    Dernier point la sauvegarde des valeurs dans l’activex ne fonctionne pas de cette manière si tu veux que les données soient persistantes dans le fichier ressources.
    il faudra travailler avec la fonction DoPropExchange.

  9. #9
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par farscape
    Il faut travailler avec AmbientUserMode() qui renvoie TRUE en mode utilisateur
    Et faux en mode conception.
    Je vais étudier ceci, je ne savais pas!

    Citation Envoyé par farscape
    Donc ta valeur doit être stockée dans l’activex, et mise à jour uniquement en mode utilisateur.
    C'est ce que je fais avec ma fonction OnCreate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int CWorkshiftCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {							 
    	if (COleControl::OnCreate(lpCreateStruct) == -1) 
            return -1; 
     
    	// TODO: Add your specialized creation code here
    	m_MyDialog.Create(IDD_WORKSHIFT, this); 
    	m_MyDialog.m_Fac1.SetWindowText(m_faction1);
    	m_MyDialog.m_Fac2.SetWindowText(m_faction2);
    	m_MyDialog.m_Fac3.SetWindowText(m_faction3);
        return 0; 
     
    }
    Mes données sont enregistrées dans des variables membres de ma classe de controle:

    m_faction1
    m_faction2
    m_faction3

    Citation Envoyé par farscape
    Dernier point la sauvegarde des valeurs dans l’activex ne fonctionne pas de cette manière si tu veux que les données soient persistantes dans le fichier ressources.
    il faudra travailler avec la fonction DoPropExchange.
    J'ai essayé de quitter mon application la redémarrer en fermant complètement Visual et mes données restent enregistrées. Je crois que j'ai réussi à faire fonctionner cette vilaine bête !!

    Merci à toi pour tes conseils !!

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    sauf que serialize c'est pour un fichier ,donc tes données de ton ocx sont sauvegardées dans un fichier externe au fichier ressources ....
    sauf erreur de ma part

  11. #11
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    Ce qui l'en dis d'avantage! Je comprends mieux pourquoi tu me parles de données persistantes!!
    Je vais me renseigner là dessus alors....
    Merci beaucoup!

  12. #12
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    OK alors un "truc" du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void CWorkshiftCtrl::DoPropExchange(CPropExchange* pPX)
    {
       ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
       COleControl::DoPropExchange(pPX);
     
       PX_String(pPX, "Faction1", m_faction1, TRUE);
    }
    C'est ce que dis MSDN pour sérialiser une propriété de type CString...
    Je vais essayer ce que ça donne.....

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui exemple (épuré) pour un static avec valeur par defaut :
    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
     
    void CMyStatic::DoPropExchange(CPropExchange* pPX)
    {
    	ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
    	COleControl::DoPropExchange(pPX);
     
    	// TODO: Call PX_ functions for each persistent custom property.
    	CPictureHolder Pic;
    	Pic.CreateEmpty();
    	CString *pstrCaption =(CString *)&((CString &)InternalGetText());
    	if(pPX->GetVersion()>= (DWORD)MAKELONG(_wVerMinor, _wVerMajor))
    	{		
    		PX_String(pPX,_T("Text"),*pstrCaption,_T("Static"));
    		PX_Picture(pPX,_T("ControlPicture"),m_Pic,Pic);
    	}
    	else
    	if(pPX->IsLoading())
    	{				
    		PX_String(pPX,_T("Text"),*pstrCaption,_T("Static"));
    		PX_Picture(pPX,_T("ControlPicture"),m_Pic,Pic);
    	}
    }

  14. #14
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    Merci Farscape je vais annalyser tout ça....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changement des propriété d'une Colonne personnalisé.
    Par hassine dans le forum SharePoint
    Réponses: 4
    Dernier message: 06/04/2009, 15h57
  2. [CSS/Javascript] Changement des propriété CSS dynamiquement
    Par heladar dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 06/02/2009, 12h33
  3. Réponses: 3
    Dernier message: 30/05/2008, 14h35
  4. [Débutant - Excel - Graph] Erreur sur changement nom de série
    Par seiryujay dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/12/2006, 10h12
  5. [VBA] Erreur sur changement de coleur
    Par darkphenx dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2006, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo