CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Nakrywanie zdarzeń w komponencie

Nakrywanie zdarzeń w komponencie

problemy z funkcjonowaniem bibliotek, komponentów itp.

Nakrywanie zdarzeń w komponencie

Nowy postprzez lidamian » niedziela, 14 sierpnia 2011, 04:35

Hej,

Mój problem polega na tym, że nie mogę przechwycić zdarzenia. Opiszę w skrócie:

Mam własny komponent:


KOD cpp:     UKRYJ  
typedef void __fastcall (__closure *TMsgEvent) (TObject* Sender, TMessage *Msg);
//
class PACKAGE TKontrolka_OK : public TComponent
{
private:
    TMsgEvent CallBack_Message;

__published:
    __property TMsgEvent OnMessage = {read = CallBack_Message, write = CallBack_Message};
};
 


Kiedy nachodzi potrzeba wywołuję to zdarzenie:
KOD cpp:     UKRYJ  
if(OnMessage) OnMessage(this, &Msg);
 

Ogólnie wszystko gra, więc postanowiłem, że napiszę inny komponent który dziedziczy po TKontrolka_OK (powyższej):

KOD cpp:     UKRYJ  
class PACKAGE TLipa : public TKontrolka_OK
{
protected:
    DYNAMIC void __fastcall Message(TObject *Sender, TMessage *Msg);
};
//
void __fastcall TLipa::Message(TObject *Sender, TMessage *Msg)
{
    ShowMessage("Wywołano najpierw zdarzenie z kontrolki TLipa ");
    TKontrolka_OK::OnMessage(this, Msg); // A potem TKontrolka_OK
}
 


Problem w tym, że TLipa::Message nigdy nie jest wywoływane.

Jak wywołać najpierw zdarzenie w TLipa a potem w TKontrolka_OK ?
Avatar użytkownika
lidamian
Bladawiec
Bladawiec
 
Posty: 29
Dołączył(a): piątek, 19 września 2008, 15:25
Podziękował : 4
Otrzymał podziękowań: 0
    Windows 7Chrome

Re: Nakrywanie zdarzeń w komponencie

Nowy postprzez Cyfrowy Baron » niedziela, 14 sierpnia 2011, 08:14

Spróbuj stworzyć zdarzenie OnMessage w komponencie TKontrolka_OK w ten sposób:

w pliku nagłówkowym:
KOD cpp:     UKRYJ  
private:
        Forms::TMessageEvent FOnMessage;
        void __fastcall SetOnMessage(tagMSG &Msg, bool &Handled);

__published:
        __property Forms::TMessageEvent OnMessage = {read = FOnMessage, write=FOnMessage};
w pliku źródłowym:
KOD cpp:     UKRYJ  
void __fastcall TKontrolka_OK::SetOnMessage(tagMSG &Msg, bool &Handled);
{
 if(FOnMessage != NULL) FOnMessage(Msg, Handled);
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
lidamian
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Nakrywanie zdarzeń w komponencie

Nowy postprzez polymorphism » niedziela, 14 sierpnia 2011, 10:00

Problem w tym, że TLipa::Message nigdy nie jest wywoływane.

A dlaczego miałoby być wywoływane? Przeszukałem dokumentację i nigdzie nie znalazłem takiej metody (wirtualnej) w klasach bazowych. Zakładam, że Message ma być wywoływane w reakcji na jakieś zdarzenia zewnętrzne, czyli np. zdarzenia okienkowe. Tyle tylko, że klasa TComponent nie jest klasą okna, więc trochę dziwne byłoby, gdyby pojawiały się w niej komunikaty okienkowe, nieprawdaż?

No chyba że Tobie o coś innego chodzi...
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
lidamian
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Nakrywanie zdarzeń w komponencie

Nowy postprzez lidamian » niedziela, 14 sierpnia 2011, 12:31

To zdarzenie OnMessage jest wywoływane gdy otrzymam odpowiednią wiadomość przez protokół TCP/IP.
Ogólnie ujmując ostatni raz piszę programy po nocach bo ja teraz na to patrzę to aż mi się głupio robi ;P
Chciałem w komponencie TLipa przeładować funkcję której nie były w komponencie TKontrolka_Ok. Znowu maszyna okazała się bardziej logiczna ode mnie...

Ogólnie zrobiłem coś takiego jak napisał CB i przeładowałem funkcję SetOnMessage ;) Aktualnie dopiero zaczynam zabawę z własnymi kontrolkami stąd też ta wpadka .

Dzięki stokrotne za pomoc ;) Podziwiam Was za ilość czasu jaką tu spędzacie pomagając innym ;)
Pozdro
Avatar użytkownika
lidamian
Bladawiec
Bladawiec
 
Posty: 29
Dołączył(a): piątek, 19 września 2008, 15:25
Podziękował : 4
Otrzymał podziękowań: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Biblioteki i komponenty

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości