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

請問如何繼承某元件的所有property

尚未結案
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-15 13:22:58 IP:61.145.xxx.xxx 未訂閱
例如:我想在form2創建一個button1,然后繼承form1中button1的 所有property(name,SetBounds,caption.....),請問然后實現?謝謝
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-15 13:43:26 IP:202.39.xxx.xxx 未訂閱
這種情況下, 必須以手動的方式, 一個一個將 Form1.Button1 的每個 property 的值指定給 Form2.Button1 -- 棒球是從兩出局開始的.
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-15 14:42:12 IP:220.130.xxx.xxx 未訂閱
你無法從Form1中的Button1去繼承它而產生另一個在Form2的Button1. 之前我說過的做法,你應該使用Form Templete, 以下是Setp by Step的步驟: (1)開啟新專案Project1,其中具備兩個Form(Form1, Form2),而TForm1, TForm2是兩個繼承自TForm的Class,在完全未擺置任何元件的狀況下TFrom,TForm1,TForm2是完全相同的. (2)將Form2自AutoCreate-Forms 的List中移至Available Forms的List中 [MainMenu] Project->Options->Forms (3)記住,程式執行時,會自動產生一個TForm1的Instance,回傳的指標會至於Form1(物件指標變數宣告在Unit1),但不會產生TForm2的Instance,也就是說宣告在Unit2中的物件指標變數Form2並不會被用到. (4)這時讓我們來改寫TForm2,就是簡單的放置一個TButton的物件在TForm2,此時TForm2和TForm就開始有些不同了.而Button1: TButon是TForm2的一個屬性. (5)為專案新增二個Form,並且由TForm2繼承下來 動作: [MAINMENU]File->New->Other->[專案名稱Project1]->選From2 最後會產生TForm3, TForm4, 並重複步驟(2),將Form3及Form4移至Available-Forms. (6)因為TForm3 = class(TForm2); and TForm4 = class(TFrom2);, 所以這時TForm2的任何改變會即時反映到TForm3及TForm4;
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-15 17:50:38 IP:219.131.xxx.xxx 未訂閱
謝謝jow,請問什么時候用AutoCreate,什么時候用 Available Forms?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-15 18:27:51 IP:220.130.xxx.xxx 未訂閱
放置於Auto-Create Forms 的項目,Application在執行時就會幫你產生個別的Form. 例如 用Form1產生TForm1型態的Form;
           用Form2產生TForm2型態的Form;
你可以用滑鼠指向Project Manager中你的專案名稱,按滑鼠右鍵,選擇View Source,可以看到Application如何幫你產生這些Form,而這裡的Application指的是一個執行程式的一個Global 物件,它代表你的程式本身,同時它也是這些Auto-Created Forms 的Owner.Auto-Create Forms 的第一個項目,是你的Application MainForm.(Data Module除外).    而放置於Available Forms List中的項目表示你專案中可供產生的各個Form的資料型態,用於動態產生的情況下.延續之前的Step By Step的步驟你可以繼續以下的實驗     (7)在Form1擺置一個Button,並寫下以下的程式碼    implementation    uses Unit3;    procedure TForm1.Button1Click(Sender: TObject);
var
  X: TForm3;
begin
  X := TForm3.Create(Self);
  try
    X.ShowModal;
  finally
    FreeAndNil(X);
  end;
end;    
觀察一下,你就清楚了.
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-15 19:09:07 IP:219.131.xxx.xxx 未訂閱
原來是這樣!那如果在程式執行的時候,用戶希望把程式中的所有form的顔色更換,而且程式在已經編譯好的情況下,有什么方法可保持所有form的一緻性?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-16 09:14:47 IP:220.130.xxx.xxx 未訂閱
因為TForm2是Form3及Form4的基礎類別(Base Class)所以你可以在TForm2的FormCreate的裡加上顏色的設定,只要它的子類別沒有去覆載它(override)則其後所產生的各個子類別的From Instance都將延續它的設定.    
 
procedure TForm2.FormCreate(Sender: TObject);
begin
  Color := AGlobalColorVariable;
end;
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-16 10:02:24 IP:219.131.xxx.xxx 未訂閱
請教什么是override? 本來我在Form2設定任何顔色,Form3及Form4的顔色都會跟隨變化(還沒有run), 但是,當我把Form3及Form4的顔色設定為其他顔色(在objet inspector) 的時候,無論怎樣改變Form2的顔色,Form3及Form4的顔色都不會變化, 為什么?有辦法可以令Form3及Form4的顔色再次跟隨Form2變化嗎?謝謝
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-16 10:48:33 IP:220.130.xxx.xxx 未訂閱
請教什么是override? 這話說起來就有點長了,你應該多參考一些書籍. 本來我在Form2設定任何顔色,Form3及Form4的顔色都會跟隨變化(還沒有run), 但是,當我把Form3及Form4的顔色設定為其他顔色(在objet inspector) 的時候,無論怎樣改變Form2的顔色,Form3及Form4的顔色都不會變化, 為什么? 那是你僅僅改變了Form.Color的屬性預設值,這個值會被存在*.dfm資源檔中, 每次產生一個Form時,相對應的資源檔內的設定值就會被開啟用來設定這個 新的Form Instance; 而事實上這個資源檔指儲存非預設值的屬性設定.
procedure TForm2.FormCreate(Sender: TObject);
begin
  Color := AGlobalColorVariable;
end;    是在Class層面去改變 Base Form的類別特性,其影響所及為每次產生new form instance 時,讓它的顏色在物件Create完之後隨即被設定為AGlobalColorVariable 的內含值.
 
有辦法可以令Form3及Form4的顔色再次跟隨Form2變化嗎?謝謝 基本上已經產出的個別Form Instance,其在記憶體內各自佔有一個獨立的區 塊如果你要讓Base Class的Color屬性被改變時,其子類別纏生的物件的Color 也被改變,則你必須讓從Base Class到它的子類別有相對的機制,對這種變化 做出反應.用Post Message也許是個不錯的做法.
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-16 10:54:33 IP:219.131.xxx.xxx 未訂閱
請教jow,什么是Post Message,如何使用?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-16 11:11:51 IP:220.130.xxx.xxx 未訂閱
實驗看看吧!
 
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;    //請參考Unit: Messages內的原始碼
const
  WM_MYMESSAGE = WM_USER   12345;    type
  TWMMyMessage = record
    Msg: Cardinal;
    Sender: TObject;
    unused: Integer;
  end;      TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    procedure WMMyMessage(var Message: TWMMyMessage); message WM_MYMESSAGE;
  public
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    { TForm1 }    procedure TForm1.WMMyMessage(var Message: TWMMyMessage);
begin
  if Message.Sender = Button1 then
    Color := RGB(Random($100),Random($100),Random($100))
  else if Message.Sender = Button2 then
    Color := clBlack;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Handle,WM_MYMESSAGE,Integer(Sender),0);
end;    procedure TForm1.Button2Click(Sender: TObject);
begin
  PostMessage(Handle,WM_MYMESSAGE,Integer(Sender),0);
end;    end.
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-16 11:30:26 IP:218.13.xxx.xxx 未訂閱
jow,不好意思,為什么程式沒有反應?它與Form3及Form4的顔色(沒有run的時候) 再次跟隨Form2變化有什么關繫?謝謝
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-12-16 12:24:24 IP:220.130.xxx.xxx 未訂閱
 
Sorry!上一篇Post的目的是讓你實驗PostMessage的用法,我不知道你如何改寫
到你的程式中;這樣好了!假設Form1是你的MainForm,那麼讓我們在Form1新增一個屬性.    unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls
  ,Forms, Dialogs, StdCtrls;    type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    FFormGlobalColor: TColor;
    procedure SetFormGlobalColor(const Value: TColor);
  public
    property FormGlobalColor: TColor read FFormGlobalColor write SetFormGlobalColor;
  end;    var
  Form1: TForm1;    implementation    uses Unit2, Unit3, Unit4;    {$R *.dfm}    { TForm1 }    procedure TForm1.SetFormGlobalColor(const Value: TColor);
var
  I: Integer;
begin
  if Value <> FFormGlobalColor then
  begin
屬性值被更改時,以Message 的方式通知所有需作反應的Form Instance
    FFormGlobalColor := Value;
    for I := 0 to ComponentCount-1 do
      if Components[I] is TForm2 then
              PostMessage(TForm2(Components[I]).Handle,
                     WM_CHANGEFORMCOLOR,
                     Integer(FFormGlobalColor),
                     0);
雖然只判斷是否為TForm2,但是所有自TForm2繼承下來的子類別所產出
的Form Instance都會被涵蓋.
  end;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
  //TForm2 的 Instance 的 Owner 指定為 Form1
       //如此,即使Form Instance在Create後,我並沒有去Kepp它的
       //回傳值,因為它被加入Owner Form (MainForm-Form1)中,受到
       //Owner Form 的管理,也就是說,即使在程式結束時,我沒有關閉
       //所有自行產生的Form Instance, 也能確保MainForm在Destroy時
       //會將它們先Destroy; 
  with TForm2.Create(Self) do Show;
end;    procedure TForm1.Button2Click(Sender: TObject);
begin
  with TForm3.Create(Self) do Show;
end;    procedure TForm1.Button3Click(Sender: TObject);
begin
  with TForm4.Create(Self) do Show;
end;    procedure TForm1.Button4Click(Sender: TObject);
begin
  //更改屬性值
  FormGlobalColor := RGB(Random($100),Random($100),Random($100));
end;    unit Unit2;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs;    const
  WM_CHANGEFORMCOLOR = WM_USER   12345;    type      TWMChangeFormColor = record
    Msg: Cardinal;
    FormColor: TColor;
    unused: Integer;
  end;    type
  TForm2 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure WMChangeFormColor(var Message: TWMChangeFormColor); message WM_CHANGEFORMCOLOR;
  end;    var
  Form2: TForm2;    implementation    {$R *.dfm}    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  確保Form被關閉時釋放所佔記憶體資源
  Action := caFree;
end;    procedure TForm2.WMChangeFormColor(var Message: TWMChangeFormColor);
begin
  當收到Message WM_CHANGEFORMCOLOR所做的動作
  Color := Message.FormColor;
end;    end.    
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-12-16 13:11:14 IP:218.13.xxx.xxx 未訂閱
但是run的時候髮生編譯錯誤,如圖    
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-12-16 13:32:01 IP:220.130.xxx.xxx 未訂閱
Class TButton not found 這相當詭異,因為你有Use到StdCtrls就應該可以吧! 還是我把範例mail給你吧, 我run得很正常.
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-12-16 14:10:37 IP:220.130.xxx.xxx 未訂閱
donlly    要範例請給email addr.    
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-12-16 14:12:52 IP:219.131.xxx.xxx 未訂閱
hi jow: 現在可以run,不過Form3及Form4的顔色沒有跟隨Form2的顔色變化而且變化. 等我說清楚是什么一囬事,我按之前的步驟創建form1,form2,form3,form4. 因為form3和form4的Base Class是 form2,所以隻要我把form2的顔色更改 或者大小調整,form3和form4的顔色和大小都跟隨Form2的變化而變化(註意: 是在沒有run的時候),但是當我把form3和form4的顔色和大小各自調整一下 后,它們就不再跟着form2而變化,現在我想令Form3及Form4的顔色和大小 再次跟隨Form2變化(在沒有run的時候),有什么方法可以做到呢?謝謝
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-12-16 14:13:22 IP:219.131.xxx.xxx 未訂閱
hi jow: 現在可以run,不過Form3及Form4的顔色沒有跟隨Form2的顔色變化而變化. 等我說清楚是什么一囬事,我按之前的步驟創建form1,form2,form3,form4. 因為form3和form4的Base Class是 form2,所以隻要我把form2的顔色更改 或者大小調整,form3和form4的顔色和大小都跟隨Form2的變化而變化(註意: 是在沒有run的時候),但是當我把form3和form4的顔色和大小各自調整一下 后,它們就不再跟着form2而變化,現在我想令Form3及Form4的顔色和大小 再次跟隨Form2變化(在沒有run的時候),有什么方法可以做到呢?謝謝
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-12-16 14:48:24 IP:220.130.xxx.xxx 未訂閱
你好,我大概清楚你的需求,不過你要在Design Time就要做到這樣的效果, 恐怕沒有辦法,至少我已經沒有了,只是當你更改各子類別的屬性,包含移動 視窗,都已經更改了類別的初始化設定,並且存於資源檔中; 而且即使你自同一類別(如TButton)產生二個Instance,並置於Form上,他們的各 自屬性絕不相同,Name property就是其一,我想大概就是這樣了,或者請其他高 手幫幫忙吧!
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-12-16 15:56:49 IP:219.131.xxx.xxx 未訂閱
其實用 procedure TForm2.FormCreate(Sender: TObject); begin Color := AGlobalColorVariable; end; 都已經可以,不過每個屬性都用程式碼設定就痲煩一點,無論如何,非常 感謝jow的幫忙!
系統時間:2024-05-21 21:16:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!