請問如何繼承某元件的所有property |
尚未結案
|
donlly
一般會員 發表:45 回覆:73 積分:23 註冊:2004-11-30 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
你無法從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 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
放置於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 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
|
donlly
一般會員 發表:45 回覆:73 積分:23 註冊:2004-11-30 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
請教什么是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 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
實驗看看吧!
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 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
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 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
|
donlly
一般會員 發表:45 回覆:73 積分:23 註冊:2004-11-30 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
donlly
一般會員 發表:45 回覆:73 積分:23 註冊:2004-11-30 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |