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 :

problème de mise a jour des controls


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut problème de mise a jour des controls
    bonjour, mon problème et que je veux metre à jour l'affichage des controls dans mon dialog, j'ai utiliser OnInitDialog() dans un Thread mais sa ne marche pas car elle est protegée. Help please

    mon code parcoure un disque tout en affichant les roots des fichiers

    voilà mon code, sa vous aideras a mieux comprendre
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
     
     /////////////////////////////////////////////////////////////////////////////
    // CVProject0Dlg dialog
     
    CVProject0Dlg::CVProject0Dlg(CWnd* pParent /*=NULL*/)
        : CDialog(CVProject0Dlg::IDD, pParent)
    {
        //{{AFX_DATA_INIT(CVProject0Dlg)
        //}}AFX_DATA_INIT
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
     
    void CVProject0Dlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CVProject0Dlg)
        DDX_Control(pDX, IDC_EDIT4, m_Disque);
        DDX_Control(pDX, IDC_EDIT3, m_Vnbr);
        DDX_Control(pDX, IDC_EDIT2, m_Fnbr);
        DDX_Control(pDX, IDC_EDIT1, m_str);
        //}}AFX_DATA_MAP
    }
     
    BEGIN_MESSAGE_MAP(CVProject0Dlg, CDialog)
        //{{AFX_MSG_MAP(CVProject0Dlg)
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CVProject0Dlg message handlers
     
    BOOL CVProject0Dlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
     
        // Set the icon for this dialog.  The framework does this automatically
        //  when the application's main window is not a dialog
        SetIcon(m_hIcon, TRUE);            // Set big icon
        SetIcon(m_hIcon, FALSE);        // Set small icon
     
        // TODO: Add extra initialization here
     
        ////////////////////////////////////////////////////////////////////////////
        CString c=variable::global; 
        int a=variable::Fnbr;
        int b=variable::Vnbr;
        UpdateData(TRUE);
        m_str.SetWindowText(c);
        SetDlgItemInt(IDC_EDIT2,a,TRUE);
        SetDlgItemInt(IDC_EDIT3,b,TRUE);
        return TRUE;  // return TRUE  unless you set the focus to a control
    }
     
    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.
     
     
    void CVProject0Dlg::OnPaint() 
    {
        if (IsIconic())
        {
            CPaintDC dc(this); // device context for painting
     
            SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
     
            // Center icon in client rectangle
            int cxIcon = GetSystemMetrics(SM_CXICON);
            int cyIcon = GetSystemMetrics(SM_CYICON);
            CRect rect;
            GetClientRect(&rect);
            int x = (rect.Width() - cxIcon + 1) / 2;
            int y = (rect.Height() - cyIcon + 1) / 2;
     
            // Draw the icon
            dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
            CDialog::OnPaint();
        }
    }
     
    // The system calls this to obtain the cursor to display while the user drags
    //  the minimized window.
     
     
    // The system calls this to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CVProject0Dlg::OnQueryDragIcon()
    {
        return (HCURSOR) m_hIcon;
    }
     
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT UpDate(LPVOID pParam)
    {
        int condit=0;
        while (condit==0)
        {
        CVProject0Dlg::OnInitDialog();
        }
        return 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT TheThread(LPVOID pParam)
    {
        Recurse(variable::Disque);
        AfxMessageBox("Analyse Terminer");
        return 0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    void CVProject0Dlg::OnOK() 
    {
    // TODO: Add extra validation here
        if (variable::condition==0)
            {
                variable::condition=1;
                variable::Fnbr=0;
                variable::Vnbr=0;
                m_Disque.GetWindowText(variable::Disque);
                AfxBeginThread(TheThread,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
                AfxBeginThread(UpDate,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
                }
     
    }
    la prochaine fois utilise la balise de code, Merci Farscape

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    As-tu essayé updateData(false); ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    oui j'ai essayer mais sa ne fonctionne pas

  4. #4
    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,
    tel que tu l'as écrit ce n'est pas étonnant.
    OnInitDialog n'est pas une fonction statique...
    d'ailleurs je ne comprends pas trop pourquoi tu essayes de faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UINT UpDate(LPVOID pParam)
    {
        int condit=0;
        while (condit==0)
        {
        CVProject0Dlg::OnInitDialog();
    
        }
        return 0;
    }
    pour travailler avec les threads voir la faq: http://c.developpez.com/faq/vc/?page...keWorkerThread

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    désoler j'ai oublié de vous dire que je suis un débutant un vrais,
    je crois que j'ai mal expliqué ce que je veux faire de ce code.
    voilà
    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
     
    ///////////////////////////////////////////////////////////////////////////////////
    void CVProject0Dlg::OnOK() 
    {
    // TODO: Add extra validation here
        if (variable::condition==0)
            {
                variable::condition=1;
                variable::Fnbr=0;
                variable::Vnbr=0;
                m_Disque.GetWindowText(variable::Disque);
                     AfxBeginThread(TheThread,GetSafeHwnd(),THREAD_PRIORITY_NORMAL);
                }
                 CVProject0Dlg::OnInitDialog();
     }
    ////////////////////////////////////////////////////////////////////////////////////
    maintenant on appuyant sur le bouton OK , le thread va exécute une fonction de recherche appelée recurse qui va mettre a jour certains variable : variable::Fnbr , variable::Vnbr et variable::global qui sont associer a des contrôles. maintenant lorsque j'ajoute CVProjectODlg::OnInitDialog( ); si j'appuie successivement sur le bouton OK l'affichage va être mis a jour. mais moi se que je veux faire et de ne plus avoir a appuyer sur OK car se n'est pas faisable. alors j'ai opté pour un thread qui ne fait que a appeler CVProjectODlg::OnInitDialog( ); pour que l'affichage des CEdit (controles) se met a jour. c'est pour sa que j'ai mis une condition qui est toujours vrais, mais cette deniére ne fonctionne pas.
    ce que je cherche est s'il y a une autre solution pour mètre a jour l'affichage ou une correction en sachant que je suis un débutant qui a une expérience de 2 mois dans la prog MFC et que j'ai appris ce que j'ai appris tout seul en s'aidant sur les peu cours et tutos. So please

  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,
    OnInitDialog ne doit être appelée qu'une seule fois ....!
    pour mettre a jour les contrôles d'après les variables on utilise :
    UpdateData(FALSE); voir faq.

    un thread (en debug) ne peut appeler directement une fonction liée à la gestion des contrôles (ceci est expliqué dans la faq ).
    UpdateData ne pourra pas être appelé directement dans le thread du moins en debug (en release ce n'est pas très académique mais ça fonctionne).
    on utilisera une fonction privée:
    http://c.developpez.com/faq/vc/?page...d#WorkerThread

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    merci farscape je vais essayer et voir ce que sa va donné

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Salut, j'ai fais ce que vous m'aviez suggérer de faire en utilisant un Thread de service mais ca na rien résolut car quand j'utilise pour la déclaration du message privé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    long CVProject0App::OnReceiveTest(WPARAM wparam, LPARAM lparam)
    {
    CVProject0Dlg::OnInitDialog();
    return 0L;
    }
    Sa revient au même j'ai comme erreur :
    f:\projet\vproject0\vproject0dlg.h(53) : error C2352: 'CVProject0Dlg::OnInitDialog' : illegal call of non-static member function
    f:\projet\vproject0\vproject0dlg.h(27) : see declaration of 'OnInitDialog'
    VProject0Dlg.cpp
    En plus même en changeant CVProject0Dlg::OnInitDialog(); par AfxMessageBox("coucou"); pour voir si sa fonctionne ou pas sa ma rien donné, pas d'erreur mais pas de box non plus
    Aussi je croit avoir trouver une erreur, je ne suis pas sure mais, quand j'ai utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    UINT TheThread(LPVOID pParam)
    {
    HWND hWnd= reinterpret_cast< HWND >( pvParam) ;
    ::PostMessage(hWnd,WM_TEST,0,0) ;
    return 0 ;
    }
    j'ai une erreur la variable "pvParam" est non déclarée, je crois que c'est "pParam" et non "pvParam". Reste a voir

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Salut farscape je veux juste te remercier pour ton aide et surtout pour ton tuto

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

Discussions similaires

  1. [AC-2007] [urgent] Problème de mise a jours des tables
    Par Jean351 dans le forum Projets ADP
    Réponses: 1
    Dernier message: 21/05/2014, 13h30
  2. Databinding sur des controles - problème de mise a jour
    Par boby62423 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/03/2009, 09h52
  3. Mise a jour des control avant affichage
    Par kacedda dans le forum MFC
    Réponses: 3
    Dernier message: 28/03/2007, 13h56
  4. problème de mise a jour
    Par leeloo076 dans le forum ASP
    Réponses: 3
    Dernier message: 15/04/2004, 16h09
  5. [] [Install] Problème de mise à jour des dll
    Par pepper dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 23/01/2003, 22h34

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