es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Clase derivada del CEdit para la validación de valores si se utiliza DDX_Text.

Tengo mi propia clase (CMyEdit) heredada de CEdit con un procedimiento de validación propio.

Engancho los eventos ON_CHAR y ON_UPDATE y valido la entrada del usuario.

Si la entrada es válida, se cambia el atributo CMyEdit::isOk a true. CMyEdit confirma la validez durante cada cambio del contenido del cuadro de edición.

El diálogo podría confirmar la validez utilizando CMyEdit::isOk.

He anulado el método CEdit::SetWindowText()

inline void CMyEdit::SetWindowText(LPCTSTR lsText)
{
    CEdit::SetWindowText(lsText);
    Validate(); //se establece isOk como verdadero o falso
}

Pero si el diálogo utiliza DDX_Text, no se está ejecutando ningún método (ni EN_CHANGE, ni SetWindowText).

El mismo problema ocurre cuando el usuario pega un valor desde el portapapeles (WM_PASTE).

¿Cómo puedo enganchar este cambio del contenido del cuadro de edición?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para enganchar los cambios realizados en el contenido de EditBox usando DDX_Text, puedes sobrescribir la función DDX_Text en tu clase CMyEdit. Esto te permitirá validar la entrada del usuario y establecer el atributo CMyEdit::isOk en consecuencia.

    Aquí tienes un ejemplo de cómo puedes sobrescribir la función DDX_Text en tu clase CMyEdit:

    void CMyEdit::DDX_Text(CDataExchange* pDX, int nIDC, CString& value)
    {
        if (pDX->m_bSaveAndValidate)
        {
            // Validar la entrada del usuario y establecer isOk en consecuencia
            Validate();
        }
    
        // Llamar a la implementación de la clase base de DDX_Text
        CEdit::DDX_Text(pDX, nIDC, value);
    }
    

    Al sobrescribir la función DDX_Text, puedes asegurarte de que tu procedimiento de validación se llame cada vez que el cuadro de diálogo actualice el texto en tu control CMyEdit utilizando DDX_Text.

    De manera similar, para enganchar los cambios realizados en el contenido de EditBox utilizando el mensaje WM_PASTE, puedes sobrescribir la función OnPaste en tu clase CMyEdit. Esta función se llamará cada vez que el usuario pegue texto en tu EditBox.

    Aquí tienes un ejemplo de cómo puedes sobrescribir la función OnPaste en tu clase CMyEdit:

    void CMyEdit::OnPaste()
    {
        // Llamar a la implementación de la clase base de OnPaste
        CEdit::OnPaste();
    
        // Validar la entrada del usuario y establecer isOk en consecuencia
        Validate();
    }
    

    Al sobrescribir la función OnPaste, puedes asegurarte de que tu procedimiento de validación se llame cada vez que el usuario pegue texto en tu control CMyEdit.

Comments are closed.