Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


Fallo al pasar variables de 2 diálogos

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

Fallo al pasar variables de 2 diálogos

Notapor hanem el Mar Abr 10, 2007 3:56 am

Hola.

Tengo dos diálogos, uno de ellos empotrado en un Tab Control.
Necesito pasar una variable de un Dialogo normal al otro que está en el Tab Control. Yo uso el siguiente código:

Código: Seleccionar todo
Congreso.h

CCongreso(CInv_CMDatosCurr* pParent = NULL);   // standard constructor,
---------------------------------------------------------------------------------
Congreso.cpp

CCongreso::CCongreso(CInv_CMDatosCurr* pParent /*=NULL*/)
   : CDialog(CCongreso::IDD, pParent), m_pPrincipal(pParent) 
---------------------------------------------------------------------------------
Y en esta función prueba() m_pPrincipal es el puntero a la clase CInv_CMDatosCurr, de donde tomamos el valor de m_prueba y lo pasamos a la variable m_titulo_con de la clase CCongreso

prueba()
{
   m_titulo_con = m_pPrincipal->m_prueba;
   UpdateData(FALSE);
}


Pero nos falla al hacer m_titulo_con = m_pPrincipal->m_prueba;
y se cierra el programa.

Siempre hemos utilizado esta forma para pasar valores cuando son dos diálogos normales y nunca nos ha fallado. Creemos que puede ser que falle porque uno de ellos está en un Tab Control.

¿Cómo podemos hacer para solucionar esto?

Gracias.
hanem
Novato
Novato
 
Mensajes: 7
Registrado: Mar Mar 13, 2007 3:09 pm

Re: Fallo al pasar variables de 2 diálogos

Notapor latindeveloper el Mar Abr 10, 2007 6:29 pm

Podrías mostrarnos el codigo en el que inicializas y utilizas las clases
CCongreso y CInv_CMDatosCurr, por que me parece que m_pPrincipal es NULL o una variable equivocada.
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

RESPUESTA

Notapor hanem el Mié Abr 11, 2007 4:11 am

Si aqui te la dejo.

Congreso.h
Código: Seleccionar todo
class CCongreso : public CDialog
{
// Construction
public:
   void CargarDatosCongreso();
   BOOL OnInitDialog();
   CCongreso(CInv_CMDatosCurr* pParent = NULL);   // standard constructor

   DECLARE_DYNCREATE( CCongreso)
// Dialog Data
   //{{AFX_DATA(CCongreso)
   enum { IDD = IDD_CONGRESO };
   CString   m_titulo_con;
   //}}AFX_DATA

   CInv_CMDatosCurr* m_pPrincipal;
// Overrides
   // ClassWizard generated virtual function overrides
   //{{AFX_VIRTUAL(CCongreso)
   protected:
   virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
   //}}AFX_VIRTUAL

// Implementation
protected:


   // Generated message map functions
   //{{AFX_MSG(CCongreso)
   afx_msg void OnButton1();
   //}}AFX_MSG
   DECLARE_MESSAGE_MAP()
};

congreso.cpp
Código: Seleccionar todo
// CCongreso dialog

IMPLEMENT_DYNCREATE( CCongreso, CDialog )
CCongreso::CCongreso(CInv_CMDatosCurr* pParent /*=NULL*/)
   : CDialog(CCongreso::IDD, pParent), m_pPrincipal(pParent)
{
   //{{AFX_DATA_INIT(CCongreso)
   m_titulo_con = _T("");
   //}}AFX_DATA_INIT
}


void CCongreso::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   //{{AFX_DATA_MAP(CCongreso)
   DDX_Text(pDX, IDC_EDIT1, m_titulo_con);
   //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCongreso, CDialog)
   //{{AFX_MSG_MAP(CCongreso)
   ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCongreso message handlers

BOOL CCongreso::OnInitDialog()
{
   SetWindowPos(&CWnd::wndTopMost, 0, 0, 800, 600, SWP_SHOWWINDOW|SWP_NOMOVE); //Se establece el tamaño de ventana
   CenterWindow();         //se centra la ventana
   
   
   return TRUE;
}

void CCongreso::CargarDatosCongreso()
{
   
   m_titulo_con = m_pPrincipal->m_prueba;
   
   UpdateData(FALSE);


}

void CCongreso::OnButton1()
{
CargarDatosCongreso();
}


CInv_CMDatosCurr.h
Código: Seleccionar todo
// CInv_CMDatosCurr dialog

class CInv_CMDatosCurr : public CDialog
{
// Construction
public:
   void prueba();
   CMenu_Inv* m_pPrincipal;

   BOOL OnInitDialog();
   CInv_CMDatosCurr(CMenu_Inv* pParent = NULL);   // standard constructor

// Dialog Data
   //{{AFX_DATA(CInv_CMDatosCurr)
   enum { IDD = IDD_CM_DATOS_CURR };
   CString   m_prueba;
   //}}AFX_DATA


// Overrides
   // ClassWizard generated virtual function overrides
   //{{AFX_VIRTUAL(CInv_CMDatosCurr)
   protected:
   virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
   //}}AFX_VIRTUAL

// Implementation
protected:

   // Generated message map functions
   //{{AFX_MSG(CInv_CMDatosCurr)
   afx_msg void OnBUTTONExpInv();
   afx_msg void OnButtonExpDoc();
   //}}AFX_MSG
   DECLARE_MESSAGE_MAP()
};

CInv_CMDatosCurr.cpp
Código: Seleccionar todo
CInv_CMDatosCurr::CInv_CMDatosCurr(CMenu_Inv* pParent /*=NULL*/)
   : CDialog(CInv_CMDatosCurr::IDD, pParent),m_pPrincipal(pParent)
{
   //{{AFX_DATA_INIT(CInv_CMDatosCurr)
   m_prueba = _T("");
   //}}AFX_DATA_INIT
}


void CInv_CMDatosCurr::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
   //{{AFX_DATA_MAP(CInv_CMDatosCurr)
   DDX_Text(pDX, IDC_EDIT1, m_prueba);
   //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CInv_CMDatosCurr, CDialog)
   //{{AFX_MSG_MAP(CInv_CMDatosCurr)
   ON_BN_CLICKED(IDC_BUTTON_Exp_Inv, OnBUTTONExpInv)
   ON_BN_CLICKED(IDC_BUTTON_EXP_DOC, OnButtonExpDoc)
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInv_CMDatosCurr message handlers

BOOL CInv_CMDatosCurr::OnInitDialog()
{
      CDialog::OnInitDialog();

   
   // TODO: Add extra initialization here
   
   SetWindowPos(&CWnd::wndTopMost, 0, 0, 800, 600, SWP_SHOWWINDOW|SWP_NOMOVE); //Se establece el tamaño de ventana
   CenterWindow();         //se centra la ventana
   prueba();
   return TRUE;

}

void CInv_CMDatosCurr::OnBUTTONExpInv()
{
   int r;
   CExp_Inv dlg_exp_inv(this);

   r=dlg_exp_inv.DoModal();   
}

void CInv_CMDatosCurr::OnButtonExpDoc()
{
   int r;
   CExp_Doc dlg_exp_doc(this);

   r=dlg_exp_doc.DoModal();   
}

void CInv_CMDatosCurr::prueba()
{
   m_prueba=m_pPrincipal->m_pNombre;
   UpdateData(FALSE);
}


El puntero que utilizo en esta ultima función de prueba si que funciona perfectamente, pues pasa el valor entre dos diálogos que no están insertados en ningún tab. El problema me lo da el puntero m_pPrincipal de la clase CCongreso,el diálogo que contiene esta clase si está insertado dentro de un tab. Haber si con esto sabe dónde está el error.

Muchas gracias!!
hanem
Novato
Novato
 
Mensajes: 7
Registrado: Mar Mar 13, 2007 3:09 pm

Necesito mas informacion.

Notapor latindeveloper el Sab Abr 14, 2007 10:18 am

Por favor enviame tu proyecto no es necesario que este completo (no enviar las carpetas debug/release) a ivancp -@- latindevelopers.com.

Por que segun el codigo que estas mostrando debería funcionar correctamente, seguramente el problema esta en los confines de tu proyecto.
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Finalmente

Notapor latindeveloper el Sab Abr 21, 2007 4:07 pm

Hola,

1. La clase CExp_Inv es la que contiene al control tab con los dialogos. el codigo con el que agregas los dialogos como un elemento del tab es :

m_tabMain.AddPage( IDD_CONGRESO, RUNTIME_CLASS( CCongreso ), _T("Congreso/Conferencia Cientifíca") );
m_tabMain.AddPage( IDD_PROYECTO, RUNTIME_CLASS( CProyecto ), _T("Proyecto") );
m_tabMain.AddPage( IDD_PUBLIC_CIENT, RUNTIME_CLASS( CPublic_Cient ), _T("Publicación Científica") );

Notar que estas inicializando las clases con RUNTIME_CLASS, en ningun momento le pasas un apuntador a un dialogo como variable. Si el control tab es quien contiene al dialogo CCongreso entonces ése es el dialogo padre (parent). (Pero creo que en realidad la variable al principio es NULL)

CCongreso::CCongreso(CInv_CMDatosCurr* pParent /*=NULL*/)

Entonces jamas se llega a identificar a donde apunta la variable CInv_CMDatosCurr* pParent .

2. Ahora en la clase CCongreso hay una variable CInv_CMDatosCurr* m_pPrincipal; que debería inicializarse en el constructor de la clase, pero no lo hace por lo explicado en 1.

Para solucionar el problema.

Obtener el padre (ctrl tab) del padre (CExp_Inv) del padre (CInv_CMDatosCurr) del dialogo que esta contenido en el control tab. algo asi como:

Código: Seleccionar todo
BOOL CCongreso::OnInitDialog()
{
//   SetWindowPos(&CWnd::wndTopMost, 0, 0, 800, 600, SWP_SHOWWINDOW|SWP_NOMOVE); //Se establece el tamaño de ventana
   CenterWindow();         //se centra la ventana
   

   CWnd* wnd =   GetParent()->GetParent()->GetParent();
   m_pPrincipal = (CInv_CMDatosCurr* )wnd;

   return TRUE;
}


Y problema solucionado.

Conclusion.

He notado que tu proyecto es basado en dialogos, pero es un dialogo tras otro dialogo, tras otro y tras otros mas... es decir una mezcolanza. Supongo que por eso que es muy dificil pasar parametros de un dialogo a otro por que hay varios dialogos en medio.

Te recomiendo (y es en serio) que cambies la manera de trabajar, por que las proximas veces tendras problemas mas dificiles de encontrar. No uses dialogos como menús... usa el tipo de proyecto SDI (simple document interface) y desde el menú accedes a cada dialogo.

Tambien he notado que colocas el dialogo como "siempre visible":

SetWindowPos(&CWnd::wndTopMost, 0, 0, 800, 600, SWP_SHOWWINDOW|SWP_NOMOVE);

Basta con invocarlos con DoModal para que no puedan acceder al dialogo anterior.....

... en fin..... fue un dolor de cabeza encontrar el problema pero ya esta solucionado.

Saludos.
Imagen
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

GRACIAS

Notapor hanem el Mar May 01, 2007 6:55 am

Hola!!

gracias por la ayuda, y además por los consejos.Son muy pocos los manuales que hay sobre Visual C++,y por lo general, no profundizan mucho.

Un saludo!!
hanem
Novato
Novato
 
Mensajes: 7
Registrado: Mar Mar 13, 2007 3:09 pm


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado