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 :

Initialisation des valeurs des Controles dans CFormView


Sujet :

MFC

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 249
    Points : 106
    Points
    106
    Par défaut Initialisation des valeurs des Controles dans CFormView
    Bonjour, je suis nouveau dans la programmation MFC te j'aimerais avoir vos suggestions.

    J'ai un programme minuscule généré avec l'application wizard de VS 2010. C'est une application

    Application Type: Single document
    Project Type : MFC Standard

    et dans Generated Classes
    Base Class : CFormView

    (scusez mais c'est la version anglaise de VS 2010)

    J'ai déposé un controle Edit Control et un bouton. Plus simple que ca tu meurs. J'ai ajouté deux variables avec
    le Add Member Variable Wizard, une variable control: EditControl et une variable value: EditControlText.

    L'application se nomme RegularExpressions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    De RegularExpressionsView.h 
     
    class CRegularExpressionsView : public CFormView
    ...
    public:
    CEdit EditControl;                         <-------
    CString EditControlText;                   <-------
    afx_msg void OnBnClickedButton1();
    Je veux initialiser les valeurs des controles de CFormView à la fin de la méthode CRegularExpressionsApp::InitInstance() en utilisant GetProfileString() et WriteProfileString()

    donc

    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
     
    BOOL CRegularExpressionsApp::InitInstance()
    {
     
    ...
     
    SetRegistryKey(_T("RegularExpressions"));
     
    LoadStdProfileSettings(4); 
     
    ...
     
    // Le constructteur de CFormView est appellé ici
    if (!ProcessShellCommand(cmdInfo))
    return FALSE;
     
    ...
     
    // le problème est ici car EditControlText est dans CRegularExpressionsView
    ???.EditControlText = GetProfileString(_T("General"), _T("EditBox"),_T("Vide"));
     
    return TRUE;
    }

    J'utilise la sauvegarde et la récupération des valeurs dans le registre avec
    GetProfileString(_T("General"), _T("EditBox"),_T(""))
    et
    WriteProfileString(_T("General"), _T("EditBox"), ???.EditControlText) et ca ca fonctionne très bien si je remplace ???.EditControlText par disons _T("xyz")

    Bon je me suis dit que je devrais peut-être appeller GetProfileString et WriteProfileString dans le constructeur et le destructeur de CRegularExpressionsView mais la ce sont ces deux méthodes qui ne sont plus visible.

    Suggestions bienvenue.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 141
    Points : 12 242
    Points
    12 242
    Par défaut
    Ne confondez pas la fonction Window GetProfileString http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
    avec la méthode de GetProfileString de la Classe CWinApp
    http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

    Mais les deux sont accessible depuis le constructeur votre classe CRegularExpressionsView.
    La fonction est accessible en mettant "::" devant
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EditControlText = ::GetProfileString(....)
    La méthode est accessible en récupérant l'instance de la classe dérivée de CWinApp
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EditControlText = AfxGetApp->GetProfileString(....)

    Même chose pour WriteProfileString.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 249
    Points : 106
    Points
    106
    Par défaut
    C'est bien la méthode qu'il faut utiliser selon MSDN donc AfxGetApp()->GetProfileString.

    Effectivement si j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AfxGetApp()->GetProfileString(_T("General"), _T("EditBox"),_T("Vide \r\n"));
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AfxGetApp()->WriteProfileString(_T("General"), _T("EditBox"), EditControlText);
    ca fonctionne mais là c'est le contenu du controle EditControlText qui n'est pas à jour dans le destructeur si je modifie le contenu du controle alors dans le destructeur je vois avec le débuggeur la valeur initiale du controle au démarrage et non pas la nouvelle valeur.

    Idéalement je voudrais faire tout ca dans le constructeur et le destructeur de l'application mais ce n'est obligatoire.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 141
    Points : 12 242
    Points
    12 242
    Par défaut
    Même après un UpdateData(TRUE) ?
    http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 249
    Points : 106
    Points
    106
    Par défaut
    J'ai déjà essayé et non ca ne marche pas mais j'ai trouvé des videos interessants sur MSDN

    1) http://msdn.microsoft.com/fr-ca/visualc/cc837004

    Et là j'ai appris que quand on utilise les forms il y a un problème de synchronisation entre la form et le doc (données) associé à cette forme et il faut ajouter du code à plusieurs endroit. C'est dans le vidéo.

    Je n'ai trop de temps à consacrer à ça mais j'ai quand même voulu imprimer la documentation sur MFC

    http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

    mais là c'est le problème classique d'impression des topics de la documentation, on doit imprimer topic par topic ridicule !, à moins que quelqu'un connaisse un truc pour imprimer toute une section de la documentation d'une manière efficace c-a-d imprimer les topics un la suite de l'autre car il y des topics qui n'ont que quelques lignes et ca ca vous bouffe du papier et de l'encre et je ne suis le seul à me plaindre de ça il y plein de commentaires là-dessus partout sur le net donc j'ai décidé de ne pas imprimer. Je vais me procurer un livre sur MFC c'est tout ça va être mieux.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 141
    Points : 12 242
    Points
    12 242
    Par défaut
    La vidéo que vous nous indiquez ne présente que le problème de notification du Document en cas de modification dans la Vue et vis versa, dans une architecture Document/Vue utilisant une CFormView.

    Cela n'a rien à voir avec votre problème car, c'est bien dans votre Vue que vous ne voyez pas les modifications.

    Sans UpdateData, les variables autres que "contrôles" ne disposeront pas de la version courrant du contenu des contrôles.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 249
    Points : 106
    Points
    106
    Par défaut
    C'est possible,

    Si j'utilise EditControl.UpdateData(TRUE) ou UpdateData(TRUE) j'obtiens un Debug assertion failed ! J'ai bien tapé du nouveau texte mais il n'est pas à jour. Selon l'article de MSDN http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx c'est bien UpdateData(TRUE) qu'il faut utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CRegularExpressionsView::~CRegularExpressionsView
    { 
    //EditControl.UpdateData(TRUE); BOUM !
     
    //UpdateData(TRUE);                BOUM !
     
    AfxGetApp()->WriteProfileString(_T("General"), _T("EditBox"), EditControlText);
    }
    
    Je n'ai pas le temps d'investiguer ça il faudrait que je lise au moins un bon livre sur MFC sinon c'est une perte de temps, avec Delphi je réussissais toujours à me débrouiller avec l'aide mais avec VS on oublie ca.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 249
    Points : 106
    Points
    106
    Par défaut
    Bon j'ai réglé le problème en ajoutant au gestionnaire OnEnChangeEdit1 ceci mais la je mets à jour ma variable alors que je voulais accéder à une variable déjà à jour, peut-être que c'est la seule méthode ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CRegularExpressionsView::OnEnChangeEdit1()
    {
     // TODO:  If this is a RICHEDIT control, the control will not
     // send this notification unless you override the CFormView::OnInitDialog()
     // function and call CRichEditCtrl().SetEventMask()
     // with the ENM_CHANGE flag ORed into the mask.
     // TODO:  Add your control notification handler code here
     
     EditControl.GetWindowText(EditControlText);
    }

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 141
    Points : 12 242
    Points
    12 242
    Par défaut
    Vous avez des réflexes de bon programmeur objet mais les MFC ont tendances à vous mettre des peaux de bananes sur votre chemin.

    Le hic avec le destructeur de la fenêtre, c'est que c'est la dernière chose appelée et que les MFC ont détruit les objets "Kernel" comme la fenêtre (pas l'objet MFC mais l'objet Win32->GDI->Kernel créé par la méthode Create de CWnd) et ces contrôles.

    Je pense que la récupération des valeurs sera encore opérationnelle via un UpdateData(TRUE) dans la méthode OnClose de CWnd.

    Donc redéfinissez la méthode OnClose de votre Vue, et faites des UpdateData(TRUE) et WriteProfileString avant d'appelé la méthode "OnClose" de la classe de base.

    Les MFC, c'est pas super naturel, encore moins si vous ne connaissez pas Win32.
    Un bon bouquin est toujours un bon investissement, encore plus avec les MFC.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/03/2011, 03h07
  2. Réponses: 2
    Dernier message: 11/05/2009, 09h36
  3. Réponses: 5
    Dernier message: 15/06/2007, 11h58
  4. Récupérer des valeurs de checkbox dans MySQL
    Par digger dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 05/09/2005, 14h58
  5. Réponses: 17
    Dernier message: 18/03/2005, 09h23

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