none
Problemas con SetDlgItemText APi Windows RRS feed

  • Pregunta

  • Hola a todos:

    Estoy haciendo un programa en C con la API de Windows 32, es un mantenimiento de fichero que puede funcionar de dos formas distintas, una de ellas se basa en enviarle un nombre para darlo de alta en el fichero.

    Es en ese caso cuando tengo problemas.

    La función debe de presentarme un código nuevo, y el nombre que ha entrado en la función.  Pero en la realidad solo me presenta el código correctamente.  El nombre se queda en blanco.

    Para comprobar los datos, puse un MessageBox que me imprimiera los datos, y los datos me los representa correctamente, tanto el código como el Nombre.

    Lo más curioso, es que tras cerrar el MessageBox, entonces en los Edit de la ventana, el código aparece a 0, y entonces si que me imprime el nombre.

    Me siento como un programador novato, frustrado.  Yo puedo haber cometido algún error, pero que por un MessageBox, el programa cambie el resultado me desconcierta plenamente.  

    ¿Alguna idea porfa?

    Cabecera de la función

    LRESULT FormMoneda( HINSTANCE LhndInstancia ,
    HWND LhndPadre ,
    int LintCodMon ,
    char        *LcharNomMon ) {

    ...

    /* Hacer visible la ventana */
    ShowWindow( MManMon , SW_SHOWDEFAULT );

    if ( LcharNomMon != NULL ) {
    //--------------------------------------------
    //  Entra un nombre de Moneda para dar de alta
    //--------------------------------------------

    int LMon = FMonDameNuevo();
    if ( LMon != MnumCero ) {

    Este es el proceso que no funciona adecuadamente

      Moneda.MCodigo = LMon;
    PMonIniciaDatos( false );
    lstrcpy( Moneda.MNueNombre , (const char *) LcharNomMon );
    // wsprintf( MszMensaje , "%d  %-30s" , Moneda.MCodigo , Moneda.MNueNombre );
    // MessageBox( MManMon , MszMensaje , "Nombre Entrante" , 0 );
            SetDlgItemInt( MManMon , ID_CODMON , Moneda.MCodigo , false );
    SetDlgItemText( MManMon , ID_NOMMON , Moneda.MNueNombre );
    SetDlgItemText( MManMon , ID_ABRMON , Moneda.MNueAbrevi );
    MMonNue = true; // Nuevo registro S/N
    MMonEdi = 1;   // Número de campos modificados
    MMonNomMod = true; // Nombre Modificado S/N
    MMonSalYa = true; // Salir tras inserción
    SetFocus( MhEdAbMo );
    ENDIF
    } else {
    //----------------------------------------------
    //  Inicialización de las variables de Monedas
    //----------------------------------------------

    PMonVaciaDatos( true );
    if ( int x = FMonBuscarUltimo() == 0 ) {
    PMonRellenaDatos();
    } else {
    if ( x == 2 ) {
    PMonVaciaDatos( true );
    } else {
    PvoidMensaErr( MszMensaje );
    PostQuitMessage( 0 );
    ENDIF
    ENDIF
    ENDIF

    ...

    Esta funcióm siguiente se llama después de haber cambiado de registro activo y muestra los datos del registro en pantalla,  funciona adecuadamente siempre.

    void PMonRellenaDatos() {
    //-------------------------------------------
    //  Rellenar los edit con los datos leídos
    //-------------------------------------------

        Moneda.MCodigo = sqlite3_column_int( MpSQL , MnumCero );
        lstrcpy( Moneda.MOriNombre , (const char *) sqlite3_column_text( MpSQL , 1 ) );
        lstrcpy( Moneda.MNueNombre , (const char *) sqlite3_column_text( MpSQL , 1 ) );
        lstrcpy( Moneda.MOriAbrevi , (const char *) sqlite3_column_text( MpSQL , 2 ) );
        lstrcpy( Moneda.MNueAbrevi , (const char *) sqlite3_column_text( MpSQL , 2 ) );
        sqlite3_finalize( MpSQL );
        SetDlgItemInt( MManMon , ID_CODMON , Moneda.MCodigo , false );
        SetDlgItemText( MManMon , ID_NOMMON , Moneda.MNueNombre );
        SetDlgItemText( MManMon , ID_ABRMON , Moneda.MNueAbrevi );
        MMonEdi = MnumCero;
        MMonNomMod = false; // Nombre Modificado S/N
        MMonAbrMod = false; // Abreviatura Modificada S/N

    ENDFUNC

    martes, 29 de septiembre de 2020 20:19

Respuestas

  • Hola:

    Respondo para que no queden dudas sobre el funcionamiento de las funciones de Windows.

    No existe nada incorrecto en las funciones mencionadas, mi problema era que antes de mostrar la página usaba el setfocus para activar el campo de código, y cuando el parámetro de entrada no era NULL, entonces inicializaba los datos con esa información y hacia un setfocus a otro campo, con ello, se ejecutaba el killfocus del codigo, donde se borraban los datos,

    Existía una diferencia de comportamiento al poner un MessageBox, y eso era provocado por que el killfocus del código se ejecutaba con anterioridad.

    Todo el funcionamiento del programa es lógico y normal, lo único mal en ello es la inutilidad de este programador novato en Windows.

    Saludos y perdonad las molestias.

    Me ha costado horrores encontrar el motivo, más de 2 meses.

    • Marcado como respuesta Daniel deDios domingo, 15 de noviembre de 2020 20:13
    domingo, 15 de noviembre de 2020 20:12