Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

WinAPI - odczytywanie tekstu z pola edycji

#1
WinAPI - odczytywanie tekstu z pola edycji
Witam!
Napisałem program, który tworzy okno, a w nim:
- pole edycji
- przycisk wymazujący tekst z pola edycji
- przycisk sprawdzający tekst w kontrolce

Co do dwóch pierwszych nie mam zastrzeżeń, ale funkcja sprawdzająca nie działa jak należy. Po naciśnięciu przycisku "Sprawdź tekst" powinien pojawić się MessageBox z tekstem z pola edycji. I rzeczywiście pojawia się, niestety bez tekstu. Zrobiłem również pewne doświadczenie: zmiennej do której miał być przypisywany tekst z pola edycji, przypisałem z góry tekst "hahaha". Po naciśnięciu przycisku pojawił się MessageBox z napisem "hahaha". Wniosek jest taki, że funkcja GetWindowText() nie pobiera tekstu z kontrolki.

Kod w załączniku.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#2
RE: WinAPI - odczytywanie tekstu z pola edycji
twoje lpEditText to tylko wskaźnik a nie łańcuch znaków

tak zadeklaruj go, a powinno byc ok:
char lpEditText[25];

LPSTR to tylko wskaźnik a nie tablica
LPSTR jest równoważne z char*
a LPCSTR z const char*
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#3
RE: WinAPI - odczytywanie tekstu z pola edycji
Dziękuję crayze. Jednak prosiłbym ciebie i innych użytkowników o wytłumaczenie. LPSTR oraz LPCSTR to wskaźniki do łańcucha znaków. Ale wskaźnik musi na coś wskazywać. Kiedy napiszę:
Kod:
LPSTR text = "ABC";
Utworzy się wskaźnik do łańcucha znaków "ABC", ale czy uworzenie wskaźnika jest równoznaczne z utworzeniem samego łańcucha? Dobrze to rozumiem?
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#4
RE: WinAPI - odczytywanie tekstu z pola edycji
Nie, tworząc wskaźnik rezerwujesz miejsce tylko dla samego wskaźnika(4 bajty w Win32) i tyle, tworząc łańcuch znaków rezerwujesz w pamięci miejsce dla wszystkich znaków w tym łańcuchu

LPSTR text = "ABC";

w C++ by to tak wyglądało:

char* text = "ABC";

LPSTR to to samo co char* w C++ tyle, że w WinAPI tak sobie to nazwali Wesoły

Próba kompilacji tego powinna zakończyć się błędem!!!

Boryspog napisał(a):Utworzy się wskaźnik do łańcucha znaków "ABC", ale czy uworzenie wskaźnika jest równoznaczne z utworzeniem samego łańcucha? Dobrze to rozumiem?

Nie wskaźnik to nie łańcuch, najpierw musisz stworzyć łańcuch jako tablicę znaków, np.

char Tekst[]="ABCDE";//łańcuch znaków, który będzie zajmował 6 bajtów(6 znaków)

jako że tekst to tablica, a całej tablicy nie da przekazać się w parametrze funkcji, przekazuje się wskaźnik na pierwszy element tablicy i ewentualnie podaje długość tej tablicy(łańcucha znaków), lub funkcja czyta wszystko do napotkania znaku \0

Dajmy na to funkcja SetWindowText(HWND,LPCSTR);
Pierwszy parametr to okno ono akurat się nic nie ma łańcuchów, ale drugi parametr to właśnie wskaźnik(const char* == LPCSTR) na pierwszy element tablicy znaków, przekazuje się tutaj wskaźnik bo nie da się przekazać całej tablicy i teraz funkcja ta będzie począwszy od tego pierwszego przekazanego znaku czytać wszystkie kolejne bajty(znaki) w pamięci, aż do napotkania znaku \0,

W C++ jest tak dobrze, że sama nazwa tablicy jest zawsze automatycznie wskaźnikiem na jej pierwszy element, dlatego tworząc tablicę, możemy w parametrze na wskaźnik podać jej nazwę:

char Tekst[]="ABC";
SetWindowText(hwnd, Tekst);//Nazwa tablicy jest wskaźnikiem ja jej pierwszy element

ale jak już byśmy chcieli przekazać funkcji wskaźnik na jakiś konkretny element tablicy to już musimy użyć operatora wyłuskania adresu &, np:

char Tekst[]="ABC";
SetWindowText(hwnd, &Tekst[2]);//Teraz Tekst[2] nie jest już wskaźnikiem tylko tym na co on wskazuje, dlatego, żeby mieć wskaźnikowy adres trzeba użyć operatora &

Tekst - to wskaźnik na pierwszy element tablicy(łańcucha znaków)
Tekst[0] - a to już wartość pierwszego elementu a nie wskaźnik
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#5
RE: WinAPI - odczytywanie tekstu z pola edycji
~Anonim napisał(a):Nie wskaźnik to nie łańcuch, najpierw musisz stworzyć łańcuch jako tablicę znaków
Ok, ale dajmy na przykład prosty program:
Kod:
#include <windows.h>

int WIAPI
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
            LPSTR lpCmdLine, int nShowCmd)
{
     LPSTR String = "ABC";

     MessageBox(NULL, String, "Info", MB_OK);

     return 0;
}
W wyniku tego prostego kodu pojawić się powinien MessageBox z tekstem "ABC". String jest wskaźnikiem do łańcucha znaków "ABC", ale skąd ten łańcuch się wziął? Zrozumiałbym gdyby było to na przykład:
Kod:
#include <iostream>

int main(void)
{
    char String[] = "ABC";
    char * Pointer = String;
        
        std::cout << Pointer << std::endl;

    return 0;
}
Tutaj widzę, że najpierw tworzona jest tablica, a potem wskaźnik, który wskazuje na pierwszy jej element. Ale nie rozumiem kodu:
Kod:
LPSTR String = "ABC"
OK, tworzę wskaźnik, ale gdzie jest tablica znaków, na którą wskazuje String, no gdzie?
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#6
RE: WinAPI - odczytywanie tekstu z pola edycji
Tworząc taki kod:
Kod:
char *tekst = "ABC"; //lub PSTR
w rzeczywistości kompilator alokuje tablicę na string, a wskaźnikowi tekst przekazuje adres zerowego elementu tablicy.
Może to wyglądać np. tak:
Kod:
const char ctab0001[4] = "ABC";   //tablica tworzona przez kompilator
char *tekst = ctab0001;   //tutaj dopiero jest ustawienie.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#7
RE: WinAPI - odczytywanie tekstu z pola edycji
Ha! Jednak nie ma to jak Swing w Javie. Wesoły getText() i masz tekst Język
 System operacyjny: windows_xp_2003 Przeglądarka: opera
#8
RE: WinAPI - odczytywanie tekstu z pola edycji
Tu nie chodzi o funkcje. Jest ona bardzo dobra tylko nie do końca rozumiem działania wskaźników typu LPSTR.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#9
RE: WinAPI - odczytywanie tekstu z pola edycji
Boryspog napisał(a):Tu nie chodzi o funkcje. Jest ona bardzo dobra tylko nie do końca rozumiem działania wskaźników typu LPSTR.

co tu można nie rozumieć, trzeci raz powtarzam że LPSTR to to samo co char*

jest to zrobione mniej więcej tak:
Kod:
typedef *char LPSTR

Boryspog napisał(a):OK, tworzę wskaźnik, ale gdzie jest tablica znaków, na którą wskazuje String, no gdzie?

Ale wcale nie musisz oddzielnie tworzyć wskaźnika, wskaźnikiem na pierwszy element dowolnej tablicy jest automatycznie nazwa tablicy!!

Wykorzystując twój przykład, wcale nie musisz oddzielnie robić wskaźnika, możesz wpisać nazwę tablicy

Kod:
#include <iostream>

int main(void)
{
    char String[] = "ABC";
        
        std::cout << String << std::endl;//nawa tablicy jest wskaźnikiem

    return 0;
}
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#10
RE: WinAPI - odczytywanie tekstu z pola edycji
No, dziękuję wszystkim za pomoc, a szczególnie crayze. Chyba udało mi się to wreszcie zrozumieć. Jeszcze raz dziękuję i pozdrawiam.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
Programy: Polecane / Nowe / Inne



Użytkownicy forum szukali:
LPSTR co toodczyt pola tekstowego winapiwskaźniki w winapi

Podobne wątki (WinAPI - odczytywanie tekstu z pola edycji)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Program C++ do pola i objętości mistrz18 2 8373 18.10.2017, 23:10
Ostatni post: Ajgor
  Batch - odczytywanie temperatury karty graficznej i zapisywanie jej do zmiennej ~Anonim 4 7990 03.09.2017, 21:41
Ostatni post: ~Anonim
  Walidacja tekstu w CSV,XLS w PHP Profedbond 9 8121 11.08.2017, 09:10
Ostatni post: insanebear

Skocz do:


Wybrane wątki (WinAPI - odczytywanie tekstu z pola edycji)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Visual Basic Excel l.całkowitą przedstawić w postaci szesnastkowej fugaz 4 571 18.06.2019 21:36
Ostatni post: fugaz
  Nauka do Olimpiady Informatycznej? piotr0905 1 967 08.06.2019 16:50
Ostatni post: wlisik
Ściana Prosta gra w Builder C++ Kiranek1 1 905 31.05.2019 15:20
Ostatni post: Szachista
  Menu (Nie widoczne długie opisy) wanhelsing 5 2258 28.04.2019 19:31
Ostatni post: koneton
  Skrypt usuwający pliki sylwiaa1 2 949 28.04.2019 15:20
Ostatni post: sylwiaa1
  Środowisko do assemblera Physicist 4 2010 21.04.2019 14:04
Ostatni post: Ajgor
  VBA excel dmjs 6 2022 17.04.2019 10:20
Ostatni post: ptrick
  C++ gbr 5 2602 25.03.2019 12:53
Ostatni post: koneton
  Klasa wewnętrzna w C++ Physicist 4 2596 23.03.2019 18:28
Ostatni post: Physicist
  Ruby on Rails - tutoriale luciussulla 0 2328 23.03.2019 16:49
Ostatni post: luciussulla
Big Grin Czy dostane sie technikum informatycznego klaudiusz20046 6 4335 21.03.2019 01:28
Ostatni post: UnableToSee
  [C#] Program do moderacji czatów gier wiktrom12 0 2788 07.03.2019 15:33
Ostatni post: wiktrom12
  Mój pierwszy projekt - Pomoc rafal12999 1 3279 07.02.2019 22:01
Ostatni post: Szachista
  pomoc projekt scilab piesel18 2 4165 04.02.2019 09:03
Ostatni post: piesel18
  Szkoła Informatyczna Zikinan 1 3580 02.02.2019 17:59
Ostatni post: wojownikhaha