Šta je novo?

Builder C++ programiranje

Sardon

Čuven
Učlanjen(a)
07.02.2002
Poruke
38
Poena
609
Treba mi pomoć ako neko zna:

1) Imam komponentu izvedenu iz TShape i sada hoću da mi ona ignoriše poruke koje generiše miš tj. da sve odrađuju hendleri glavnog programa. Znači kako se poruke prosleđuju dalje?

2) Kada hoću da definišem novu poruku koju će neka komponenta da generiše, definišem sve potrebne strukture, i sada kojom neredbom generišem poruku.

Hvala unapred
 
1) u svojoj nasledjenoj shape klasi uradis jednostavno override nasledjenih eventova (onclick, onmousedown, itd) i u njima pozivas funkcije ili druge eventove koje ti hoces.
Ukoliko nisam najbolje razumeo sta hoces da postignes, pogledaj i DefWndProc metod koji imaju sve klase potekle od TWinControl.


2) Prvo treba da znas sta event mora da prosledi kao parametar. Ukoliko je to nesto standardno, koristis gotove prototipove eventova, kao sto je npr. TNotifyEvent (koji prosledjuje samo Sender kao TObject pointer). Ukoliko nije standardno, onda moras da definises prvo svoj prototip eventa. _PRE_ definicije klase definises event (u ovom primeru se radi o nasledjenoj TTreeView klasi koja je vezana za bazu - cisto radi razjasnjenja) :

[code:1]
typedef void __fastcall (__closure *TTreeViewAddEvent)(
TObject* Sender,
TDataSet* DataSet,
AnsiString name);
[/code:1]

Zatim koristis taj prototip da bi deklarisao event kao (FOnAdded) atribut klase (objekt fakticki cuva samo pointer ka funkciji) i property koji koristi tu istu funkciju sacuvanu u atributu i za read i za write:

[code:1]
class TDBXTreeView : public TCustomTreeView
private:
TTreeViewAddEvent FOnAdded;
...
public: (ili u "published:", zavisi da li hoces prikaz u Object Inspectoru)
__property TTreeViewAddEvent OnAdded ={read=FOnAdded, write=FOnAdded};
...
[/code:1]

Dalje u programu kada treba da se okine taj event, pozoves ga prosto kao funkciju, uz ogradu da prvo treba da proveris da li atribut ima ikakav pointer ka funkciji dodeljen (bilo kroz object inspector u design timeu ili kroz kod - runtime) ili je jos uvek null:

if(OnAdded) OnAdded(this, destinationtable, name);
 
Hvala na pomoći.
Ono pod 1) sam rešio sa message handlerom u kome je Parent->Dispatch(...), i to je u stvari ono što mi je trebalo.
 
Samo da napomenem jednu razliku - kada okidanjem eventa nemas da saljes nikakav info ili je info (argument) toliko mali da stane u wParam/lParam, onda je koriscenje Message sistema ok (definises svoj custom WM_USER+n message, definises da ti klasa ima handler za njega i to je to - dalje samo punis message struct i okidas slanje).
Medjutim, ako imas iole vise podataka za slanje event handleru, onda message koncept suvise 'steze' i moras da ides na koncept sa prototipovima eventova kako sam gore bio naveo - kao argument eventu mozes tada da prosledis sta god pozelis, tj. kao klasicnoj funkciji.
 
Nazad
Vrh Dno