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 8064 18.10.2017, 23:10
Ostatni post: Ajgor
  Batch - odczytywanie temperatury karty graficznej i zapisywanie jej do zmiennej ~Anonim 4 7747 03.09.2017, 21:41
Ostatni post: ~Anonim
  Walidacja tekstu w CSV,XLS w PHP Profedbond 9 7869 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
  Transfer plików via FTP Visual Basic FireBytes 1 2720 17.11.2018 21:07
Ostatni post: Szachista
  Jaki kod pod pewne zdarzenia visualbasic 2010 aktywny27 4 4664 07.11.2018 13:41
Ostatni post: Ajgor
Scared Ipad Pro programowanie? NissmoOne 4 5463 06.10.2018 12:22
Ostatni post: NissmoOne
  C# pierwsza pusta komórka Excel DonCorleone 0 5243 21.09.2018 16:58
Ostatni post: DonCorleone
  .bat nie kompresuje plików GIENTY 3 5639 06.09.2018 07:20
Ostatni post: broda99
  problem z programem .bat wiktrom12 4 6633 30.08.2018 08:25
Ostatni post: wiktrom12
  Silnik do gier ZigglerGames 1 5620 23.08.2018 09:03
Ostatni post: Szachista
  Chciałbym zrobić prosty plik exe z jedną funkcją densour 4 6294 09.08.2018 16:24
Ostatni post: Ajgor
  Który język wybrać do stworzenia aplikacji synchronizujące pliki z urządzeniem mobiln Elemental 2 2193 18.07.2018 12:05
Ostatni post: Ajgor
  Pomysł napisania programu ROM FireBytes 3 6988 28.06.2018 16:56
Ostatni post: FireBytes
  [VBA] Tworzenie nowego arkusza z danymi z TextBox'a Pioro 4 7071 19.06.2018 23:24
Ostatni post: broda99
  Potwierdzenie na maila po wysłaniu pliku coci 0 6399 13.06.2018 20:37
Ostatni post: coci
  Pieczętowanie Archiwum Jar - Po co? wanhelsing 3 7028 19.05.2018 20:55
Ostatni post: koneton
  Wyszukiwarka w spawnerze nie reaguje na polskie znaki kazik666 0 6783 16.05.2018 12:04
Ostatni post: kazik666
  BASH symulator silnika dawswi1 3 7221 13.05.2018 10:43
Ostatni post: Szachista