Event handler/property

0

Cześć

Od wczoraj się głowie nad wydawałoby się prostą sprawą.

Definiuje procedurę obsługującą zdarzenia OnChange oraz OnExit.
Chciałbym wiedzieć jakie zdarzenie wywołuje moją procedure:

constructor TCostam.Create
begin
 inherited;
 OnChange:=EnterOnChange;
 OnExit:=EnterOnChange;
end;

procedure TCostam.EnterOnChange(Sender:TObject);
begin
 if EnterOnChange = OnExit then jakas_procedura;  // i tutaj wywala mi błąd
end;

Błąd to: Not enough actual parameters.
Nie mam pojęcia co jest źle.

Pomocy!!

Adam

0

wg mnie linijka
if EnterOnChange = OnExit then jakas_procedura;
jest nieco bez sensu :P

Sprawdzasz w funkcji adres samej funkcji?
Nie lepiej dodać gdzieś jakąś małą flagę? :)

0

PPP,
Dzięki za odpowiedź.

Nie za bardzo rozumiem o co chodzi z tą flagą.

Próbowałem użyć @ jako że TnotifyEvent jest ponoć pointerem, ale poprzednia deklaracja jakoś działa bez wskaźników.

Jestem mocno zdziwiony że takie banalne zagadnienie, a tyle komplikacji...

Adam

0

Sam ciekaw byłem rozwiązania. A z flagą to pewnie chodziło o to żeby zrobić jakąś zmienną Byte albo moze
typ wyliczeniowy i w zależności od zdarzenia przypisywać go do zmiennej, ale też nie wiem jak to obsłużyć.

0

W momencie kiedy kompilator trawi linię:

OnChange:=EnterOnChange;

Widzi że po lewj stronie operaora podstawienia jest OnChange czyli zmienna typu "procedure(Sender:TObject) of object" i takiego też typu oczekuje po prawej stronie instrukcji
Kiedy robisz porównanie w if-e kompilator traktuje OnChange jak funkcję i prubuje wywołać procedure Onchange i oczekuje parametru typu TObject. Używasz @ aby poinformować kompilator o tym że porównujesz procedury a nie ich wyniki. Dlatego powinieneś zrobić to tak:

if @OnChange=@EnterOnChange then ...

I w ten sposób powinno działać.

PS Po przeczytaniu swojej wypowiedzi mam odczucie że jest ona czystym bełkotem, dlatego proponuję ogarnąć temat w pomocy Delphi

PS2 Faktycznie, część :

procedure TCostam.EnterOnChange(Sender:TObject);
begin
 if EnterOnChange = OnExit then jakas_procedura;  // i tutaj wywala mi błąd
end;

jest zupełnie bez sensu. Robisz po prostu 2 różne procedury TNotifyEvent i tyle

0
Adam44 napisał(a)

Chciałbym wiedzieć jakie zdarzenie wywołuje moją procedure:

procedure TCostam.EnterOnChange(Sender:TObject);
begin
 if EnterOnChange = OnExit then jakas_procedura;  // i tutaj wywala mi błąd
end;

Błąd to: Not enough actual parameters.
Nie mam pojęcia co jest źle.

Tego się po prostu nie da.

0

Azarien:

Tego się po prostu nie da.

No jeśli nie to nie, chciałem się po prostu upewnić.

RFabiański:

if @OnChange=@EnterOnChange then ...

No tak jak pisałem wcześniej, próbowałem wskaźników, też nie działa...

Ja się zgadzam że kod:

 if EnterOnChange = OnExit then jakas_procedura;

może być bez sensu, ale prosze o propozycje jak sprawdzić czy "senderem" jest OnExit???
Oczywiście sender jest wykluczony....

Czy to w ogóle się da zrobić?? Wiem że mogę zrobić 2 oddzielne procedury obsługujące oddzielne zdarzenia, ale w tym właśnie jest problem.
Chciałem uprościć/skrócić kod używając JEDNEJ procedury.

Dzięki!!

Adam

0
Adam44 napisał(a)

prosze o propozycje jak sprawdzić czy "senderem" jest OnExit???
Oczywiście sender jest wykluczony....

Sender to jest OBIEKT a OnExit to jest METODA (EVENT). To są dwa różne typy, ba to są nawet dwa różne logicznie byty i ich się nie da porównać. Tak samo jak nie da* się stwierdzić KTO wywołał daną metodę.

  • znaczy da się ale nie jest to takie proste
0
Adam44 napisał(a)

[...] Wiem że mogę zrobić 2 oddzielne procedury obsługujące oddzielne zdarzenia, ale w tym właśnie jest problem.
Chciałem uprościć/skrócić kod używając JEDNEJ procedury.

no ale w tym momencie to juz nie jest uproszczenie a komplikowanie.
jesli dobrze rozumiem to chcesz do dwoch zdarzen komponentu przypisac jedna i ta sama procedure ktorej dialanie zalezy od tego ktorye zdarzenie ja wywolalo - a nie ma sensu pisac dwoch osobnych procedur bo beda podobne, tak?
bo inaczej to chyba nie widze sensu w tym, co chcesz zrobic.. to takie skracanie na sile.

0

Zrób po prostu tak:

constructor TCostam.Create
begin
 inherited;
 OnChange:=NChange;
 OnExit:=NExit;
end;

procedure TCostam.NChange(Sender:TObject);
begin
 JakasProcedura(False);
end;

procedure TCostam.NExit(Sender:TObject);
begin
 JakasProcedura(True);
end;

PS: Istotnie kod który podałem nie skompiluje się, ale taki już tak:

  var N1,N2:TNotifyEvent;
begin
  N1:=self.EnterOnChange;
  N2:=self.OnExit;
  if (@N1=@N2) then ...
0

RFabianski:

Dziękuje! Wszystko działa idealnie!

Zastanawiam się tylko dlaczego skoro tamto działa, to czemu to nie działa:

  if @self.EnterOnChange = @self.OnExit then costam;

Ale najważniejsze jest że jednak da sięto zrobić!!

pozdrawiam i dziękuje!!

Adam

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