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

winapi-pobieranie zmiennej z kontrolki edit za pomoca przycisku

Ostatnio zmodyfikowano 2023-05-12 17:50
Autor Wiadomość
inzynier1979
Temat założony przez niniejszego użytkownika
winapi-pobieranie zmiennej z kontrolki edit za pomoca przycisku
» 2023-05-01 17:49:38
czesc od nie dawna zaczalem uczyc sie winapi mam problem z pobraniem danych z kontrolki do messageboxa wiem ze wartosc zmiennej wyswietlanej ma byc char  
// Załóżmy, że mamy kontrolkę edit o identyfikatorze ID_EDITCHILD1
HWND hText = GetDlgItem(hwnd, ID_EDITCHILD1); // pobierz uchwyt kontrolki edit

// Musimy utworzyć bufor znakowy, w którym zapiszemy tekst z kontrolki edit
char bufor[256]; // wystarczy na 255 znaków i znak końca ciągu

// Musimy skopiować tekst z kontrolki edit do bufora za pomocą funkcji GetWindowText lub SendMessage
GetWindowText(hText, bufor, 256); // skopiuj tekst z kontrolki edit do bufora

// Teraz możemy wyświetlić bufor w messagebox
MessageBox(NULL, bufor, "Przykład", MB_OK);
wyswietlka puste okienko
kontrolka edit
HWND hText = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 50, 150, 20,
hwnd ,ID_EDITCHILD1, hInstance, NULL );
siedze nad tym juz jakis czas nie moge tego rozpracowac prosze popraw kod i wyjasnij mi jak malemu dziecku?:-)
P-180119
DejaVu
» 2023-05-01 19:34:34
Odpowiedź wygenerowana przez Chat GPT:
Cześć! Z chęcią Ci pomogę z rozwiązaniem problemu.

Pierwszy kod, który podałeś jest prawidłowy i służy do pobrania tekstu z kontrolki edit i wyświetlenia go w oknie messagebox.

Zwróć uwagę na to, że w pierwszej linii kodu używasz funkcji GetDlgItem, aby pobrać uchwyt do kontrolki edit o określonym identyfikatorze ID_EDITCHILD1. Funkcja ta wyszukuje kontrolkę dziecka o określonym identyfikatorze w oknie hwnd.

Następnie, tworzysz bufor znakowy bufor, który jest wystarczająco duży, aby pomieścić 255 znaków i znak końca ciągu. Używasz funkcji GetWindowText, aby skopiować tekst z kontrolki edit do bufora. Ta funkcja pobiera uchwyt do kontrolki edit, bufor, do którego ma zostać skopiowany tekst oraz maksymalną długość tekstu, który chcesz skopiować.

W końcu, używasz funkcji MessageBox, aby wyświetlić zawartość bufora w oknie dialogowym messagebox. Funkcja ta pobiera uchwyt do okna nadrzędnego (w tym przypadku jest to NULL, co oznacza, że okno messagebox będzie oknem głównym), tekst, który ma być wyświetlony w oknie messagebox, oraz parametry, które określają, jakie przyciski mają być wyświetlane w oknie dialogowym.

Drugi kod, który podałeś, tworzy kontrolkę edit i przypisuje jej identyfikator ID_EDITCHILD1. Wykorzystuje funkcję CreateWindowEx, która tworzy okno o określonym stylu i umieszcza je w oknie nadrzędnym hwnd. Funkcja ta zwraca uchwyt do nowo utworzonej kontrolki edit. Używasz tego uchwytu w pierwszym kodzie do pobrania tekstu z kontrolki edit za pomocą funkcji GetWindowText.

Jeśli nadal masz problemy z kodem, daj mi znać, jakie dokładnie problemy napotykasz, a postaram się pomóc.
P-180120
inzynier1979
Temat założony przez niniejszego użytkownika
» 2023-05-02 15:01:24
czesc prosze pomoc mam zamiar dodac dwie zmienne pobrane z kontrolek edit i wyswietic w messagebox oto kontrolki:
HWND hText = CreateWindowEx( WS_EX_CLIENTEDGE, _T( "EDIT" ), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 10, 150, 20, hwnd,( HMENU ) ID_EDIT, hInstance, NULL );
HWND g_hPrzycisk = CreateWindowEx( 0, _T( "BUTTON" ), _T( "Przycisk" ), WS_CHILD | WS_VISIBLE, 80, 80, 150, 30, hwnd,( HMENU ) ID_PRZYCISK, hInstance, NULL );
HWND hText1 = CreateWindowEx( WS_EX_CLIENTEDGE, _T( "EDIT" ), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 45, 45, 150, 20, hwnd,( HMENU ) ID_EDIT1, hInstance, NULL );

//kod
char buffer1[256], buffer2[256];
GetWindowText(hEdit1, buffer1, 256);
GetWindowText(hEdit2, buffer2, 256);
int num1 = std::stoi(buffer1);
int num2 = std::stoi(buffer2);
int sum = num1 + num2;
std::string sumString = std::to_string(sum);
MessageBox(NULL, sumString.c_str(), "Sum", MB_OK);
   kiedy uruchamiam kompiluje kiedy klikam na button zamyka sie okno i wyswietla
terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoi
wpisuje wartosci klikam by obbliczc dodawanie  znika okno zostaje okno dos z komukatem powtarzam
terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoi
proeze wytlumacz mi dlaczego tak sie dzieje co robie zle i wogole
P-180121
DejaVu
» 2023-05-02 15:05:48
Do takich prostych pytań polecam Ci używać Chat GPT. Będziesz dostawał odpowiedzi natychmiast. Może nie wszystkie odpowiedzi są poprawne, ale i tak możesz szybciej adresować swoje problemy.
W kodzie, który podałeś, wywołujesz funkcję GetWindowText() dla kontrolki edit, ale używasz identyfikatora hEdit1 i hEdit2, które nie zostały zadeklarowane w kodzie. Zamiast tego, należy użyć identyfikatorów hText i hText1, które zostały zdefiniowane podczas tworzenia kontrolek.

Ponadto, gdy konwertujesz zawartość kontrolki edit na liczbę za pomocą funkcji std::stoi(), musisz upewnić się, że zawartość kontrolki jest poprawną liczbą. Jeśli zawartość kontrolki nie jest poprawną liczbą, funkcja std::stoi() zwróci błąd std::invalid_argument.

Aby rozwiązać ten problem, możesz dodać obsługę błędów, aby upewnić się, że zawartość kontrolki edit jest poprawną liczbą. Możesz użyć funkcji std::stringstream, aby przeprowadzić konwersję z tekstu na liczbę i obsłużyć błędy. Poniżej znajduje się przykładowy kod, który pokazuje, jak to zrobić:

scss
C/C++
HWND hText = CreateWindowEx( WS_EX_CLIENTEDGE, _T( "EDIT" ), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 10, 150, 20, hwnd,( HMENU ) ID_EDIT, hInstance, NULL );
HWND g_hPrzycisk = CreateWindowEx( 0, _T( "BUTTON" ), _T( "Przycisk" ), WS_CHILD | WS_VISIBLE, 80, 80, 150, 30, hwnd,( HMENU ) ID_PRZYCISK, hInstance, NULL );
HWND hText1 = CreateWindowEx( WS_EX_CLIENTEDGE, _T( "EDIT" ), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 45, 45, 150, 20, hwnd,( HMENU ) ID_EDIT1, hInstance, NULL );

//kod
char buffer1[ 256 ], buffer2[ 256 ];
GetWindowText( hText, buffer1, 256 );
GetWindowText( hText1, buffer2, 256 );
int num1, num2;
std::stringstream ss1( buffer1 ), ss2( buffer2 );
if( ss1 >> num1 && ss2 >> num2 ) {
   
int sum = num1 + num2;
   
std::string sumString = std::to_string( sum );
   
MessageBox( NULL, sumString.c_str(), "Sum", MB_OK );
} else {
   
MessageBox( NULL, "Invalid input", "Error", MB_OK );
}
W tym kodzie, używamy std::stringstream, aby przekonwertować zawartość kontrolki edit na liczbę, a następnie sprawdzamy, czy konwersja przebiegła pomyślnie. Jeśli tak, obliczamy sumę i wyświetlamy ją w messageboxie. Jeśli konwersja się nie powiedzie, wyświetlamy messagebox z informacją o błędzie.
P-180122
inzynier1979
Temat założony przez niniejszego użytkownika
» 2023-05-02 15:25:22
dziekuje za odpowiedz poszukam tego bota podales kod:
char buffer1[ 256 ], buffer2[ 256 ];
GetWindowText( hText, buffer1, 256 );
GetWindowText( hText1, buffer2, 256 );
int num1, num2;
std::stringstream ss1( buffer1 ), ss2( buffer2 );
if( ss1 >> num1 && ss2 >> num2 ) {
    int sum = num1 + num2;
    std::string sumString = std::to_string( sum );
    MessageBox( NULL, sumString.c_str(), "Sum", MB_OK );
} else {
    MessageBox( NULL, "Invalid input", "Error", MB_OK );
}
wkleilem podczas kopilacji wywala niestey blad :
||=== Build: Debug in mal2 (compiler: GNU GCC Compiler) ===|
F:\codeblox\mal2\main.cpp||In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':|
F:\codeblox\mal2\main.cpp|71|warning: unused variable 'hText' [-Wunused-variable]|
F:\codeblox\mal2\main.cpp|72|warning: unused variable 'g_hPrzycisk' [-Wunused-variable]|
F:\codeblox\mal2\main.cpp|73|warning: unused variable 'hText1' [-Wunused-variable]|
F:\codeblox\mal2\main.cpp||In function 'LRESULT WindowProcedure(HWND, UINT, WPARAM, LPARAM)':|
F:\codeblox\mal2\main.cpp|103|error: variable 'std::stringstream ss1' has initializer but incomplete type|
F:\codeblox\mal2\main.cpp|103|error: variable 'std::stringstream ss2' has initializer but incomplete type|
||=== Build failed: 2 error(s), 3 warning(s) (0 minute(s), 4 second(s)) ===|
co z tym zrobimy?
P-180123
DejaVu
» 2023-05-02 15:27:16
C/C++
#include <sstream>

Niemniej jednak poszukaj sobie tego ChatGPT to Ci będzie odpowiadał na takie pytania.
P-180124
inzynier1979
Temat założony przez niniejszego użytkownika
» 2023-05-02 15:39:00
dziekuje nie moge zarejestrowac sie na stronie tego bota
dzieki za kod wkleilem go tak mysallem ze bedzie do wpisania biblioteka
kiedy wpisuje i klikam buttona
wyswietla MessageBox( NULL, "Invalid input", "Error", MB_OK ); prosze pomoz
P-180125
inzynier1979
Temat założony przez niniejszego użytkownika
» 2023-05-03 22:32:37
czesc moi drodzy licze na wasza pomoc
oto kod:case ID_MYBUTTON:
            HWND hText = GetDlgItem(hwnd, IDC_EDIT1); // hwnd to uchwyt okna, IDC_EDIT1 to identyfikator kontrolki
HWND hText1 = GetDlgItem(hwnd, IDC_EDIT2); // hwnd to uchwyt okna, IDC_EDIT2 to identyfikator kontrolki
char buffer1[256];
char buffer2[256];
GetWindowText(hText, buffer1, 256);
GetWindowText(hText1, buffer2, 256);

// konwersja tekstu na liczbê
int liczba1 = atof(buffer1);
int liczba2 = atof(buffer2);

// dodawanie liczb
int suma = liczba1 / liczba2*liczba2 ;

// wyœwietlanie wyniku w MessageBox
char wynik[256];
sprintf_s(wynik, "Wynik: %d", suma);
MessageBox(hwnd, wynik, "Wynik", MB_OK);
kiedy wpisuje dzialanie int suma = liczba1 / liczba2*liczba2 ; to zle dokonuje obiczen jak wpisuje w kontrolce idit1 i wpisuje kolejna liczbe w edit 2 klikam na buttona zamiast wyniku pojawia sie wartosc wpisana w edit 1
P-180129
« 1 » 2
  Strona 1 z 2 Następna strona