Handlery w BCB przekazują funkcjom obsługującym wskaźnik Sender typu TObject. Ten wskaźnik mówi funkcji obsługującej która kontrolka VCL wygenerowała zdarzenie. Jednakże wskaźnika tego nie możesz traktować jako przycisku czy też pozycji menu (na przykład). Żeby uzyskać użyteczną informację z argumentu Sender, będziesz musiał użyć rzutowania. Poniższy kod używa nowego, bezpiecznego typu rzutowania dynamic_cast, w celu konwersji Sender na konkretny obiekt VCL. void __fastcall TForm1::Button2Click(TObject *Sender) { TButton *btn = dynamic_cast< TButton * >(Sender); if(!btn) return; btn->Caption = "nowy napis"; }dynamic_cast zwraca NULL, jeżeli Sender nie jest ważnym przypadkiem klasy. W kodzie powyżej dynamic_cast zwraca NULL, gdy Sender nie jest przyciskiem. Funkcja sprawdza za pomocą if, czy dynamic_cast zakończyło się niepowodzeniem. Uwaga: Czasem możesz się obejść bez rzutowania, ale tylko wtedy, gdy potrzebujesz jedynie zidentyfikować "sprawcę" komunikatu. Poniższy kod pokazuje o co mi chodzi: void __fastcall TForm1::Button2Click(TObject *Sender) { // sprawdza czy Sender to ten sam wskaźnik co Button1 // jeśli tak, to zmienia napis if(Button1 == Sender) Button1->Caption = "nowy napis"; } |