Cambiar Caption II

13/09/2003 - 21:27 por Demon | Informe spam
Hola de nuevo!!

Weno, parece ke nadie más puede ayudarme, así ke lo intentaré de nuevo, esta
vez con el código exacto.

Recordatorio: Intento cambiar dinámicamente el caption de una ventana de
diálogo desde dentro de una función. He intentado usar SetWindowText, pero
me genra un error de aserción.

La clase asociada al diálogo está definida de la siguiente forma:

class CMetalProp : public CDialog // Observad ke deriva de CDialog
{
// Construction
public:
CMetalProp(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CMetalProp)
enum { IDD = IDD_DMETALPROP };
CString m_Name;
double m_WorkFunction;
//}}AFX_DATA


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

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CMetalProp)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};


Desde un gestor de eventos de la clase CView intento cambiar el caption
antes de mostar el diálogo kon DoModal, y es ahí donde se genera el error:

void CDeviceView::OnMaterialsAnode()
{
CDeviceDoc *pdoc=GetDocument();
CMetalProp cmp;
CString str;
cmp.SetWindowText(" Anode"); <-- ERROR: ASSERTION FAILURE
cmp.m_Name=pdoc->m_Device.m_Anode.m_Name;
cmp.m_WorkFunction=pdoc->m_Device.m_Anode.m_WorkFunction;
cmp.DoModal();
pdoc->m_Device.m_Anode.m_Name=cmp.m_Name;
pdoc->m_Device.m_Anode.m_WorkFunction=cmp.m_WorkFunction;

}

Al parecer no rekonoce a cmp como CWnd, aunke deriva de CDialog, ke a su vez
deriva de CWnd.
Alguna sugerencia?

Gracias

Demon.

Preguntas similare

Leer las respuestas

#1 christian
14/09/2003 - 00:02 | Informe spam
promero con el class wizard
define
OnCreate o InitDialog

ahi dentro haz lo siguiente:

CString tutexto;
o
char* tutexto = "Hola";

SetWindowText(tutexto);
o
::SetWindowText(m_hWnd,tutexto);
Respuesta Responder a este mensaje
#2 Demon
14/09/2003 - 03:00 | Informe spam
Gracias, Christian!

Esa sería una buena opción si estuviera intentando cambiar el caption desde
dentro del diálogo, pero si miras el código verás ke lo intento cambiar
desde otra función, la ke krea el diálogo.

"christian" escribió en el mensaje
news:338b01c37a42$ac695400$
promero con el class wizard
define
OnCreate o InitDialog

ahi dentro haz lo siguiente:

CString tutexto;
o
char* tutexto = "Hola";

SetWindowText(tutexto);
o
::SetWindowText(m_hWnd,tutexto);

Respuesta Responder a este mensaje
#3 iflores
15/09/2003 - 09:12 | Informe spam
Hola Demon,

tu problema es que la ventana no está creada cuando intentas cambiar el
caption. En la función OnMaterialsAnode tienes que comprobar que la ventana
CMetalProp esté creada (no sólo el objeto). Para ello comprueba el manejador
de ventana cmd.m_hWnd es correcto antes de hacer una llamada a
SetWindowText. Tu problema es que el manejador de ventana se crea en la
llamada a la función DoModal.

Mi solución sería crear en la clase CMetalProp una variable pública del
tipo:
CString miCaption;

Luego implementar la función OnInitDialog en la misma clase y añadir allí la
llamada SetWindowText(miCaption) en el cuerpo de la función.

Entonces donde ahora tienes el cmp.SetWindowText("Anode"), en la función
OnMaterialsAnode, pones cmp.miCaption = "Anode" (creo que se puede hacer
directamente) y ya está

Así debería funcionar.

Saludos

Ismael Flores

"Demon" escribió en el mensaje
news:ew0%
Hola de nuevo!!

Weno, parece ke nadie más puede ayudarme, así ke lo intentaré de nuevo,


esta
vez con el código exacto.

Recordatorio: Intento cambiar dinámicamente el caption de una ventana de
diálogo desde dentro de una función. He intentado usar SetWindowText, pero
me genra un error de aserción.

La clase asociada al diálogo está definida de la siguiente forma:

class CMetalProp : public CDialog // Observad ke deriva de


CDialog
{
// Construction
public:
CMetalProp(CWnd* pParent = NULL); // standard constructor

// Dialog Data
//{{AFX_DATA(CMetalProp)
enum { IDD = IDD_DMETALPROP };
CString m_Name;
double m_WorkFunction;
//}}AFX_DATA


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

// Implementation
protected:

// Generated message map functions
//{{AFX_MSG(CMetalProp)
// NOTE: the ClassWizard will add member functions here
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};


Desde un gestor de eventos de la clase CView intento cambiar el caption
antes de mostar el diálogo kon DoModal, y es ahí donde se genera el error:

void CDeviceView::OnMaterialsAnode()
{
CDeviceDoc *pdoc=GetDocument();
CMetalProp cmp;
CString str;
cmp.SetWindowText(" Anode"); <-- ERROR: ASSERTION FAILURE
cmp.m_Name=pdoc->m_Device.m_Anode.m_Name;
cmp.m_WorkFunction=pdoc->m_Device.m_Anode.m_WorkFunction;
cmp.DoModal();
pdoc->m_Device.m_Anode.m_Name=cmp.m_Name;
pdoc->m_Device.m_Anode.m_WorkFunction=cmp.m_WorkFunction;

}

Al parecer no rekonoce a cmp como CWnd, aunke deriva de CDialog, ke a su


vez
deriva de CWnd.
Alguna sugerencia?

Gracias

Demon.



Respuesta Responder a este mensaje
#4 Demon
15/09/2003 - 11:07 | Informe spam
Hola, iflores!

Ante todo, muchas gracias, porke has despejado mis dudas.

En realidad, la solución ke propones es la ke estoy usando actualmente,
pero me parecía poco elegante tener ke agregar una variable miembro
adicional a la klase kuando la información ya la tenemos en el caption. Es
por eso ke intenté hacerlo de forma directa.

Sin embargo no se me había ocurrido pensar ke la ventana no estuviese
kreada (ké gilipollas!) Efectivamente, m_hWnd es NULL, y no se inicializa
hasta ke DoModal es llamada, porke antes de eso no existe ventana alguna!!!!

Así ke gracias de nuevo, iflores, por kitarme la venda de los ojos!! Ere
un mákina!!! jejeje.

Demon


"iflores" escribió en el mensaje
news:%
Hola Demon,

tu problema es que la ventana no está creada cuando intentas cambiar el
caption. En la función OnMaterialsAnode tienes que comprobar que la


ventana
CMetalProp esté creada (no sólo el objeto). Para ello comprueba el


manejador
de ventana cmd.m_hWnd es correcto antes de hacer una llamada a
SetWindowText. Tu problema es que el manejador de ventana se crea en la
llamada a la función DoModal.

Mi solución sería crear en la clase CMetalProp una variable pública del
tipo:
CString miCaption;

Luego implementar la función OnInitDialog en la misma clase y añadir allí


la
llamada SetWindowText(miCaption) en el cuerpo de la función.

Entonces donde ahora tienes el cmp.SetWindowText("Anode"), en la función
OnMaterialsAnode, pones cmp.miCaption = "Anode" (creo que se puede hacer
directamente) y ya está

Así debería funcionar.

Saludos

Ismael Flores

"Demon" escribió en el mensaje
news:ew0%
> Hola de nuevo!!
>
> Weno, parece ke nadie más puede ayudarme, así ke lo intentaré de nuevo,
esta
> vez con el código exacto.
>
> Recordatorio: Intento cambiar dinámicamente el caption de una ventana de
> diálogo desde dentro de una función. He intentado usar SetWindowText,


pero
> me genra un error de aserción.
>
> La clase asociada al diálogo está definida de la siguiente forma:
>
> class CMetalProp : public CDialog // Observad ke deriva de
CDialog
> {
> // Construction
> public:
> CMetalProp(CWnd* pParent = NULL); // standard constructor
>
> // Dialog Data
> //{{AFX_DATA(CMetalProp)
> enum { IDD = IDD_DMETALPROP };
> CString m_Name;
> double m_WorkFunction;
> //}}AFX_DATA
>
>
> // Overrides
> // ClassWizard generated virtual function overrides
> //{{AFX_VIRTUAL(CMetalProp)
> protected:
> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
> //}}AFX_VIRTUAL
>
> // Implementation
> protected:
>
> // Generated message map functions
> //{{AFX_MSG(CMetalProp)
> // NOTE: the ClassWizard will add member functions here
> //}}AFX_MSG
> DECLARE_MESSAGE_MAP()
> };
>
>
> Desde un gestor de eventos de la clase CView intento cambiar el caption
> antes de mostar el diálogo kon DoModal, y es ahí donde se genera el


error:
>
> void CDeviceView::OnMaterialsAnode()
> {
> CDeviceDoc *pdoc=GetDocument();
> CMetalProp cmp;
> CString str;
> cmp.SetWindowText(" Anode"); <-- ERROR: ASSERTION FAILURE
> cmp.m_Name=pdoc->m_Device.m_Anode.m_Name;
> cmp.m_WorkFunction=pdoc->m_Device.m_Anode.m_WorkFunction;
> cmp.DoModal();
> pdoc->m_Device.m_Anode.m_Name=cmp.m_Name;
> pdoc->m_Device.m_Anode.m_WorkFunction=cmp.m_WorkFunction;
>
> }
>
> Al parecer no rekonoce a cmp como CWnd, aunke deriva de CDialog, ke a su
vez
> deriva de CWnd.
> Alguna sugerencia?
>
> Gracias
>
> Demon.
>
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida