線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:975
推到 Plurk!
推到 Facebook!

執行子類別的button1click而非父類別的button1click

尚未結案
aAlan
一般會員


發表:38
回覆:24
積分:12
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-12 11:22:44 IP:61.228.xxx.xxx 未訂閱
如上圖: 背景狀況說明如下: 1.uSensor為父類別、uIPSensor為uSensor的子類別。 2.我在uIPSensor已經uses uSensor (是在Interface與Type之間的uses,而非在implementation下) 3.uSensor不可以uses uIPSensor 4.uSensor有一Form名為frmSensor,frmSensor當中有一button元件,名為button1,也有一memo元件名為memo1 現在我想做的是:當我按下button1時,Delphi 7 會執行子類別所宣告個button1Click事件,而不是執行父類別的button1click事件。這要如何完成呢? 還望各位大大教我!
alphakao
一般會員


發表:0
回覆:18
積分:8
註冊:2002-07-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-13 00:13:30 IP:203.70.xxx.xxx 未訂閱
一般來講,你 create 的是 子類別,就是 call 子類別的 Procedure 你的 類別是個 form 嗎 ? 是不是 application 幫你 create 的 form 是 父類別的 form check 一下 你 Project 裡 Application.createForm(xx,yy) 裡面寫的是那個 Form 發表人 - alphakao 於 2004/08/13 00:43:34
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-13 09:12:49 IP:219.80.xxx.xxx 未訂閱
你好: 關鍵在 TForm2 有沒有使用關鍵字 inherited 將事件往 TForm1 傳遞。 如果你將 TForm2 中的 inherited 註解掉,結果只會秀出 "我是第二個表單"    如果你將 TForm2 中的 inherited 放置在第一行,結果會先秀出 "我是第一個表單" 再秀出 "我是第二個表單"。    如果將 TForm2 中的 inherited 放置在第二行,你應該就知道答案了吧。    
TForm1 = class(TForm)
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage ('我是第一個表單');
end;    TForm2 = class(TForm1)
procedure TForm2.Button1Click(Sender: TObject);
begin
  inherited; 
  ShowMessage ('我是第二個表單');
end;
aAlan
一般會員


發表:38
回覆:24
積分:12
註冊:2004-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-13 15:02:03 IP:61.228.xxx.xxx 未訂閱
謝謝各位辛苦的回答:     在uSensor中有1.我自訂的類別TA,繼承於TObject。 2.form1繼承於TForm,也就是form1=Class(TForm)     至於在uIPSensor中有1.我自訂的類別TB,繼承於uSensor內的「我自訂類別」 2.沒有form類別。 其它情況如之前「背景狀況」所述 現在我在form1放置了一個button,然後在button1Click內不寫任何程式碼,並且在程式最前面的 宣告處procedure button1click(sender:TObject);加上Virtual; 然後再到uIPSensor中在程式最前面的宣告處字行寫一個 procedure button1click(sender:TObject);加上override; 然後在 procedure TB.button1click(sender:TObject); begin ShowMessage('程式目前正執行子類別的button1click'); end; 可是程式一compiler在父類別的button1Click就自動消失了。 因為這樣,程式就出現父類別沒有宣告的錯誤訊息,造成我無法執行子類別的TB.button1click 這要如何解決呢? 不知道我這樣解釋,大家是否能夠瞭解呢?多謝了
引言: 你好: 關鍵在 TForm2 有沒有使用關鍵字 inherited 將事件往 TForm1 傳遞。 如果你將 TForm2 中的 inherited 註解掉,結果只會秀出 "我是第二個表單" 如果你將 TForm2 中的 inherited 放置在第一行,結果會先秀出 "我是第一個表單" 再秀出 "我是第二個表單"。 如果將 TForm2 中的 inherited 放置在第二行,你應該就知道答案了吧。
TForm1 = class(TForm)
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage ('我是第一個表單');
end;    TForm2 = class(TForm1)
procedure TForm2.Button1Click(Sender: TObject);
begin
  inherited; 
  ShowMessage ('我是第二個表單');
end;
alphakao
一般會員


發表:0
回覆:18
積分:8
註冊:2002-07-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-13 16:19:23 IP:210.202.xxx.xxx 未訂閱
引言: 謝謝各位辛苦的回答: 在uSensor中有1.我自訂的類別TA,繼承於TObject。 2.form1繼承於TForm,也就是form1=Class(TForm) 至於在uIPSensor中有1.我自訂的類別TB,繼承於uSensor內的「我自訂類別」 2.沒有form類別。 其它情況如之前「背景狀況」所述 現在我在form1放置了一個button,然後在button1Click內不寫任何程式碼,並且在程式最前面的 宣告處procedure button1click(sender:TObject);加上Virtual; 然後再到uIPSensor中在程式最前面的宣告處字行寫一個 procedure button1click(sender:TObject);加上override; 然後在 procedure TB.button1click(sender:TObject); begin ShowMessage('程式目前正執行子類別的button1click'); end; 可是程式一compiler在父類別的button1Click就自動消失了。 因為這樣,程式就出現父類別沒有宣告的錯誤訊息,造成我無法執行子類別的TB.button1click 這要如何解決呢? 不知道我這樣解釋,大家是否能夠瞭解呢?多謝了
引言: 謝謝各位辛苦的回答: 在uSensor中有1.我自訂的類別TA,繼承於TObject。 2.form1繼承於TForm,也就是form1=Class(TForm) 至於在uIPSensor中有1.我自訂的類別TB,繼承於uSensor內的「我自訂類別」 2.沒有form類別。 其它情況如之前「背景狀況」所述 現在我在form1放置了一個button,然後在button1Click內不寫任何程式碼,並且在程式最前面的 宣告處procedure button1click(sender:TObject);加上Virtual; 然後再到uIPSensor中在程式最前面的宣告處字行寫一個 procedure button1click(sender:TObject);加上override; 然後在 procedure TB.button1click(sender:TObject); begin ShowMessage('程式目前正執行子類別的button1click'); end; 可是程式一compiler在父類別的button1Click就自動消失了。 因為這樣,程式就出現父類別沒有宣告的錯誤訊息,造成我無法執行子類別的TB.button1click 這要如何解決呢? 不知道我這樣解釋,大家是否能夠瞭解呢?多謝了
     unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;    type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TA = Class(TObject)
    procedure button1onclick(Sender:TObject);virtual;
  end;      TB = Class(TA)
    procedure button1onclick(Sender:TObject);override;
  end;
var
  Form1: TForm1;    implementation    {$R *.DFM}    procedure TForm1.Button1Click(Sender: TObject);
var
  MyTEST:TA;
begin
  MyTEST:=TB.Create; 
  MyTEST.button1onclick(Sender);
  MyTEST.Destroy;
end;    { TA }    procedure TA.button1onclick(Sender: TObject);
begin
  ShowMessage('程式目前正執行父類別的button1click');
end;    { TB }    procedure TB.button1onclick(Sender: TObject);
begin
  ShowMessage('程式目前正執行子類別的button1click');
end;    end.    
作不出你的效果,所以你自己看看有什麼不一樣.
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-13 22:31:17 IP:211.20.xxx.xxx 未訂閱
aAlan 你好
  比對一下,你的Button1click事件是寫在那個位置?      {  frmSensor  } 
unit frmSensor;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;    type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure   Button1Click (Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    implementation    {$R *.DFM}    procedure TForm1.Button1Click(Sender: TObject);
begin
  //   在這邊設定的程式碼,會被TA或TB的Button1Click取代
end;
End.      {  uSensor  } 
unit uSensor  ;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  frmSensor;    type
  TA = class(TObject)
  Private
    { Private declarations }
    Form1 : TForm1;
    Procedure   Button1Click (Sender: TObject); 
  public
    constructor Create; override;
    destructor Destroy; override;
    
    { Public declarations }
  end;    implementation    {$R *.DFM}
constructor TA.Create;
Begin
  inherited;
  Form1 := TForm1.Create(Application);
  Form1.Button1.onClick :=   Button1Click ;  // 在TA建立後才掛上Click事件
                                                                  //  同時取代掉frmSensor中的Button1Click的事件
End;    destructor TA.Destroy; 
Begin
  Form1.Free;
   inherited;
End;    Procedure TA.  Button1Click(Sender: TObject); 
Begin
    ShowMessage('程式目前正執行uSensor類別的button1click');
End;
end.     {  uIPSensor  }     unit uIPSensor  ;    interface    uses      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  frmSensor, uSensor  ;    type
  TB = class(TA)
  Private
    { Private declarations }
    Procedure Button1Click(Sender: TObject); Override;
  public
    { Public declarations }
  end;    implementation    {$R *.DFM}
Procedure TB.Button1Click(Sender: TObject);
Begin
    ShowMessage('程式目前正執行uIPSensor類別的button1click');
End;
end.
_______________________________________ 深藍的魚,祝您好運..........連連
系統時間:2024-05-17 16:19:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!