Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinApi C++] Błąd z pamięcią podczas zamykania okna potomnego

Ostatnio zmodyfikowano 2015-03-16 20:59
Autor Wiadomość
OverMorda
Temat założony przez niniejszego użytkownika
[WinApi C++] Błąd z pamięcią podczas zamykania okna potomnego
» 2015-03-06 17:06:18
Witam.
Stworzyłem okno potomne z polami tekstowymi i przyciskiem.
Chcę aby po naciśnięciu przycisku okno się wyłączało i dane z pól tekst. zapisywało do zmiennych.
Zapisywanie działa dopóki jest wypełnione co najmniej jedno pole. Gdy nie wypełnię nic tylko od razu zapisuję pojawia się błąd:

App.exe has triggered a breakpoint.

C/C++
while( GetMessage( & msg1, NULL, 0, 0 ) )
{
    TranslateMessage( & msg1 );
    DispatchMessage( & msg1 ); // <- tutaj błąd: ((msg1).hwnd)->unused | <Unable to read memory>
}
EnableWindow( window_main, TRUE );
return msg1.wParam;

Jak można to naprawić aby po zostawieniu pustych pól nie wywalało tego błędu?

C/C++
LRESULT CALLBACK WndProc( HWND window_main, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CLOSE:
        DestroyWindow( window_main );
        if( new_Window != NULL ) DestroyWindow( new_Window );
       
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
    case WM_COMMAND:
        {
            switch( wParam ) {
               
            case Add_something:
                {
                    HWND hText7;
                    new_Window = CreateWindowEx( WS_EX_CLIENTEDGE, ClassName, "New Window", WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 550, 230, window_main, NULL, hInstance, NULL );
                    hText1 = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 100, 20, 90, 20, new_Window,( HMENU ) ID_TEXT_ADD_RESOURCES_1, hInstance, NULL );
                    hText2 = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 350, 20, 90, 20, new_Window,( HMENU ) ID_TEXT_ADD_RESOURCES_2, hInstance, NULL );
                    hText3 = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 100, 60, 90, 20, new_Window,( HMENU ) ID_TEXT_ADD_RESOURCES_3, hInstance, NULL );
                    hText4 = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 350, 60, 90, 20, new_Window,( HMENU ) ID_TEXT_ADD_RESOURCES_4, hInstance, NULL );
                    hText5 = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 100, 100, 90, 20, new_Window,( HMENU ) ID_TEXT_ADD_RESOURCES_5, hInstance, NULL );
                    hText6 = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 350, 100, 90, 20, new_Window,( HMENU ) ID_TEXT_ADD_RESOURCES_6, hInstance, NULL );
                    hText7 = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY, 30, 20, 60, 20, new_Window, NULL, hInstance, NULL );
                    hButton = CreateWindowEx( 0, "BUTTON", "Zapisz", WS_CHILD | WS_VISIBLE | WS_BORDER, 230, 140, 80, 20, new_Window,( HMENU ) ID_BUTTON_ADD_RESOURCES, hInstance, NULL );
                   
                    SetWindowText( hText7, "Option 1" );
                   
                    EnableWindow( window_main, FALSE );
                    while( GetMessage( & msg1, NULL, 0, 0 ) )
                    {
                        TranslateMessage( & msg1 );
                        DispatchMessage( & msg1 );
                    }
                    EnableWindow( window_main, TRUE );
                    return msg1.wParam;
                   
                } break;
               
            case Print:
                {
                }
               
            case ID_BUTTON_ADD_RESOURCES:
                {
                    string temp;
                    DWORD dlugosc;
                    LPSTR Bufor;
                    bool Check_Bufor, Check_Status = TRUE;
                    int value;
                   
                    dlugosc = GetWindowTextLength( hText1 );
                    if( dlugosc > 0 ) {
                        Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                        GetWindowText( hText1, Bufor, dlugosc + 1 );
                        Check_Bufor = Check( Bufor );
                        if( Check_Bufor == true ) {
                            value = boost::lexical_cast < int >( Bufor );
                            temp_class->a = value;
                        }
                        else {
                            Check_Status = FALSE;
                        }
                    };
                   
                    dlugosc = GetWindowTextLength( hText2 );
                    if( dlugosc > 0 ) {
                        Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                        GetWindowText( hText2, Bufor, dlugosc + 1 );
                        Check_Bufor = Check( Bufor );
                        if( Check_Bufor == true ) {
                            value = boost::lexical_cast < int >( Bufor );
                            temp_class->b = value;
                        }
                        else {
                            Check_Status = FALSE;
                        }
                    };
                   
                    dlugosc = GetWindowTextLength( hText3 );
                    if( dlugosc > 0 ) {
                        Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                        GetWindowText( hText3, Bufor, dlugosc + 1 );
                        Check_Bufor = Check( Bufor );
                        if( Check_Bufor == true ) {
                            value = boost::lexical_cast < int >( Bufor );
                            temp_class->c = value;
                        }
                        else {
                            Check_Status = FALSE;
                        }
                    };
                   
                    dlugosc = GetWindowTextLength( hText4 );
                    if( dlugosc > 0 ) {
                        Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                        GetWindowText( hText4, Bufor, dlugosc + 1 );
                        Check_Bufor = Check( Bufor );
                        if( Check_Bufor == true ) {
                            value = boost::lexical_cast < int >( Bufor );
                            temp_class->d = value;
                        }
                        else {
                            Check_Status = FALSE;
                        }
                    };
                   
                    dlugosc = GetWindowTextLength( hText5 );
                    if( dlugosc > 0 ) {
                        Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                        GetWindowText( hText5, Bufor, dlugosc + 1 );
                        Check_Bufor = Check( Bufor );
                        if( Check_Bufor == true ) {
                            value = boost::lexical_cast < int >( Bufor );
                            temp_class->e = value;
                        }
                        else {
                            Check_Status = FALSE;
                        }
                    };
                   
                    dlugosc = GetWindowTextLength( hText6 );
                    if( dlugosc > 0 ) {
                        Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                        GetWindowText( hText6, Bufor, dlugosc + 1 );
                        Check_Bufor = Check( Bufor );
                        if( Check_Bufor == true ) {
                            value = boost::lexical_cast < int >( Bufor );
                            temp_class->f = value;
                        }
                        else {
                            Check_Status = FALSE;
                        }
                    };
                   
                    if( Check_Status == TRUE ) {
                        GlobalFree( Bufor );
                        EnableWindow( window_main, TRUE );
                        DestroyWindow( new_Window );
                    }
                    else if( Check_Status == FALSE ) {
                        MessageBox( new_Window, "Błąd przy wpisywaniu. \nMożna wpisywać tylko cyfry.", "ERROR", MB_OK | MB_ICONWARNING );
                    };
                } break;
            }
        } break;
       
        default:
        return DefWindowProc( window_main, msg, wParam, lParam );
    }
   
    return 0;
}
P-127821
Brunon3
» 2015-03-06 17:11:29
Nigdy nie programowałem w WinAPI, i szczerze mówiąc nawet nie zerknąłem na kod, ale czy nie możesz zrobić czegoś takiego:

C/C++
if( pole.tekst != "" )
     pole.przycisk.aktywny = true;
else
     pole.przycisk.aktywny = false;

?

PS. Nie musisz dawać w nazwie "C++", bo to forum o C++. ;)
P-127822
pekfos
» 2015-03-16 20:59:49
Co robi pętla obsługi komunikatów wewnątrz obsługi komunikatu? Poza tym, odczytywanie danych z kontrolek błaga o opakowanie w funkcje. Zrób porządek w kodzie - łatwiej będzie znaleźć błąd, o ile już samo sprzątanie nie naprowadzi cię na rozwiązanie.
P-128587
« 1 »
  Strona 1 z 1