[C++ Builder] - Wskaźnik do SYSTEMTIME

0

Witam.
Chce za pomocą funkcji SendMessage otrzymać wartości(zakresy dat) zaznaczone przez użytkownika w komponencie MonthCalendar1. I mam taki kod:

void __fastcall TForm2::Button5Click(TObject *Sender)
{
   SYSTEMTIME st;
   HWND hwnd;
   hwnd = FindWindow (0, "Form2");
   int lResult = SendMessage(hwnd, MCM_GETSELRANGE, 0, &st );
   Edit2->Text= lResult;
}  

Czyli-> SendMessage wysyła do "hwnd" MCM_GETSELRANGE która zwraca nam potrzebne wartości. Parametr lParam musi być równy 0, natomiast wParam to wskaźnik do SYSTEMTIME. I tu jest jakiś problem bo pokazuje takie błędy:

E2034 Cannot convert '_SYSTEMTIME *' to 'long'
E2342 Type mismatch in parameter 'lParam' (wanted 'long', got '_SYSTEMTIME *')

Problem pewnie będzie również z uchwytem, ale najpierw musze dojść co z tym SYSTEMTIME jest źle.

Będe wdzięczny za wszelką pomoc.

0

SendMessage ma typ parametrow silnie zalezny od numeru wiadomosci jaki wysylasz. WM_PAINT bedzie wymagalo innych lParam i wParam inne niz WM_CLICK, i inne niż Twoj MCM_GETSELRANGE. Nie dosc ze wartosci lParam i wParam sie roznia, to ich typy rowniez!

A ze funkcja jest jak świat stara i z zalozenia ma sie ja dac wywolac i z C i z C++, wiec typy parametrow zostaly ustalone tak, aby bylo mozliwie najogolniejsze i "najszersze". Stad, lParam i wParam sa oznaczone w jej nalowku jako liczby. Dokladniej mowiac, ich typy to chyba LPARAM i WPARAM, ale one sa typedef'ami na DWORD czyli ... long.

Jak pewnie wiesz, kazdy realny wskaznik ma szerokosc 4B (32bit), czyli dokladnie tyle samo co wlasnie long -- czyli tyle, co 32bitowa 'szyna danych'. Stad taki wybor na lParam i wParam -- wszystko co wazne da sie w nich zmiescic.

A tutaj? Wystarczy uzyc twardego rzutowania. Wiesz co robisz, dokumentacja mowi ze masz podac pointer, wiec podajesz pointer. Pointer sie miesci w longu, wiec funkcja dostanie pointer, mimo ze pod postacia typu liczbowego long.

SendMessage(hwnd, MCM_GETSELRANGE, 0, /*TU-->*/(long)/*<--TU*/ &st );
0

He, he, podstawy podstaw się kłaniają, no ale od czegoś trzeba zacząć.
Ile czasu mi to zajęło to nie powiem, ale kodzik jest, tak jak by ktoś potrzebował na przyszłość:

void __fastcall TForm2::Button5Click(TObject *Sender)
{
  SYSTEMTIME st[2] ;
  HWND hwnd, hwnd1;
  hwnd = FindWindow (0, "Form2");
  hwnd1 = FindWindowEx(hwnd, NULL, ("TMonthCalendar") ,NULL);
  LRESULT lResult = SendMessage(hwnd1,MCM_GETSELRANGE,NULL,(long)&st);
		Edit2->Text= (int)(&st[0])->wDay;
		Edit1->Text= (int)(&st[1])->wDay;
}

W st[0] dostajemy wartości najmniejsze z zaznaczonych, a w st[1] maksymalne. Piszę "wartości" bo to mogą być tak jak w tym przypadku dni(wDay) lub miesiące(wMonth), lub lata(wYear). Oczywiście można to wsadzić wszystko do stringa i mamy ładny format zaznaczonej daty. Jak zaznaczymy jeden dzień to w obu komórkach st mamy te same wartości.

Wielkie dzięki za pomoc!!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1