PDAclub.pl - Forum użytkowników technologii mobilnych
Windows Mobile (Classic, Professional, Standard), Windows Phone 6.x oraz 7/8.x/10 => Oprogramowanie PPC => Dla programistów => Wątek zaczęty przez: lemkat w Wrzesień 23, 2005, 22:58:54
-
Witam
Nie wiem czemu ale kod ktory dzialal wlasnie przestal:
Powoluje do zycia DialogBox z menu:
DialogBox( hInst , (LPCTSTR)IDD_ADD_PART, hWnd , (DLGPROC)AddPartProc );
w jej funkcji zwrotnej po wcisnieciu klawiszu OK chce odczytac tekst z kontrolki Edit Box:
LRESULT CALLBACK AddPartProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
// ....
case WM_INITDIALOG:
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN;
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
return TRUE;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch( wmId )
{
case BID_ADD_PART:
// symbol czesci
iCount = GetDlgItemText( hDlg , EID_PART , pBuffer , 10 );
if( iCount == 0 )
{
iCount = GetLastError();
}
i tu jest problem "hDlg" jest uchwytem DialogBox mimo to w momencie wywolania funkcji odczytu tekstu mam kod 1440 ( invalid handle ), gdzie moze byc blad ???
Jakkolwiek bym nie probowal nie moge uzyskac uchwyt tego onkna:
FindWindow etc...
Jeszcze jedna dosc istotna rzecz:
w msdn znalazlem ze funkcja jest zdeklarowana w Afxwin.h dopuki jej nie podlacze progs sie kompiluje i wszystko jest ok, jak ja podlacze progs mi sie wywala:
D:\programowanie\WindowsCE\SerwisCzesci\SerwisCzesci.cpp(303) : error C2065: 'GetDlgItemText' : undeclared identifier
musi sie grysc z jakas inna biblioteka ;/
-
Nieee, afxwin.h to akurat nagłówek z biblioteki MFC, nie dołączaj go do swojego projektu, skoro działasz w czystym Win32 (korzystając "po cichu" z winuser.h).
Dziwna sytuacja z tym uchwytem.
Sprawdź czy w momencie tworzenia dialogu uchwyt okna jest taki sam jak otrzymywany przez jego procedurę.
-
Witam
Zadeklarowalem globalna zmienna HWND hAdd;
w momencie tworzenia okna robie tak:
case WM_INITDIALOG:
...
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
hAdd = hDlg;
return TRUE;
// ...
// i potem sprawdzenie czy uchwyt jest ten sam
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(lParam);
switch( wmId )
{
case BID_ADD_PART:
// symbol czesci
if( hAdd == hDlg )
{
MessageBox( NULL , TEXT("Ten sam") , TEXT("Ok") , MB_OK );
}
i wyglada na to ze uchwyt jest ten sam ;(
-
A co będzie jeśli zamiast
(LPCTSTR)IDD_ADD_PART
zrobisz MAKEINTRESOURCE(IDD_ADD_PART)
Jest to już nieco desperacka poprawka, bo raczej nic nie wniesie, no ale... ;)
Może ewentualnie wyzeruj zawartość SHINITDLGINFO przed ustawianiem jego parametrów? To też tak na wszelki wypadek, bo chyba zazwyczaj nie trzeba tego robić.
-
niestety nic nie wnosi do sprawy, co najsmieszniejsze ten kod wczesniej dzialal, czy moze to miec cos wspolnego z ustawieniami dialog box ????
(typ, wyglad etc...)
[Dodano: 2005-09-24 13:50:06]
wiec zapytam tak ;( czy jest jakis inny sposob uzyskania tekstu z kontrolki Edit Box ( ciezko sie przyzwyczaic do tego vc , ech )
-
Póki EID_PART nadal istnieje, nie powinno być problemu.
A pBuffer gdzie trzymasz i w jakiej postaci?
Wyciągnąć tekstu raczej inaczej się nie da, metoda z której korzystasz po prostu MUSI działać.
Jest to na pewno kontrolka tekstowa? Na pewno widoczna? Aktywna?
-
Deklaracja bufora na text z kontrolki:
LPTSTR pBuffer;
Kontrolka to Edit Box
Jest aktywna skoro do niej wpisuje tekst ;/
Jeszcze jedno, w kursie ( jakims tam ) wyczytalem ze mozna dodac do kontrolki zmienne ( variables ) postepuje jak pisze czyli na formie prawym daje class wizard i tam chce dla mojej kontrolki dodac zmienna ale vc sie burzy ze nie ma okreslonego typu zmiennej dla tej kontrolki:
"there is no data types for this kind of control"
Chyba miales racje z ta nauka programowania w vc po bcb, praktycznie od zera ;/
-
pBuffer może zmień na TCHAR?
Niestety tak jest w przypadku czystego Win32 - zaczynasz od zera, masa do nauczenia się. Nawet gdybyś chciał sobie to ułatwić WTLem (a polecam), to i tak musisz wiedzieć jak to wszystko działa.
Borlandowski VCL rzeczywiście został dość ładnie zrobiony i zorganizowany, dlatego też pewnie główny projektant tej biblioteki trafił do Microsoftu by stworzyć C# i inne dopiero nadchodzące nowości. ;)
-
Problem rozwiazany, nie wiem czemu walil invalid handle ale problem polegal na buforze przechwytujacym dane:
tak nie dziala:
LPTSTR pBuffor;
GetDlgItemText( hDlg ,IDC_ADD_SYMBOL, pBuffor, 10 );
a tak wszystko jest ok:
TCHAR Buffor[ 12 ]
GetDlgItemText( hDlg ,IDC_ADD_SYMBOL, (LPTSTR)Buffor, 10 );
cos sie musialo walic w pamieci bo ze dwa razy pierwszy sposob dzialal
Pozdrawiam
-
A widzisz, sugerowałem to już :P
pBuffer może zmień na TCHAR?
-
błąd był nie w typie, ale w braku alokacji pamięci (przypadek, że wcześniej tamten kod działał, bo prawdopodobnie losowa wartość wskaźnika po deklaracji wzkazywała na "mało istotne dane", które były w tym przypadku nadpisywane)...
LPTSTR == TCHAR *
-
Fakt, zbyt oczywiste to było, by wskaźnik kierował na jakąś zaalokowaną pamięć. B)