De un modal de diálogo MFC, quiero extraer el texto de un cuadro de edición después de que el cuadro de diálogo se cierra. He intentado esto:

CPreparationDlg Dlg;
CString m_str;

m_pMainWnd = &Dlg;
Dlg.DoModal();
CWnd *pMyDialog=AfxGetMainWnd();
CWnd *pWnd=pMyDialog->GetDlgItem(IDC_EDIT1);
pWnd->SetWindowText("huha max");
return TRUE;

No funciona.

InformationsquelleAutor abhinav | 2011-05-10

4 Comentarios

  1. 21

    El diálogo y sus controles no se crea hasta que llame DoModal() y como ya se ha señalado, se destruyeron ya por el tiempo DoModal() devuelve. Debido a que usted no puede llamar a GetDlgItem() ni antes, ni después de DoModal(). La solución pase o recuperar los datos a un control, es el uso de una variable en la clase. Se puede establecer cuando se crea la instancia de la clase, antes de la llamada a DoModal(). En OnInitDialog() se pone en el control el valor de la variable. Entonces, cuando se destruye la ventana, se obtiene el valor del control y la puso en la variable. Luego se lee la variable del contexto de llamada.

    Algo como esto (aviso que he escrito directamente en el navegador, por lo que puede haber errores):

    class CMyDialog : CDialog
    {
      CString m_value;
    public:  
      CString GetValue() const {return m_value;}
      void SetValue(const CString& value) {m_value = value;}
    
      virtual BOOL OnInitDialog();
      virtual BOOL DestroyWindow( );
    }
    
    BOOL CMyDialog::OnInitDialog()
    {
      CDialog::OnInitDialog();
    
      SetDlgItemText(IDC_EDIT1, m_value);
    
      return TRUE;
    }
    
    BOOL CMyDialog::DestroyWindow()
    {
      GetDlgItemText(IDC_EDIT1, m_value);
    
      return CDialog::DestroyWindow();
    }

    A continuación, se puede utilizar como esto:

    CMyDialog dlg;
    
    dlg.SetValue("stackoverflow");
    
    dlg.DoModal();
    
    CString response = dlg.GetValue();
    • thnx por tu comentario,me puede dar el código con los cambios que están diciendo..
    • He editado la respuesta anterior con un ejemplo.
    • Thnx mucho su trabajo ahora,que tuvieron un gran peso sobre mí.
    • hay una marca de verificación puede hacer clic en para expresar ese sentimiento
    • Acabo de utilizar esta conmigo, gracias. +1.
  2. 2
    1. Abrir su recurso de cuadro de diálogo, haga clic en el cuadro de texto y seleccione la opción «Agregar variable», de selección de tipo de valor y CString
    2. En el cuadro de diálogo de la clase: antes del cierre, llame UpdateData(TRUE)
    3. Fuera del cuadro de diálogo:

      CPreparationDlg dlg(AfxGetMainWnd());
      
      dlg.m_myVariableName = "my Value"; 
      
      dlg.DoModal();

      //el nuevo valor es todavía en la dlg.m_myVariableName

  3. 0

    DoModal() destruye el cuadro de diálogo antes de que se devuelve y por lo que el valor ya no está disponible.

    Es difícil saber por qué se está estableciendo m_pMainWnd a su cuadro de diálogo. Para ser honesto, no estoy muy seguro de lo que estás tratando de hacer allí. Que está destinado a causar problemas, ya que ahora AfxGetMainWnd() está roto.

    De cualquier manera, usted no puede obtener el cuadro de diálogo de control de valores después de que el diálogo ha sido destruido.

    • thnx por tu comentario,soy muy nuevo en esto de vc++ mfc, he eliminado esa línea, incluso entonces no se está ejecutando, se puede señalar otra forma de extraer los datos de un campo
    • que no se está ejecutando desde aquí ASSERT(::IsWindow(m_hWnd));
    • no es correr, porque de este error ASSERT(::IsWindow(m_hWnd));
  4. 0

    Utilizo a menudo

    D_SOHINH dsohinh = new D_SOHINH();
        dsohinh.vd_kichthuoc=v_kichthuocDOC;
        dsohinh.vd_sohinh=v_soluongDOC;
        if(dsohinh.DoModal()==IDOK)
        {
            v_soluongDOC=dsohinh.vd_sohinh;
            v_kichthuocDOC=dsohinh.vd_kichthuoc;
        }
        SetModifiedFlag(true);
        UpdateAllViews(NULL);

    Con dsohinh dialogo, de forma que se desea obtener datos para mainform .
    Después de obtener los datos, a continuación, llamar a SetModifiedFlag(verdadero) para establecer la vista de los datos actualizados.
    llame UpdateAllViews(NULL) para el Conjunto de datos a mainform

Dejar respuesta

Please enter your comment!
Please enter your name here