請教---事件改寫 |
尚未結案
|
faith
一般會員 發表:2 回覆:6 積分:1 註冊:2003-04-07 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
faith
一般會員 發表:2 回覆:6 積分:1 註冊:2003-04-07 發送簡訊給我 |
|
faith
一般會員 發表:2 回覆:6 積分:1 註冊:2003-04-07 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
faith
一般會員 發表:2 回覆:6 積分:1 註冊:2003-04-07 發送簡訊給我 |
您好
我只是很簡單的從TPanel繼承一個叫TmyPanel的
然後只有這段 TMyPanel = class(TPanel)
protected procedure Click; override;
end; procedure TMyPanel.Click;
begin
ShowMessage('Test');
inherited;
end; 然後我有一個
Procedure Msg(Sender: TObject);
begin
Showmessage('OnClick');
end; 我建立TMyPanel var MP:TMyPanel MP := TMyPanel.Create;
with MP do begin
onClick := Msg(MP);
end; 結果Complier就會出現錯誤訊息
Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter' 麻煩您幫我看一下
謝謝你呦...
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
TMyMsg = class { make it a class method so that you don't need to create an instance for it } class procedure Msg(Sender: TObject); end; TMyPanel = class(TPanel) protected procedure Click; override; end; procedure TMyPanel.Click; begin ShowMessage('Test'); inherited; end; procedure TMyClass.Msg(Sender: TObject); begin Showmessage('OnClick'); end; {...} var MP:TMyPanel MP := TMyPanel.Create; with MP do begin onClick := TMyClass.Msg; end;發表人 - william 於 2003/04/09 16:30:33 |
faith
一般會員 發表:2 回覆:6 積分:1 註冊:2003-04-07 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
引言: 我想請問一下 為什麼一般在動態建立VCL時指定事件只要將一個procedrue只給該事件即可 就像OnClick事件是一個TNotifyEvent但是仍是可將Procedure只給他 那麼像我上方的例子 繼承下來的class在指定procedrue給OnClick事件時卻會發生錯誤? 麻煩前輩指導,感激不盡^^I think you have some misunstanding here. TNotifyEvent must be supplied with a class/object method. |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
引言: 我想請問一下 為什麼一般在動態建立VCL時指定事件只要將一個procedrue只給該事件即可 就像OnClick事件是一個TNotifyEvent但是仍是可將Procedure只給他 那麼像我上方的例子 繼承下來的class在指定procedrue給OnClick事件時卻會發生錯誤?Hi, 你可以追一下 TNotifyEvent 的定義你就了解 william 兄的解說了. 你在程式中打 TNotifyEvent , 然後用 ctrl 左鍵 按在 TNotifyEvent 上. 可以追到 Classes 裡, 其中: TNotifyEvent = procedure(Sender: TObject) of object;所以不是 regular procedure, 而是 procedure(Sender: TObject) of object 這樣了解了嗎? |
faith
一般會員 發表:2 回覆:6 積分:1 註冊:2003-04-07 發送簡訊給我 |
procedure TfCKA.MSG(Sender: TObject);
begin
ShowMessage('Why?');
end;
----------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
pnl : TPanel;
begin
pnl := TPanel.Create(nil);
with pnl do begin
Parent := fForm1;
Caption := 'Click';
OnClick := MSG;
end;
end; william 前輩
為什麼這樣卻是可以的?我給他的是procedure呀?
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
簡單來說就是 procedure 也分為獨立的 procedure 及 物件的 procedure 你最初的例子
Procedure Msg(Sender: TObject);
begin
Showmessage('OnClick');
end;
是獨立的不屬於任何物件的 William 兄的例子 :
procedure TMyClass.Msg(Sender: TObject);
begin
Showmessage('OnClick');
end; 和你之後的例子 :
procedure TfCKA.MSG(Sender: TObject);
begin
ShowMessage('Why?');
end; 均是屬於物件的,分別是屬於 TMyClass 及 TfCKA Class 的。 而 william兄 及 timhuang兄 均指出設給 onClick 的一定要是屬於物件的 TNotifyEvent,所以你最初的例子出錯而另外兩個例子沒問題。 其實,這個 TNotifyEvent 亦可直接訂在 TMyPanel 內而不需另開新 Class。 發表人 - Justmade 於 2003/04/10 13:50:35
|
faith
一般會員 發表:2 回覆:6 積分:1 註冊:2003-04-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |