Property 的存取特性 |
|
will
中階會員 發表:176 回覆:135 積分:62 註冊:2002-04-14 發送簡訊給我 |
這個問題一直困擾我多年 我New 一個TForm後 在Interface 段加以修改後如下 **********************************************************************************
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
sPrivate:String;
public
{ Public declarations }
sPublic:String;
end; var
Form1: TForm1;
sTest:String;
implementation
...
*****************************************************************************************
1. 在Private或Pulic 區段宣告的變數(如上例中的sPrivate 及sPublic)各有其特性
那在var 宣告的變數(如上例中的sTest)其特性是Private 或者是Public呢 2. 上例中的Button1 必須宣告中Private之前的區段, 那其特性又為何呢? 是Public or Private?
3. 何種欄位可宣告在 TForm1 = class(TForm) 及Private 中間 具有什麼特性
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
這個問題一直困擾我多年
好耶!開始認真思考以前忽略的細節喔!
我New 一個TForm後 在Interface 段加以修改後如下 **********************************************************************************
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
sPrivate:String;
public
{ Public declarations }
sPublic:String;
end; var
Form1: TForm1;
sTest:String;
implementation
...
*****************************************************************************************
1. 在Private或Pulic 區段宣告的變數(如上例中的sPrivate 及sPublic)各有其特性
簡單說sPrivate只給自家人用(就是在unit Unit1;這一家人),若有另外一家子叫Unit Unit2;其引用Uses unit1;時是無法引用到TForm.sPrivate,但可以引用到TForm.sPublic
那在var 宣告的變數(如上例中的sTest)其特性是Private 或者是Public呢
在interface與implementation之間宣告的變數或函數都是Public,也就是供別人使用的界面區段,在implementation之後宣告的變數或函數都是Private只供本身的Unit使用,但要注意Pascal向前參考的特性.
2. 上例中的Button1 必須宣告中Private之前的區段, 那其特性又為何呢? 是Public or Private?
Button1當然也是Public,一般來說,我們會將可視覺化的物件宣告在Class(TFrom)之後private之前
3. 何種欄位可宣告在 TForm1 = class(TForm) 及Private 中間 具有什麼特性
需要被別的Unit引用的視覺化物件/或自訂函數都可以宣告在TForm1 = class(TForm) 及Private 中間(但是變數不可宣告在此). 我的結論如下:
1.由Delphi IDE中拉出來的元件或物件會自動宣告在TForm1 = class(TForm) 及Private 中間
2.自己宣告的物件或變數或函數若要開放給其它unit引用時就宣告在Public中
3.自己宣告的物件或變數或函數若不要開放給其它unit引用時就宣告在Private中
4.與TFrom無關的變數或函數,但要開放給其它unit引用,才宣告在implementation之前,type TForm1 = class(TForm)之後
5.Unit1內部臨時使用的變數或函數,才宣告在implementation之後!
以上言論若有疏失之處歡迎指正,謝謝!
~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
will
中階會員 發表:176 回覆:135 積分:62 註冊:2002-04-14 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
以上說明可能有些小問題
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm) //此處開始定義TForm1之類別
Button1: TButton; //此處為published
private
{ Private declarations }
sPrivate:String;
protected
sprotect:string; //此區Create Form時不自動產生
public
{ Public declarations }
sPublic:String;
end; //結束TForm2之類別定義 var //此處為全域變數,其他Unit只須Uses此Unit即可直接使用
//與TForm1類別無直接關係
Form1: TForm1;
sTest:String; implementation
var //此處可宣告僅此Unit內使用之全域變數
ss:string;
... 1. 類別定義與變數宣告完全不同
由TForm1 = class(TForm) 到End;只是在定義TForm1之類別
因此無論在published,public,protect,private任何部分之定義均為類別定義之一部分, 須由此Class Create Instance後才有意義,且若Create多個Instance,則每一Instance均有自己的一分. 變數宣告則依其宣告位置而有不同之Scope
Implementation 前為全域變數, 之後為僅此Unit可用之變數,Function或Procedure內則為Local變數 2. 以上面之程式為例,假設有另一Unit2
a. uses unit1可直接使用sTest
b. 無法存取ss
c. 以Tform1 Create一Instance後可存取此Instance內之spublic var f:TForm1;
begin
f:=TForm1.create(application);
f.spublic... //spublic為f object之一部分
end; 3. protected
若在Unit2中定義一Class繼承TForm1, 則在Unit2中可Access sprotect,
也可在此Class 中將Protected部分改為public
[NOTE]利用此特性可使用VCL元件中部分原為Protect之Property,如TDBGrid之FixedCols,TopRow,OnMouseWheel等 4. published
在private之前未標示之區域為published(不是public), 存取Scope與public同,但會寫入VMT, 故在元件設計時宣告為published之propert才會在DesignTime出現在Object Inspector中
|
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
引言:只要有空, 隨時歡迎討論. 有幫的上忙的地方也願盡力,至於"版主", 實在不太敢, 且操作環境也不是很熟 不過有的時候, 實在想長篇大論一番(如Class 之基本觀念應可用更多之實例說明), 想Post較完整之程式不知如何處理引言: 以上說明可能有些小問題 ....再度感謝前輩ccchen會員深入淺出的解說,看來我的OOP觀念還有需要再加強的地方,正所謂 一山還有一山高 ,教學相長,自己獲益更多! 誠懇邀請前輩ccchen會員擔任"Object Pascal物件導向討論區"版主,不知意下如何? ~~~Delphi K.Top討論區站長~~~ |
領航天使
站長 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
只要有空, 隨時歡迎討論. 有幫的上忙的地方也願盡力,至於"版主", 實在不太敢, 且操作環境也不是很熟
您實在太客氣了,擔任OP的版主應該是當之無愧,至於"操作環境也不是很熟",您是指本討論區的操作不熟嗎?
本站簡介中有一些本站發表文章的方法與技巧,請見:
http://delphi.ktop.com.tw/forum.asp?FORUM_ID=88
不過有的時候, 實在想長篇大論一番(如Class 之基本觀念應可用更多之實例說明), 想Post較完整之程式不知如何處理
歡迎!歡迎!真是太好了!
要上傳程式可以放在"會員作品發表區":http://delphi.ktop.com.tw/forum.asp?FORUM_ID=79
選"發表新主題",在"上傳檔案:"後面的按紐"瀏覽..."選擇您要上傳的檔案名稱
(最好將所有程式用Winzip壓縮成.ZIP檔後再上傳) 若是要發表整篇文章,我正在寫一個電子書的瀏覽工具軟體,可以將壓縮檔內的整篇HTML(可以數個HTML與圖檔或是整個目錄)流覽出來,預計再幾天就可完工.
屆時您就可以用 FrontPage編寫文章也可以含圖,也可以數個HTML連結,整個目錄壓縮之後變成一個BOOK.ZIP壓縮檔,就可以上傳至本站給網友下傳Offline閱讀您的大作..細節等軟體出來再告訴您!
~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |