Subscribe

RSS Feed (xml)

Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

星期一, 10月 29, 2007

變數存取空間

1. 副程式內的變數,僅對函數內的存取有效,即可視空間為整個副程式。
如:

procedure p1; //procedure及function皆為副程式
var i:interger;//i僅對函數內的存取有效
begin
...
end;


2. unit 內的變數 (不管在 interface 或 implementation區) ,其可視空間為整個 unit,如果變數或副程式定義於interface 區,則其他 unit 亦可存取(但須用uses去引用),若定義於 implementation 區則可視空間僅在該 unit 內。
如:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
j:integer; //屬於interface,其他 unit 亦可存取(但須用uses去引用)
implementation
{$R *.dfm}
var i:integer; //屬於implementation,其他unit不可存取。並記得在此的變數要定義在最前(副程式前),如此副程式才能讀到此變數
end.


3. 同一個變數名稱不能在 interface 區宣告,但又在 implementation 區宣告。

4. 同一個副程式名稱,如果要其他程式單元可以引用,則須在 interface 有所宣告,否則只須在 implemention區宣告並定義實體的副程式內容。
如:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
procedure p1; //宣告
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure p1; //在implemetation定義的副程式要給別的unit使用,則要宣告在interface裡
begin
...
end;
end.


5. 變數的引用,以距離最近為存取原則,若相同的變數,函數內有定義,則存取函數內之值,若無,存取 class內所定義之值,若 class內無此變數,則存取該 unit 內之變數,若該 unit 內無此變數,則可存取所引用的其他單元之變數值,如果引用的許多的單元中,皆有定義此變數,則以先引用的單元為主。
如:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
i : integer; //第二優先讀取Form(class)
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
i : integer; //第三優先讀取interface(因與implementation宣告的變數不能相同)
implementation

{$R *.dfm}
var i : integer; //第三優先讀取unit(因與imterface宣告的變數不能相同)

procedure TForm1.Button1Click(Sender: TObject);
var i : integer; //第一優先讀取副程式
begin
...
end;



6. 定義於 class 內的變數及副程式,除了受到位於 interface 區或 implemenatation 區的影響外,仍須受到 class 封裝特性 public,private,protected,published 的規範。
public --- 不管同一單元或不同單元皆可存取,只要有引用皆可存取。
private --- 僅限於同一單元的可以存取,此點與 C++不同,在 C++ 中 private 的存取須同一個 class。
protected --- 僅限於繼承父類別的子子孫孫,方可以存取,不限制是否在同一個單元。
published --- 除了具有 Runtime Type Information (RTTI)的功能外,與 public 的功能完全相同。
如:

type
TForm1 = class(TForm)
private
i : integer;
{ Private declarations }
public
j : integer; //別的unit,有use到就可以讀到
{ Public declarations }
end;

沒有留言: