全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:6004
推到 Plurk!
推到 Facebook!

為何物件沒建立,也可以使用它的方法?

 
stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-07-12 14:03:09 IP:60.50.xxx.xxx 訂閱
小弟做一個單元,內含一個class,class裡有兩個方法:


[code delphi]
unit A;

type
TA = class(TObject)
public
procedure A;
procedure B;
end;

var
A: TA;
implementation

procedure TA.A;
begin
...
end;

procedure TA.B;
begin
...
end;
[/code]

然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。
有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。


P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-07-12 21:16:21 IP:220.136.xxx.xxx 未訂閱
我不做原理的說明, 只做實作的說明
unit 是一支pas, pas之間互相引用, b uses a, 其實編譯時 b已經把 a 包進來了, 所以沒有建立的問題,
就好像 你直接開一支 form1.pas, 看看檔頭 uses 的那些, form, widows, graphics, ..
那一支你有create過, 還不是照樣編釋通過, 還可以運作!
這只是很單純兩支 pas 引用問題, 在 a.pas中, 如果有呼叫到一些物件而沒有進行 create,
那 b 去引用 a, 一樣會發生錯誤 (Access Error xxxxx)
===================引 用 stacker_liew 文 章===================
小弟做一個單元,內含一個class,class裡有兩個方法:


[code delphi]
unit A;

type
TA = class(TObject)
public
procedure A;
procedure B;
end;

var
A: TA;
implementation

procedure TA.A;
begin
...
end;

procedure TA.B;
begin
...
end;
[/code]

然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。
有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。


leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-07-13 00:19:41 IP:111.240.xxx.xxx 訂閱
顆顆 ~~請容我做出一些說明
原本 就是有分Class Method 和 Object Method
舉個簡單的例子
TA = class( class procedure A; class procedure A1; //Object Method
end;

{ TA }
class procedure TA.A;
begin
Showmessage(Self.Name); //正確
end;
procedure TA.B;
begin
Showmessage(Self.Name); 所以不是編譯都會過 如果你不想建實體 (instance)
嚴謹一點應該要用Class Method

全部都定義成 Object Methods ,是比較從簡的做法


===================引 用 P.D. 文 章===================
我不做原理的說明, 只做實作的說明
unit 是一支pas, pas之間互相引用, b uses a, 其實編譯時 b已經把 a 包進來了, 所以沒有建立的問題,
就好像 你直接開一支 form1.pas, 看看檔頭 uses 的那些, form, widows, graphics, ..
那一支你有create過, 還不是照樣編釋通過, 還可以運作!
這只是很單純兩支 pas 引用問題, 在 a.pas中, 如果有呼叫到一些物件而沒有進行 create,
那 b 去引用 a, 一樣會發生錯誤 (Access Error xxxxx)
===================引 用 stacker_liew 文 章===================
小弟做一個單元,內含一個class,class裡有兩個方法:


[code delphi]
unit A;

type
TA = class(TObject)
public
procedure A;
procedure B;
end;

var
A: TA;
implementation

procedure TA.A;
begin
...
end;

procedure TA.B;
begin
...
end;
[/code]

然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。
有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。


carstyc
資深會員


發表:16
回覆:254
積分:329
註冊:2003-07-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-07-13 01:06:43 IP:219.84.xxx.xxx 訂閱
講簡單一點的話就是...

如果Procedure 裡面完全沒有參考使用到 class 裡面的變數,基本上編譯不會出錯。

如果有用到變數,那就class就必需要有 Instance 才可以.....

在沒有建立Instance 的狀況下使用procedure的話...編譯就會報錯....

===================引 用 stacker_liew 文 章===================
小弟做一個單元,內含一個class,class裡有兩個方法:


[code delphi]
unit A;

type
TA = class(TObject)
public
procedure A;
procedure B;
end;

var
A: TA;
implementation

procedure TA.A;
begin
...
end;

procedure TA.B;
begin
...
end;
[/code]

然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。
有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。


Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-07-13 10:44:39 IP:220.130.xxx.xxx 訂閱
remove 

var A: TA;

and you should get compilation error....:P

When you call 'A', it means variable 'A' but not unit 'A', that's why you can compile and run without any error.
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2012-07-13 13:13:41 IP:118.165.xxx.xxx 訂閱
都不會出錯
Class Procedure 才是你說的這樣
===================引 用 carstyc 文 章===================
講簡單一點的話就是...

如果Procedure 裡面完全沒有參考使用到 class 裡面的變數,基本上編譯不會出錯。

如果有用到變數,那就class就必需要有 Instance 才可以.....

在沒有建立Instance 的狀況下使用procedure的話...編譯就會報錯....

===================引 用 stacker_liew 文 章===================
小弟做一個單元,內含一個class,class裡有兩個方法:


[code delphi]
unit A;

type
TA = class(TObject)
public
procedure A;
procedure B;
end;

var
A: TA;
implementation

procedure TA.A;
begin
...
end;

procedure TA.B;
begin
...
end;
[/code]

然後我在別的單元裡加入單元A,但奇怪的是,我竟然可以不必建立A,就可以直接使用裡面的兩個方法,編譯器也不會報錯。
有沒有大大可以解釋一下是什麼原因嗎?這應該是觀念上的問題吧。


stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2012-07-13 13:47:40 IP:60.50.xxx.xxx 訂閱
那是不是var A: TA;就具有instance的作用了嗎?然後我們都可以不必再去處理建立/解除instance的工作?

===================引 用 Coffee 文 章===================
remove

var A: TA;

and you should get compilation error....:P

When you call 'A', it means variable 'A' but not unit 'A', that's why you can compile and run without any error.


leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2012-07-13 14:00:16 IP:118.165.xxx.xxx 訂閱
前幾篇都沒在看   XD~
如果不參考Class中的變數 就是如同你講的
不必再去處理建立/解除instance

===================引 用 stacker_liew 文 章===================
那是不是var A: TA;就具有instance的作用了嗎?然後我們都可以不必再去處理建立/解除instance的工作?

===================引 用 Coffee 文 章===================
remove

var A: TA;

and you should get compilation error....:P

When you call 'A', it means variable 'A' but not unit 'A', that's why you can compile and run without any error.


stacker_liew
中階會員


發表:59
回覆:168
積分:65
註冊:2004-05-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2012-07-14 13:06:35 IP:60.50.xxx.xxx 訂閱
那是不是在沒用到Class Method的情況下,最保險的方法,就是自己處理建構/解除Instance的工作?

例如在別的單元使用A時:


[code delphi]
implementation
use A;

procedure BOnClick(Sender: TObject);
begin
A := TA.Create;
try
with A do
begin
A;
B;
end;
finally
A.Free;
end;
end;

[/code]

ANDY8C
資深會員


發表:114
回覆:582
積分:299
註冊:2006-10-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-07-16 02:33:09 IP:210.66.xxx.xxx 未訂閱

我都傻傻的用,不知原因....現在有點清楚了, PD 與 leveon 的簡單講解,很實用!!.


謝謝您


===================引 用 leveon 文 章===================
前幾篇都沒在看 XD~
如果不參考Class中的變數 就是如同你講的
不必再去處理建立/解除instance


------
---------------------------------------
偶爾才來 KTOP ,交流條碼問題,在 FB [條碼標籤達人] 社團留言,感恩.
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2012-07-16 10:51:30 IP:220.130.xxx.xxx 訂閱
If you dunno what delphi define it, STFM is your good friend.
And, there's a hint for how delphi use a unit scope variable, please take a look on how delphi control the "Auto-create Form" and check the source code, it's a nice trick.


===================引 用 stacker_liew 文 章===================
那是不是在沒用到Class Method的情況下,最保險的方法,就是自己處理建構/解除Instance的工作?

例如在別的單元使用A時:


[code delphi]
implementation
use A;

procedure BOnClick(Sender: TObject);
begin
A := TA.Create;
try
with A do
begin
A;
B;
end;
finally
A.Free;
end;
end;

[/code]

------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2013-05-21 15:41:35 IP:220.128.xxx.xxx 未訂閱
半年多之前的文章,好像沒看到解答,應該是很簡單的問題,因為新增單元後,Form 被加入到自動建立的名單裡,從 Project -> Forms 裡會看到,所以呼叫 A.程序名稱(),當然可以執行,因為 A Form 在主 Form 顯示前已自動建立了。
系統時間:2024-04-26 13:56:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!