komunikaty wysylane do komponentow

0

Jak wyslac komunikat do konkretnego komponentu?
Zalezy mi na tym aby komunikat nie zostal obsluzony od razu,
tylko trafil do kolejki zdarzen...

z tego co sie doczytalem wynika ze jest metoda Perform (w klasie TControl) wysylajaca
komunikat do komponentu, ale ona oczekuje na wykonanie obslugi tego zdarzenia.

Lepsza metoda wydaje sie PostMessage() ale ona wymaga uchwytu, a on jest dostepny
dopiero w klasie TWinControl. Nie chcialbym dziedziczyc po zbyt rozbudowanych klasach
jesli nie jest to konieczne.

z tad moje pytanie:
Czy da sie w jakis sprytny sposob przekazac komponentowi (klasie)
informacje zeby w najblizszej wolnej chwili wykonala jakas metode?

0

Dodajesz do klasy w private:
FWnd: THandle; //wlasne okno handle

Potem przy Create:
FWnd := Classes.AllocateHWnd(WMUser);

i przy Destroy:
Classes.DeallocateHWnd(FWnd);

Dodajesz procedurę obsługi wiadomości:

procedure Klasa.WMUser(var msg: TMessage);
begin
//tu obsługa messagess
if (msg.msg = WM_User ) then 
 begin
case msg.wParam of ....

 end;
end;

Klasa odbiera wtedy private messagess, które posyłasz poprzez:

SendMessage(Handle, WM_USER, wParam, lParam );

0

Czyli mam rozumiec, ze wszystkie komunikaty wysylane do tego komponentu beda obslugiwane przez procedure WMUser?
I sam musze w niej zastanawiac sie jaki to byl komunikat i odpowiednio wywolywac procedure do obslugi konkretnego komunikatu?
czyli:

TMojKomponent = class(TWinControl)
{...}
  handle: THandle;
  constructor Create(AOwner: TComponent);
  procedure ObslugaZdarzenia(var Msg: TMessage);
  procedure OnKomunikat1;
  procedure OnKomunikat2;
{...}
end;

Constructor TMojKomponent.Create(AOwner: TComponent)
begin
  handle := handle := Classes.AllocateHWnd(ObslugaZdarzen);
  {...}
end;

procedure TMojKomponent.ObslugaZdarzen(var Msg: TMessage)
begin
  case Msg.msg of
    WM_USER+100: OnKomunikat1;
    WM_USER+101: OnKomunikat2;
  end;
end;

?????????

Czy moze da sie zrobic tak jak z komponentami dziedziczacymi po TWinControl:

TMojKomponent = class(TWinControl)
{...}
  procedure ObslugaZdarzenia(var Msg: TMessage) message WM_User+100;
{...}
end;

Czyli ze po prostu gdy komponent odbierze komunikat WM_USER+100 to wykona procedure ObslugaZdarzenia.

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