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


Puntero de un Dialogo hacia el Documento

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

Moderador: latindeveloper

Puntero de un Dialogo hacia el Documento

Notapor johnny el Jue Ago 05, 2004 7:19 pm

Hola a todos

Tengo el siguiente problema:

Tengo una Aplicacion SDI con Arquitectura Documento/Vista generada con el AppWizard de Visual C++ 6.0

Desde el Documento llamo aun dialogo modal, a dicho dialogo necesito cargarlo con un array de datos que estan en el Documento.

¿Como optengo un puntero (m_pDoc) miembro de la clase dialogo (CDatosDlg) que apunte hacia el Documento (CAplicacionDoc)?

Les agradeceria mucho que mé den una idea, desde ya muchas gracias.

Johnny.
johnny
Usuario Activo
Usuario Activo
 
Mensajes: 47
Registrado: Lun Jun 21, 2004 4:02 pm
Ubicación: Arequipa-Perú

Re: Puntero de un Dialogo hacia el Documento

Notapor latindeveloper el Jue Ago 05, 2004 9:39 pm

Antes de responderte primero quiero aclarar unas cosas:


1. La funcion que llama a tu dialogo esta dentro de la clase CMainFrame o dentro de la Vista que esta contenida en la vetana principal.

Es decir:
Código: Seleccionar todo
  CMainFrame::OnAbrirDialogo()
  {
      CDatosDlg dlg(this);
      dlg.DoModal();
  }

ó
Código: Seleccionar todo
  CTuView::OnAbrirDialogo()
  {
      CDatosDlg dlg;
      dlg.DoModal();
  }

2. El array del que hablas de que tipo es? es un puntero o una lista.
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Re: Puntero de un Dialogo hacia el Documento

Notapor johnny el Sab Ago 07, 2004 1:24 pm

Antes que nada gracias por responder.

1ro. La Funcion que llama el dialogo es miembro de la clase Documento:

Código: Seleccionar todo
void CShummanDoc::OnIngresodatos()
{
       CDatosDlg dlg;
       if(dlg.DoModal()==IDOK)
       {
       }
}


Llamo al dialogo asi, porque se supone que la clase CShummanDoc es la encargada de manejar la informacion osea:

Cada vez que se abra un nuevo documento desseriar la informacion

Código: Seleccionar todo
CShummanDoc::CShummanDoc()
{
       // TODO: add one-time construction code here
       m_pSeriarDatos=new CObArray;
}

BOOL CShummanDoc::OnNewDocument()
{
       if (!CDocument::OnNewDocument())
              return FALSE;

   //Verificar si existe el fichero
   CFileStatus Estado;
   if(CFile::GetStatus(pszNomArch,Estado))
   {
      CFile fiDatosShumman;
      fiDatosShumman.Open(pszNomArch,CFile::modeRead);
      CArchive arDatosShumman(&fiDatosShumman,CArchive::load);
      //Eliminar el objeto anterior
      delete m_pSeriarDatos;
      //Cargar el Array con los datos del fichero (Deseriar)
      arDatosShumman>>m_pSeriarDatos;
      //Cerrar
      arDatosShumman.Close();
      fiDatosShumman.Close();
      m_bExisteElementos=true;
   }
   else
      m_bExisteElementos=false;

   return TRUE;
}


2 do. El array (m_pSeriarDatos) que necesito cargar en el dialogo CDatosDlg es un puntero a CObArray. Osea:

Código: Seleccionar todo
class CShummanDoc : public CDocument
{
protected: // create from serialization only
   CShummanDoc();
   DECLARE_DYNCREATE(CShummanDoc)
public:
   bool m_bExisteElementos;
   bool m_bDatosValidos;
   CObArray *m_pSeriarDatos;  // <- Este es el Array
   bool m_bArrayModificado;
};


Cuando el usuario ingresa al dialogo vera 4 Listas con datos cargados, Él podra modificar los datos o Aceptarlos tal como estan.

Luego en la vista Se vera graficada dos curvas en base a los datos Aceptados. Ya que la Vista Tiene un puntero que Accede al Documento.
CShummanDoc* pDoc = GetDocument();

Actualmente estoy cargando los datos en el dialogo duplicando la informacion asi:

Código: Seleccionar todo
void CShummanDoc::OnIngresodatos()
{
   int iNumElem,ind;
   CDatosDlg dlg;
   //Si el array tiene elementos copiarlos en el dlg
   if(m_bExisteElementos)
   {
      iNumElem=m_pSeriarDatos->GetSize();
      CSeriarDatos *pObjeto;
      for(ind=0;ind<iNumElem;ind++)
      {
         pObjeto=(CSeriarDatos*)m_pSeriarDatos->GetAt(ind);
         dlg.m_aStrMallas[ind]=pObjeto->m_sMallas;
         dlg.m_aDouMicr[ind]=pObjeto->m_dMicrones;
         dlg.m_aDouAlim[ind]=pObjeto->m_dPeAlim;
         dlg.m_aDouDesc[ind]=pObjeto->m_dPeDesc;
      }
      dlg.m_iMax=iNumElem;
   }
   //Si se acepta el ingreso de datos
   if(dlg.DoModal()==IDOK)
   {
      //...

   }
   UpdateAllViews(NULL);//Para que se actualizen las vistas   
}


Lo cual me parece ineficiente, por eso quiero saber como obtengo un puntero desde el Dialogo (CDatosDlg) Hacia la clase Documento (CShummanDoc)

Espero que me puedad ayudar. Gracias
Johnny.
johnny
Usuario Activo
Usuario Activo
 
Mensajes: 47
Registrado: Lun Jun 21, 2004 4:02 pm
Ubicación: Arequipa-Perú


Volver a Visual C++

¿Quién está conectado?

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