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 8564 18.10.2017, 23:10
Ostatni post: Ajgor
  Batch - odczytywanie temperatury karty graficznej i zapisywanie jej do zmiennej ~Anonim 4 8158 03.09.2017, 21:41
Ostatni post: ~Anonim
  Walidacja tekstu w CSV,XLS w PHP Profedbond 9 8281 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
  Wyszukiwarka w spawnerze nie reaguje na polskie znaki kazik666 0 7747 16.05.2018 12:04
Ostatni post: kazik666
  BASH symulator silnika dawswi1 3 8181 13.05.2018 10:43
Ostatni post: Szachista
  Autohotkey automatyczny zapis TheProgson 0 7801 07.05.2018 21:27
Ostatni post: TheProgson
  VBA Pobieranie wybranych plików z danymi julietta03 1 8031 04.05.2018 08:25
Ostatni post: broda99
  [VBA] Przenoszenie danych między formularzami Pioro 4 8440 23.04.2018 11:48
Ostatni post: broda99
  Skrypt, który szuka i zamienia armen10 2 8260 23.04.2018 10:04
Ostatni post: armen10
  Liniowa regresja w Pythonie a budowanie modelu Trojan3000 2 8384 16.04.2018 13:26
Ostatni post: Trojan3000
  Początki z bashem - jak napisać skrypty: wysłanie maila i kalkulator? Kristov81 4 12202 21.03.2018 18:32
Ostatni post: Szachista
Ściana Zadanie cmd.... Yanke$ 2 9371 16.03.2018 17:20
Ostatni post: FireBytes
  Poszukuj kogoś do pomocy FireBytes 0 8245 16.03.2018 16:58
Ostatni post: FireBytes
  Program liczący liczby pierwsze Mersenne'a raistin 2 8462 12.03.2018 12:51
Ostatni post: Szachista
  Wykres Funkcji w Javie wanhelsing 4 9314 17.02.2018 22:27
Ostatni post: wanhelsing
  [SQL]procedura zliczania czasu CTRL85 0 8546 17.02.2018 12:58
Ostatni post: CTRL85
  [VBA Excel] Zaokrąglanie liczby w górę Pioro 2 9777 13.02.2018 21:25
Ostatni post: Pioro
  Sumowanie czasu excel. Cixi 7 8761 13.02.2018 11:52
Ostatni post: Cixi