全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1587
推到 Plurk!
推到 Facebook!

請教---事件改寫

尚未結案
faith
一般會員


發表:2
回覆:6
積分:1
註冊:2003-04-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-08 16:30:55 IP:203.70.xxx.xxx 未訂閱
TmyPanel繼承自TPanel 假使我想在TmyPanel的onclick事件showmessage 請問該怎麼做啊 麻煩各位幫我回答一下 謝謝呦!!
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-08 16:50:43 IP:147.8.xxx.xxx 未訂閱
TMyPanel = class(TPanel)
protected
    procedure Click; override;
end;    procedure TMyPanel.Click;
begin
    ShowMessage('Test');
    inherited;
end;
faith
一般會員


發表:2
回覆:6
積分:1
註冊:2003-04-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-08 17:35:15 IP:203.70.xxx.xxx 未訂閱
我了解了 謝謝您^^
faith
一般會員


發表:2
回覆:6
積分:1
註冊:2003-04-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-09 14:59:46 IP:203.70.xxx.xxx 未訂閱
現在又有一個問題 為何我建立了改寫過Click事件的class 要動態指定他的OnClick事件會出錯 Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter' 請問該如何解決,謝謝~~~
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-09 15:14:19 IP:147.8.xxx.xxx 未訂閱
Perhaps you should post your code here?    
TObj = class
    procedure MyClick(Sender: TObject);
end;
{...}
AObj: TObj;
{...}
myPanel.OnClick := AObj.MyClick;
faith
一般會員


發表:2
回覆:6
積分:1
註冊:2003-04-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-09 15:36:53 IP:203.70.xxx.xxx 未訂閱
您好 我只是很簡單的從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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-09 16:29:03 IP:147.8.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-10 11:50:14 IP:203.70.xxx.xxx 未訂閱
我想請問一下 為什麼一般在動態建立VCL時指定事件只要將一個procedrue只給該事件即可 就像OnClick事件是一個TNotifyEvent但是仍是可將Procedure只給他 那麼像我上方的例子 繼承下來的class在指定procedrue給OnClick事件時卻會發生錯誤? 麻煩前輩指導,感激不盡^^
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-10 12:07:49 IP:147.8.xxx.xxx 未訂閱
引言: 我想請問一下 為什麼一般在動態建立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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-10 13:17:10 IP:211.76.xxx.xxx 未訂閱
引言: 我想請問一下 為什麼一般在動態建立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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-10 13:17:27 IP:203.70.xxx.xxx 未訂閱
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-10 13:46:45 IP:218.16.xxx.xxx 未訂閱
簡單來說就是 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-04-10 15:43:46 IP:203.70.xxx.xxx 未訂閱
我做出來了 謝謝各位前輩的指導^^
系統時間:2024-06-28 2:09:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!