[ gpedja_70 @ 12.11.2010. 08:07 ] @
Da li je moguce dodeliti obicnu proceduru eventu?

Npr:

Imam proceduru:

Code:
procedure Klikni(Sender: TObject);


koja je obicna procedura a ne metod

kako da dodelim tu proceduru kao onclick?

Code:
Button.OnClick := Klikni;
/// dobijem gresku: E2009 Incompatible types: 'method pointer and regular procedure'

ako uradim ovako:

Code:
Button.OnClick := TNotifyEvent(Klikni);
/// dobijem gresku: E2089 Invalid typecast

pozz!
[ Milos D @ 12.11.2010. 10:05 ] @
Mislim da nije moguće jer vidim da se to obično rešava tako što se napravi mala klasa sa jednom takvom metodom i jedan objekat te klase upotrebi za event handler.
[ gpedja_70 @ 12.11.2010. 11:27 ] @
da, to znam
nego sam se pitao i par puta mi zatrebalo, da li mozda ipak moze i drugacije?
ali nisam nista uspeo.... :(
[ X Files @ 12.11.2010. 13:07 ] @
Zanimljivo.

U C++ Builderu (koji je 'ogranicen' Object Pascal-om i naravno zasnovan na VCL pravilima) je jedino bitno da se prototipovi (nase) funkcije i (event) metode slazu. Kasnije se vrsi najprostija dodela, bez ikakvog dodatnog kastovanja, kao sto si prirodno i sam pokusao.

Sada sam malo gledao po netu, i vidim da se to resava kao sto je "Milos D" rekao, promovisanjem funkcije u metodu klase. Naravno kasnije ide dodela.
Code:

type
  TYourClass=class(TObject);
    procedure GenericClick: TNotifyEvent;
  end;


Uglavnom sve identicna resenja:
http://delphi.about.com/cs/adptips2003/a/bltip1003_5.htm


[Ovu poruku je menjao X Files dana 12.11.2010. u 14:22 GMT+1]
[ savkic @ 12.11.2010. 19:39 ] @
> koja je obicna procedura a ne metod
> kako da dodelim tu proceduru kao onclick?

Evo primera. BTW, zašto uopšte radiš tako nešto? Ako imaš button onda imaš i klasu kojoj taj button pripada.

Code:

function ProcedureToMethod(Owner: TObject; ProcAddr: Pointer) :TMethod;
begin
  Result.Data := Owner;
  Result.Code := ProcAddr;
end;

procedure Klikni(Sender: TObject);
begin
  Form1.Caption := intToStr(GetTickCOunt);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Temp: TMethod;
begin
  Temp := ProcedureToMethod(Self, @Klikni);
  Button1.OnClick := TNotifyEvent(Temp);
end;

[ gpedja_70 @ 15.11.2010. 09:42 ] @
ovo izlgeda da radi!

Citat:
BTW, zašto uopšte radiš tako nešto?


ovde je button samo uzet kao primer,
a primena bi bila ako bih zeleo jedan isti event da se okida za vise razlicitih objekata, recimo neki dijalog za konfirmaciju ili tako nesto...