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 :

Création d'un composant de maniere dynamique


Sujet :

MFC

  1. #1
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut Création d'un composant de maniere dynamique
    Bonjour,

    Je souhaiterai créer sous visual c++ 6 un formulaire dont le nombre de champs à remplir n'est pas fixe.
    Je voudrais passer un nombre n en parametre et qu'il s'affiche n 'Edit Box'.

    Est-ce que quelqu'un a une idée là dessus ???

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    salut,

    tu peux t'inspirer de ce post http://www.developpez.net/forums/vie...createwindowex

  3. #3
    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,
    oui utiliser un gridctrl c'est plus souple :
    http://www.codeproject.com/miscctrl/gridctrl.asp
    voir aussi ce post:
    http://www.developpez.net/forums/vie...highlight=grid

  4. #4
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Merci pour vos réponses.

    En me basant sur le post que nico-pyright(c) m'a indiqué j'ai réussi à faire un bouton et quand on appui dessus une nouvelle zone de texte est créée.
    Seulement je n'arrive pas àvoir accès au texte de ces différentes zones de textes...

    Dès le départ je crée une zone de texte (edit[0]) et un bouton. Quand on appuie sur le bouton une nouvelle zone de texte est crée (edit[i]) et la variable i est incrémentée de 1. Normalement le text présent dans edit[0] est copié dans edit[i] mais ca ne marche pas, je sais pas pourquoi... :

    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
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    #include<Windows.h>
    #include<vector>
     
     
    #define ID_ABOUT   40000 
    #define ID_AIDE    40001 
    #define ID_QUIT    40002 
    #define ID_EDIT    40003 
    #define ID_BUTTON  40004 
     
    int i=1;
    char text[100]="Default";
    HINSTANCE ghInstance; 
     
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
        HDC         hdc ; 
        PAINTSTRUCT ps ; 
        HMENU   hMenu; 
        HWND    button; 
    	HWND    edit[100];
     
         switch (message) 
         { 
           case WM_CREATE: 
               hMenu = CreateMenu(); 
               AppendMenu (hMenu, MF_SEPARATOR, 0,           NULL) ; 
               AppendMenu (hMenu, MF_STRING, ID_QUIT, TEXT ("Quitter")) ; 
               SetMenu(hwnd,hMenu); 
     
    		   button = CreateWindowEx(0, "BUTTON", "Recopier le texte", WS_VISIBLE|WS_CHILD| WS_BORDER, 20, 20, 200, 40, hwnd, (HMENU)ID_BUTTON, ghInstance, NULL);
     
    		   edit[0] = CreateWindowEx(0, "EDIT", "", WS_VISIBLE|WS_CHILD| WS_BORDER|ES_WANTRETURN|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,  20, 80, 200, 20, hwnd, (HMENU)ID_EDIT, ghInstance, NULL);   
     
    		   return 0 ; 
     
     
           case WM_PAINT : 
               hdc = BeginPaint (hwnd, &ps) ; 
    		   TextOut (hdc, 20, 60, "Texte à recopier :", 18);
               EndPaint (hwnd, &ps) ; 
               return 0 ; 
           case WM_DESTROY : 
               PostQuitMessage (0) ; 
               return 0 ; 
            case WM_COMMAND: 
                switch (LOWORD (wParam)) 
               { 
                    case ID_QUIT: 
                      PostQuitMessage (0) ; 
                      return 0 ; 
                  case ID_BUTTON : 
                      if (HIWORD (wParam) == BN_CLICKED) 
    					  edit[i] = CreateWindowEx(0, "EDIT", "", WS_VISIBLE|WS_CHILD| WS_BORDER|ES_WANTRETURN|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,  20, 150+i++*30, 200, 20, hwnd, (HMENU)ID_EDIT, ghInstance, NULL);   
     
    					  GetWindowText(edit[0],text,100); //copier le texte contenu dans edit[0] dans la variable text
    					  SetWindowText(edit[i],text); //mettre la valeur de la variable text dans le texte de edit[i]
    					  // --> Ca ne marche pas, edit[i] est vide à sa creation  
    				return 0; 
               } 
              break ; 
     
         } 
         return DefWindowProc (hwnd, message, wParam, lParam) ; 
    } 
     
     
    int APIENTRY WinMain(HINSTANCE hInstance, 
                         HINSTANCE hPrevInstance, 
                         LPSTR     lpCmdLine, 
                         int       nCmdShow) 
    { 
        ghInstance = hInstance; 
         static TCHAR nomApp[] = TEXT ("Demo") ; 
         HWND         hwnd ; 
         MSG          msg ; 
         WNDCLASS     wndclass ; 
     
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ; 
         wndclass.lpfnWndProc   = WndProc ; 
         wndclass.cbClsExtra    = 0 ; 
         wndclass.cbWndExtra    = 0 ; 
         wndclass.hInstance     = hInstance ; 
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ; 
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ; 
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; 
         wndclass.lpszMenuName  = NULL ; 
         wndclass.lpszClassName = nomApp ; 
     
         if (!RegisterClass (&wndclass))  
         { 
              MessageBox (NULL, TEXT ("Nt ou superieur uniquement"), nomApp, MB_ICONERROR) ; 
              return 0 ; 
         } 
     
        hwnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW, nomApp,"",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,250, 500, NULL,NULL,hInstance,NULL); 
     
         ShowWindow (hwnd, nCmdShow) ; 
         UpdateWindow (hwnd) ; 
         while (GetMessage (&msg, NULL, 0, 0)) 
         { 
              TranslateMessage (&msg) ; 
              DispatchMessage (&msg) ; 
         } 
         return msg.wParam ; 
    }
    J'ai une pitite question, est-ce qu'il ne faudrait pas mieux essayer de faire ca en utilisant MFC ? Si oui, comment est-ce qu'on fait avec MFC pour créer dynamiquement un composant ???

    Merci d'avance

  5. #5
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Un gridctrl n'a pas la tête qu'il faut pour ce que je veux faire
    Faut que ca ressemble à un formulaire, avec différent champs à remplir...

  6. #6
    mat.M
    Invité(e)
    Par défaut
    J'ai une pitite question, est-ce qu'il ne faudrait pas mieux essayer de faire ca en utilisant MFC ? Si oui, comment est-ce qu'on fait avec MFC pour créer dynamiquement un composant ???
    j'ai un projet où je crée dynamiquement des CEdit ; le mieux vraiment c'est d'utiliser les collections..... comme CList ou CArray ou CObArray;
    ( avec MFC)

    Si l'appli est en win32 pure tu peux utiliser std::vector et std::vector::insert (à vérifier )

    Sinon avec CObArray ça se fait tout seul,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int nControlID=100;
    CObArray array_EditBoxes;
    CEdit *pEdit;
    pEdit=new CEdit;
    pEdit->Create(WS_VISIBLE |ES_AUTOHSCROLL|ES_LEFT ,rect, this,nControlID ) ; // en passant l'ID  flags a verifier
    array_EditBoxes.Add(pEdit);
    nControlID++;
    Surtout bien RAZ array_EditBoxes si on quitte l'appli , sous peine d'avoir des "memory leaks"



  7. #7
    mat.M
    Invité(e)
    Par défaut
    En win32:
    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
     
    #include <list>
    std::list::liste_edit;
    class MonEditBox{
     
     HWND    m_hwnd;
    UINT m_ID;
    };
    MonEditBox edit;
    .......
     
     
         switch (message)
         {
           case WM_CREATE:
     
     
             edit = CreateWindowEx(0, "EDIT", "", WS_VISIBLE|WS_CHILD| WS_BORDER|ES_WANTRETURN|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,  20, 80, 200, 20, hwnd, (HMENU)ID_EDIT, ghInstance, NULL);   
             liste_edit.push_front(edit);
             return 0 ;
    //..................
    }
    Pour parcourir utiliser std::list::iterator ou bien std::vector::iterator
    [/quote]

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    sinon, par rapport à ton problème de GetWIndowText, il faut que ton HWND edit[100] soit déclaré en global et pas dans la fonction de message (ou alors, il faut rechercher le handle de l'édit à chaque fois (ce qui n'a pas d'interet ...)

    n'hésite pas à utiliser GetWindowTextLength pour connaitre à l'avance la taille de ce que tu vas récuperer, 100 ce n'est peut-etre pas assez

  9. #9
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    J'ai inséré ca dans OnInitDialog(), et ca fait exactement ce que je voulais faire, merci !

    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
    int nControlID=100;
    CEdit *pEdit; 
    CObArray array_EditBoxes; 
    CRect rect;
    for (int i=0;i<5;i++)
    {
      rect.bottom = 30+i*30;
      rect.top = 10+i*30;
      rect.right = 100;
      rect.left = 10;  
      pEdit=new CEdit; 
      pEdit->Create(WS_VISIBLE |ES_AUTOHSCROLL|ES_LEFT ,rect, this,nControlID ) ;
      pEdit->ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED);
      array_EditBoxes.Add(pEdit); 
      nControlID++; 
    }
    Pour libérer la mémoire à la sortie du programme est-ce qu'un simple array_EditBoxes.RemoveAll() suffi ???

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Non il faut effacer les pointeurs associés; il est nécessaire de faire une boucle de partir de 0 jusqu'à CObArray::GetCount
    cf MSDN
    CObArray array;
    CAge* pa1;
    CAge* pa2;

    array.Add( pa1 = new CAge( 21 ) ); // Element 0
    array.Add( pa2 = new CAge( 40 ) ); // Element 1
    ASSERT( array.GetSize() == 2 );
    array.RemoveAll(); // Pointers removed but objects not deleted.
    ASSERT( array.GetSize() == 0 );
    delete pa1;
    delete pa2; // Cleans up memory.
    Pour mettre du texte dans une CEdit de la liste il suffit d'employer CObArray::GetAt() qui va retourner un pointeur.
    Avec ce pointeur utiliser CEdit::SetWindowText()

  11. #11
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Merci, donc théoriquement si je fais ca c'est bon ? :

    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
    CEdit* pEdit;
    CObArray array_EditBoxes; 
    CRect rect;
    int nControlID = 100;
    int n=5;
     
    //Construction
    for (int i=0 ; i < n ; i++)
    {
     rect.bottom = 30+i*30;
     rect.top = 10+i*30;
     rect.right = 100;
     rect.left = 10; 
     pEdit=new CEdit; 
     pEdit->Create(WS_VISIBLE |ES_AUTOHSCROLL|ES_LEFT ,rect, this,nControlID ) ;
     pEdit->ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED);
     array_EditBoxes.Add(pEdit);
     nControlID++; 
    }
     
    //Destruction
    for (int i=0; i <array_EditBoxes.GetSize() ; i++ )
    {
     pEdit = (CEdit *)array_EditBoxes.GetAt(i);
     delete pEdit;
    }
    array_EditBoxes.RemoveAll();
    Pour aller plus loin j'aimerai créer une classe "Formulaire dynamique", voila ce que ca donne pour l'instant :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    class CDynamicForm : public CDialog
    {
    private:
    	int nControlID;
    	CEdit*	pEdit;
    	CObArray array_EditBoxes; 
    	CRect rect;
     
    public:
    	CDynamicForm();
    	CDynamicForm(int,CWnd*);
    	virtual ~CDynamicForm();
     
    };
     
    CDynamicForm::CDynamicForm()
    {
     nControlID = 100;
    }
     
    CDynamicForm::CDynamicForm(int n,CWnd* pParendWnd)
    {
     nControlID = 100;
     
     for (int i=0 ; i < n ; i++)
     {
       rect.bottom = 30+i*30;
       rect.top = 10+i*30;
       rect.right = 100;
       rect.left = 10; 
       pEdit=new CEdit; 
       pEdit->Create(WS_VISIBLE |ES_AUTOHSCROLL|ES_LEFT ,rect, pParendWnd,nControlID ) ;
       pEdit->ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED);
       array_EditBoxes.Add(pEdit);
       nControlID++; 
      }
    }
     
    CDynamicForm::~CDynamicForm()
    {
     for (int i=0; i <array_EditBoxes.GetSize() ; i++ )
     {
       pEdit = (CEdit *)array_EditBoxes.GetAt(i);
       delete pEdit;
     }
     array_EditBoxes.RemoveAll();
    }
    Dans OnInitDialog() je tape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CDynamicForm Formulaire(3,this);
    Ô Miracle ca compile Mais malheureusement, quand je lance l'application il n'apparait pas de "Formulaire Dynamique"...

    Est-ce que quelqu'un aurait une explication ?

  12. #12
    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,
    si ta dialogue est modale il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Formulaire.DoModal();
    sinon voir faq:
    http://c.developpez.com/faq/vc/?page...gPostNcDestroy

  13. #13
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Je me demande...

    Avant d'aller plus loin je vais résumer se que j'ai dans la tête :

    - j'ai un CDialog avec un bouton Ok et Cancel
    - je veux afficher sur ce CDialog des champs à remplir (nombre variable de CEdit)

    => Donc ma classe "CDynamicForm" n'a pas besoin d'être elle même un CDialog, ou est-ce que je me trompe ?

    Logiquement il faudrait selon moi pour créer mon "Formulaire Dynamique", simplement passer en paramètre :
    -le nombre de champs
    -le CDialog où doivent s'afficher les CEdit

    Donc je vire l'héritage que j'avais fais de CDialog...
    Je fais mon petit test de tout ca... je passe en parametre le nombre de champ est le CDialog (comme tout à l'heure)... et -> Ca marche pas...


  14. #14
    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
    re,
    sans voir ton implementation on ne peux rien dire .
    montre la definition de ta classe et son implementation dans un premier temps.
    apres on verra son utilisation ...


  15. #15
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Ok... donc voila :

    La classe pour le "Formulaire Dynamique":
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    class CDynamicForm
    {
    private:
      int nControlID;
      CEdit*	pEdit;
      CObArray array_EditBoxes; 
      CRect rect;
     
    public:
      CDynamicForm();
      CDynamicForm(int,CWnd*);
      virtual ~CDynamicForm();
    };
     
    CDynamicForm::CDynamicForm()
    {
     nControlID = 100;
    }
     
    CDynamicForm::CDynamicForm(int n,CWnd* pParendWnd)
    {
      nControlID = 100;
     
      for (int i=0 ; i < n ; i++)
      {
       rect.bottom = 30+i*30;
       rect.top = 10+i*30;
       rect.right = 100;
       rect.left = 10; 
       pEdit=new CEdit; 
       pEdit->Create(WS_VISIBLE |ES_AUTOHSCROLL|ES_LEFT ,rect, pParendWnd,nControlID ) ;
       pEdit->ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED);
       array_EditBoxes.Add(pEdit);
       nControlID++; 
      }
    }
     
    CDynamicForm::~CDynamicForm()
    {
     for (int i=0; i <array_EditBoxes.GetSize() ; i++ )
     {
       pEdit = (CEdit *)array_EditBoxes.GetAt(i);
       delete pEdit;
      }
     array_EditBoxes.RemoveAll();
    }
    Sous visual c++, j'ai crée un projet MFC, sous forme de dialogue, et c'est sur ce dialogue que je voudrais afficher un nombre n de CEdit ("Formulaire dynamique")

    Pour ce faire je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    BOOL CDynamicMFCDlg::OnInitDialog()
    {
     CDialog::OnInitDialog();
     
     ...
     
     CDynamicForm Formulaire(3,this); //afficher 3 CEdit sur le CDialog
     
     return TRUE;  // return TRUE  unless you set the focus to a control
    }
    => mais ca marche pas...

    Merci à ceux qui prennent le temps de lire tout ca...

  16. #16
    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
    en debug tu rentres dans la fonction OnInitDialog() ?
    cette boite de dialogue elle est modale ? (appel de la fonction DoModal())
    de plus je viens de voir une chose la declaration de objet est local a la fonction OninitDialog ,donc quand il sort de sa portée il se detruit ,
    et que ce passe t'il dans ton destructeur ?
    reponse tu detruis les controles .
    solution : déclare en donnée membre une variable de cette classe .


  17. #17
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Farscape t'es un chef

    Oui je rentre en Debug dans la fonction OnInitDialog().

    Oui la boite de Dialogue est modale. (Ca changerait quoi si elle l'était pas ? )

    Je viens de faire un test. J'ai déclare en variable global un pointeur sur un CDynamicForm.
    Dans OnInitDialog(), je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Formulaire = new CDynamicForm(3,this);
    et ca marche !!!

    Par contre j'ai un problème quand je veux que Formulaire soit une variable membre de mon CDialog.

    Dans la déclaration de la classe CDynamicMFCDlg, j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:
    	CDynamicForm* Formulaire;
    Dans le constructeur j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Formulaire = new CDynamicForm(3,this);
    Et dans CDynamicMFCDlg::OnOK() : => avec ca j'ai le droit à un beau plantage au lancement de l'appli.

    Elle est où ma bêtise ???

  18. #18
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    J'ai résolu mon problème en ajoutant une méthode setFormulaire(int,CWnd*) à la classe CDynamicMFCDlg.

    Au lieu de créer mon Formulaire Dynamique dans le constructeur de mon CDialog, je fais appel a setFormulaire dans DynamicMFCDlg::OnInitDialog() et ca marche

    Mais bon je sais toujours pas pourquoi ca ne marche pas de l'autre façon... si quelqu'un pouvait m'éclairer histoire que je me couche moins bête ce soir...

  19. #19
    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
    re,
    et bien c'est simple ,
    les objets fenetres MFC (idem pour les controles) ne sont jamais prets graphiquement dans le constructeur .


    il faut mettre en place les parties graphiques des fenetres filles (controles etc).
    dans les fonctions adaptées:
    pour une CDialog : OnInitDialog.
    pour une CFormView : OnInitialUpdate.


  20. #20
    Membre régulier Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Points : 79
    Points
    79
    Par défaut
    Oh la la il me reste tant de chose à apprendre (soupir)

    En tout cas merci beaucoup pour ton aide.


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

Discussions similaires

  1. pb avec composant visuel créé dynamiquement
    Par richard038 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 12/08/2005, 10h59
  2. [DLL] Acces a une methode par son index de maniere dynamique
    Par Clorish dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 11/03/2005, 18h14
  3. Comment acceder à un champ d'une maniere dynamique ?
    Par jpg dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/11/2004, 16h23
  4. aide sur création d'un composant
    Par laetus dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/07/2004, 11h45
  5. Création d'un composant et couleurs
    Par gibet_b dans le forum Composants VCL
    Réponses: 4
    Dernier message: 06/07/2004, 14h44

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