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

{$IF}運用問題~~煩請高手解惑~~謝謝

答題得分者是:暗黑破壞神
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-02 18:06:13 IP:59.115.xxx.xxx 訂閱
private
{ Private declarations }
public
{ Public declarations }

end;

const i = 1 ; //This is condition flag #Can't use dynamic datatype
var
loginfrm: Tloginfrm;
//User definition component
{$IF i>0}
{$DEFINE OLENMODE}
{$IFEND}

{$IfDef OLENMODE}
ItemQuery: TClientDataSet;
PassQuery: TClientDataSet;
{$Else}
ItemQuery: TAdoQuery;
PassQuery: TAdoQuery;
{$EndIf}


implementation
{$R *.dfm}


各位先進您好~~
上述程式碼是小弟想在宣告全域物件時~~
判別連線種類~~再予以宣告物件類型
但在 {$IF i>0} 判別無法取得動態型別,如 boolean 或 int 等型別
因此無法達到動態生成物件的方法~~
不知各位先進可否給小弟一些意見或解答~~謝謝

------
sheng
編輯記錄
shengbao 重新編輯於 2007-08-02 18:08:38, 註解 無‧
shengbao 重新編輯於 2007-08-05 00:01:36, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-03 02:43:09 IP:61.64.xxx.xxx 訂閱
你太執著於「動態生成」字面上的意義
由你的程式碼看來,並無「動態」的能力,於編譯時期就會決定使用哪種方式,並編成固定的程式碼
如此,何來動態?
如過你想要程式能夠在不同處理方式間切換,你必須要有控制方式,如參數與判斷式,並於是當位置分割你的作業流程,切換處理方式


===================引 用 shengbao 文 章===================
private
{ Private declarations }
public
{ Public declarations }

end;

const i = 1 ; //This is condition flag #Can't use dynanic datatype
var
loginfrm: Tloginfrm;
//User definition component
{$IF i>0}
{$DEFINE OLENMODE}
{$IFEND}

{$IfDef OLENMODE}
ItemQuery: TClientDataSet;
PassQuery: TClientDataSet;
{$Else}
ItemQuery: TAdoQuery;
PassQuery: TAdoQuery;
{$EndIf}


implementation
{$R *.dfm}


各位先進您好~~
上述程式碼是小弟想在宣告全域物件時~~
判別連線種類~~再予以宣告物件類型
但在 {$IF i>0} 判別無法取得動態型別,如 boolean 或 int 等型別
因此無法達到動態生成物件的方法~~
不知各位先進可否給小弟一些意見或解答~~謝謝

Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-03 18:08:41 IP:211.22.xxx.xxx 未訂閱
誠如 syntax 前輩說的,條件式編譯跟動態產生物件沒有絕對的關係!據我瞭解條件式編譯比較常運用在「偵錯」、「跨平台或Compiler程式碼型態宣告轉換」等,你所述的情形以一般的條件句即可達到目的,何必自找麻煩呢?
===================引 用 syntax 文 章===================
你太執著於「動態生成」字面上的意義
由你的程式碼看來,並無「動態」的能力,於編譯時期就會決定使用哪種方式,並編成固定的程式碼
如此,何來動態?
如過你想要程式能夠在不同處理方式間切換,你必須要有控制方式,如參數與判斷式,並於是當位置分割你的作業流程,切換處理方式
編輯記錄
Stallion 重新編輯於 2007-08-03 23:47:28, 註解 無‧
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-05 00:01:06 IP:59.121.xxx.xxx 訂閱
Maybe 我的敘述並不是很清楚~~
我想做的事做編譯時判別const i = 1 這值時
不希望只是const型別(常數)~而是希望有其它方式判別 {$IF} 裡的參數值
而Dynamic DataType~~只是希望做到切換的意思~~
或許我所謂的動態生成與你們的不一樣~~
ItemQuery,ListQuery 這兩個Query 不是動態宣告嗎?
而生成(Create(self))要在FormCreate 裡實作
不知高手你所謂的動態生成為何?


{$IfDef OLENMODE}
ItemQuery: TClientDataSet;
ListQuery: TClientDataSet;
{$Else}
ItemQuery: TADOQuery;
ListQuery: TADOQuery;
{$EndIf}
------
sheng
編輯記錄
shengbao 重新編輯於 2007-08-07 03:21:44, 註解 無‧
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-05 01:14:31 IP:211.22.xxx.xxx 未訂閱
抱歉~你的需求無法達到!Online Help已經告訴你了。詳細請按F1看線上說明。
Type Conditional compilation
Syntax {$IF expression}
Remarks
Compiles the Delphi source code that follows it if expression is true. expression must conform to Delphi syntax and return a Boolean value; it may contain declared constants, constant expressions, and the functions Defined and Declared.
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-05 09:53:28 IP:61.225.xxx.xxx 未訂閱
先說明一下,我對 Pascal 不熟。
但是我看了你的問題。
我想反問你幾件事。
1.你認為你所編譯出來的 exe 檔案中,是不是因為你的 OLENMODE 是否有定義,而 ItemQuery 為 TClientDataSet 或 TAdoQuery 而不同?
在我看是這樣。而且,在一個 exe 中,它們並不會”並存”也就是說,你是前者的程式碼進入 exe 還是後者。
並無法在你程式執行期去更改,所謂的更改是說原設定為 TClientDataSet 不會變 TAdoQuery。
因為它長成怎樣是在 compiler 期就已經決定了。
2.如果你要的結果是1所說的。
那你直接定義 OLENMODE 就好了。何必要搞個 const i 來做判斷?
這不是脫褲子放屁,多此一舉嗎?
===================引 用 shengbao 文 章===================
const i = 1 ; //This is condition flag #Can't use dynamic datatype
{$IF i>0}
{$DEFINE OLENMODE}
{$IFEND}

{$IfDef OLENMODE}
ItemQuery: TClientDataSet;
PassQuery: TClientDataSet;
{$Else}
ItemQuery: TAdoQuery;
PassQuery: TAdoQuery;
{$EndIf}

syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-05 16:57:33 IP:61.64.xxx.xxx 訂閱
動態生成,不是高手說怎樣就怎樣

動態生成,是指在程式運作時,動態建立在記憶體中的物件,這樣你還聽不懂的話
建議你去看書,補充一點,本來就應該要知道的基本知識與基本用語
不然說在多,你都不會懂,最後會變成幫你從頭上課上到尾,這大概需要半年吧!

從頭教到尾,與點出問題點、給意見,是不一樣的,也不是網路論壇的功能之一

那這樣,先繳學費來吧!


===================引 用 shengbao 文 章===================
Maybe 我的敘述並不是很清楚~~
我想做的事做邊一時判別const i = 1 這值時
不希望只是const型別(常數)~而是希望有其它方式判別 {$IF} 裡的參數值
而Dynamic DataType~~只是希望做到切換的意思~~
或許我所謂的動態生成與你們的不一樣~~
ItemQuery,ListQuery這兩個Query 不是動態宣告嗎?
而生成(Create(self))要在FormCreate 裡實作
不知高手你所謂的動態生成為何?


{$IfDef OLENMODE}
ItemQuery: TClientDataSet;
ListQuery: TClientDataSet;
{$Else}
ItemQuery: TADOQuery;
ListQuery: TADOQuery;
{$EndIf}
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-07 00:22:55 IP:61.216.xxx.xxx 訂閱
或許是你不懂我的問題或是在裝傻~~
我當然知道動態生成的意思~~不然我宣告這兩Query幹麻~~
Maybe你可能不知道他在幹麻還在裝懂~~
並非筆戰~~只是告訴你~~我自稱小弟並非我是Delphi是新手~
對於Stallion 所回覆的Help文件我已看過~~也感謝你的提醒~~
這就是我在發文的原因~~就是希望有高手有其他方法解決~~
Const = 1;
正是我要克服的問題~~所以我才要在這發問是否有其它方式解決~~
不要用 Const 參數~~希望各位回答時看清楚發問人的問題在回覆~~
在提醒一下那兩個Query 在Form Create 時決定是用哪一種Component~
而他在程式裡都是用同樣的名稱~~而Function 是overload 運作~~
給那些自以為是高手的一句話~~學學外國人回覆文章的動機與方式~~
不要以為自己是高手姿態放這麼高~~看的懂人家問題在回答~~會比較好~~因為我直覺你根本不知道我在問什麼~~
回看文章~~你回答的話根本是屁話~~
看了以下的EX程式碼你就會知道~~其實它可以參考外部資訊在做Compiler 時期判別類型~

所以假設我在登錄檔設定一Value~~為 1 時程式為Online Mode
設為0 時他為 Local Mode
Const = 1; 改為 If(i>0) then Define OLENMODE; 方式
這才是問題核心~~
或許有人不知道~~程式在建置安裝時可以用ReCompiler 程式安裝~~
安裝後再把程式碼刪除~~留下EXE或DLL檔~~
資深會員不代表你就是真正的高手~~也許是你問題與廢話特別多才成為資深會員吧~!!
最後一句~~回復前先看懂問題點~~再做回應~~
而不是一昧只為了發言而發言~~這樣反而會相形見拙~~共勉之

EX:
$IFDEF VER120} // Delphi 4.0
{$DEFINE Delphi4}
{$ENDIF}

{$IFDEF VER130} // Delphi 5.0
{$DEFINE Delphi4}
{$DEFINE Delphi5}
{$ENDIF}

{$IFDEF VER140} // Delphi 6.0
{$DEFINE Delphi4}
{$DEFINE Delphi5}
{$DEFINE Delphi6}
{$WARN SYMBOL_PLATFORM OFF}
{$WARN UNIT_PLATFORM OFF}
{$ENDIF}

{$IFDEF VER150} // Delphi 7.0
{$DEFINE Delphi4}
{$DEFINE Delphi5}
{$DEFINE Delphi6}
{$DEFINE Delphi7}
{$WARN UNSAFE_CODE OFF}
{$WARN UNSAFE_TYPE OFF}
{$WARN UNSAFE_CAST OFF}
{$WARN SYMBOL_PLATFORM OFF}
{$WARN UNIT_PLATFORM OFF}
{$ENDIF}




===================引 用 syntax 文 章===================
動態生成,不是高手說怎樣就怎樣

動態生成,是指在程式運作時,動態建立在記憶體中的物件,這樣你還聽不懂的話
建議你去看書,補充一點,本來就應該要知道的基本知識與基本用語
不然說在多,你都不會懂,最後會變成幫你從頭上課上到尾,這大概需要半年吧!

從頭教到尾,與點出問題點、給意見,是不一樣的,也不是網路論壇的功能之一

那這樣,先繳學費來吧!


===================引 用 shengbao 文 章===================
Maybe 我的敘述並不是很清楚~~
我想做的事做邊一時判別const i = 1 這值時
不希望只是const型別(常數)~而是希望有其它方式判別 {$IF} 裡的參數值
而Dynamic DataType~~只是希望做到切換的意思~~
或許我所謂的動態生成與你們的不一樣~~
ItemQuery,ListQuery這兩個Query 不是動態宣告嗎?
而生成(Create(self))要在FormCreate 裡實作
不知高手你所謂的動態生成為何?


{$IfDef OLENMODE}
ItemQuery: TClientDataSet;
ListQuery: TClientDataSet;
{$Else}
ItemQuery: TADOQuery;
ListQuery: TADOQuery;
{$EndIf}

------
sheng
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-08-07 00:43:59 IP:211.22.xxx.xxx 未訂閱
shengbao兄,剛才又瞄了一下Help,注意看見這句話沒?it may contain declared constants, constant expressions, and the functions Defined and Declared.
在條件編譯裡面是可以呼叫一個已經宣告並定義過
傳回布林值的函數,那麼你的 i 值何不利用適時呼叫這個函數來改變 i 值後傳回給條件編譯呢?請參考~
===================引 用 shengbao 文 章===================
或許是你不懂我的問題或是在裝傻~~
我當然知道動態生成的意思~~不然我宣告這兩Query幹麻~~
Maybe你可能不知道他在幹麻還在裝懂~~
並非筆戰~~只是告訴你~~我自稱小弟並非我是Delphi是新手~
對於Stallion所回覆的Help文件我已看過~~也感謝你的提醒~~
這就是我在發文的原因~~就是希望有高手有其他方法解決~~
Const = 1;
正是我要克服的問題~~所以我才要在這發問是否有其它方式解決~~
不要用 Const 參數~~希望各位回答時看清楚發問人的問題在回覆~~
在提醒一下那兩個Query 在Form Create 時決定是用哪一種Component~
而他在程式裡都是用同樣的名稱~~而Function 是overload 運作~~
給那些自以為是高手的一句話~~學學外國人回覆文章的動機與方式~~
不要以為自己是高手姿態放這麼高~~看的懂人家問題在回答~~會比較好~~因為我直覺你根本不知道我在問什麼~~
回看文章~~你回答的話根本是屁話~~
看了以下的EX程式碼你就會知道~~其實它可以參考外部資訊在做Compiler 時期判別類型~

所以假設我在登錄檔設定一Value~~為 1 時程式為Online Mode
設為0 時他為 Local Mode
Const = 1; 改為 If(i>0) then Define OLENMODE; 方式
這才是問題核心~~
或許有人不知道~~程式在建置安裝時可以用ReCompiler 程式安裝~~
安裝後再把程式碼刪除~~留下EXE或DLL檔~~
資深會員不代表你就是真正的高手~~也許是你問題與廢話特別多才成為資深會員吧~!!
最後一句~~回復前先看懂問題點~~再做回應~~
而不是一昧只為了發言而發言~~這樣反而會相形見拙~~共勉之

EX:
$IFDEF VER120} // Delphi 4.0
{$DEFINE Delphi4}
{$ENDIF}

{$IFDEF VER130} // Delphi 5.0
{$DEFINE Delphi4}
{$DEFINE Delphi5}
{$ENDIF}

{$IFDEF VER140} // Delphi 6.0
{$DEFINE Delphi4}
{$DEFINE Delphi5}
{$DEFINE Delphi6}
{$WARN SYMBOL_PLATFORM OFF}
{$WARN UNIT_PLATFORM OFF}
{$ENDIF}

{$IFDEF VER150} // Delphi 7.0
{$DEFINE Delphi4}
{$DEFINE Delphi5}
{$DEFINE Delphi6}
{$DEFINE Delphi7}
{$WARN UNSAFE_CODE OFF}
{$WARN UNSAFE_TYPE OFF}
{$WARN UNSAFE_CAST OFF}
{$WARN SYMBOL_PLATFORM OFF}
{$WARN UNIT_PLATFORM OFF}
{$ENDIF}




===================引 用 syntax 文 章===================
動態生成,不是高手說怎樣就怎樣

動態生成,是指在程式運作時,動態建立在記憶體中的物件,這樣你還聽不懂的話
建議你去看書,補充一點,本來就應該要知道的基本知識與基本用語
不然說在多,你都不會懂,最後會變成幫你從頭上課上到尾,這大概需要半年吧!

從頭教到尾,與點出問題點、給意見,是不一樣的,也不是網路論壇的功能之一

那這樣,先繳學費來吧!


===================引 用 shengbao 文 章===================
Maybe 我的敘述並不是很清楚~~
我想做的事做邊一時判別const i = 1 這值時
不希望只是const型別(常數)~而是希望有其它方式判別 {$IF} 裡的參數值
而Dynamic DataType~~只是希望做到切換的意思~~
或許我所謂的動態生成與你們的不一樣~~
ItemQuery,ListQuery這兩個Query 不是動態宣告嗎?
而生成(Create(self))要在FormCreate 裡實作
不知高手你所謂的動態生成為何?


{$IfDef OLENMODE}
ItemQuery: TClientDataSet;
ListQuery: TClientDataSet;
{$Else}
ItemQuery: TADOQuery;
ListQuery: TADOQuery;
{$EndIf}

shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-08-07 03:19:49 IP:61.216.xxx.xxx 訂閱
很感謝Stallion 的建議~不過本文所述~~and the functions Defined and Declared ~~
我的解譯是~~他在內部函數所宣告的值來判別
like Event or procedure and function variable Declared!
如EX所示~~是可行的~~
但我現在所要做的是全域宣告判別
然而在Local variable 這兩個 Query 是無法建構(靜態)全域物件~但用動態生成它~~~
因為我是用Create(self) 實作元件而不是Create(nil)~~所謂靜態是指直到這個Form被Free 掉才消失~
但在Form 的Class 建構時期無法引用Object pascal Normal syntax
like if ..case..value assign 等等語法~~
除了Constant Declared~~(Const i = 1;)
所以才想Post 此文章~~是否有其他解決之道~~
在此感謝Stallion 版主的Support~~
如果還是無解的話~~本問題就在此打斷了~~謝謝

EX:
procedure Tloginfrm.FormCreate(Sender: TObject);
var
flag : boolean;
begin
flag := true;
if flag then {$DEFINE ONLINEMODE};
.................................................

end;
===================引 用 Stallion 文 章===================
shengbao兄,剛才又瞄了一下Help,注意看見這句話沒?it may contain declared constants, constant expressions, and the functions Defined and Declared.
在條件編譯裡面是可以呼叫一個已經宣告並定義過
傳回布林值的函數,那麼你的 i 值何不利用適時呼叫這個函數來改變 i 值後傳回給條件編譯呢?請參考~
------
sheng
編輯記錄
shengbao 重新編輯於 2007-08-07 03:25:35, 註解 無‧
shengbao 重新編輯於 2007-08-07 03:29:37, 註解 無‧
shengbao 重新編輯於 2007-08-08 17:35:52, 註解 無‧
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-08-07 08:45:00 IP:218.170.xxx.xxx 未訂閱
其實,你把編譯期跟執行期搞混了。
編譯期,你可以利用 ifdef, define.....等等來跟 compiler 說你要用那一段程式碼。
這就像你舉的例子,不同的 delphi 版本要做不同動作。
但是執行期的數值,在編譯期是完全無意義的。

當然你可以說當你改變了你的 const i 之後,你再重新編譯你的程式。
那這個動作就是在改變你編譯期的程式碼。

如果你想要做到你所想要做的動作。
我想,你不該在 {$IF} 這種編譯期的判斷來做事。

我再舉個很古老的例子。
有一個 class 老定義了”人”
人有一個 method 叫”工作”
男人、女人、小孩、學生、軍人。。。。都是人。
不過對於”工作”,會有不同的動作。
這個是怎麼實現的?
想一想,制定這個機制的人,已經想到你要做什麼,
也幫你想出怎麼做了。只是你並沒有用對方法而已。
Coffee
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-08-07 10:12:19 IP:220.130.xxx.xxx 訂閱
發言請注意措辭

===================引 用 shengbao 文 章===================
或許是你不懂我的問題或是在裝傻~~

給那些自以為是高手的一句話~~學學外國人回覆文章的動機與方式~~
不要以為自己是高手姿態放這麼高~~看的懂人家問題在回答~~會比較好~~因為我直覺你根本不知道我在問什麼~~

資深會員不代表你就是真正的高手~~也許是你問題與廢話特別多才成為資深會員吧~!!
最後一句~~回復前先看懂問題點~~再做回應~~
而不是一昧只為了發言而發言~~這樣反而會相形見拙~~共勉之

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


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-08-07 11:01:22 IP:210.66.xxx.xxx 訂閱
<textarea class="delphi" rows="10" cols="60" name="code"> 樓主將提問給打住了,是不錯的決定,免除無謂的筆戰, 可惜的是,沒有把握機會修正自己在程式開發上的觀念, 或者是否試著去評估回應者提供不同的做法. 就個人看法,其實幾位版大已經很明確的指出正確的觀 念與方向,而syntax兄的苦口婆心眾所皆知,十分在意論 壇的提問品質,學費之說只是戲謔性的講法. 雖然這次提問還不算'白爛',可是虛心受教的態度,嗯!還 有很大的進步空間,畢竟能夠求得回應已經不容易了. 幾位版大都是經驗豐富的 "熟手", 高手之稱都是別人加 封的,樓主不必過度排斥.我想幾位版大只是很直覺的嗅 出樓主在程式碼中的方向有點不妥,我指的不是說可不 可以work,而是變數宣告用這樣的做法,那麼後續在使用 這些變數,只是把簡單動作複雜化而已. 我猜樓主正在轉換開發工具,會去質疑缺乏某些好用或 是慣用的語法,我也曾經有過,C結構中的位元欄位宣告 就是其中一例.可是換個角度來看,多去學習使用工具提 供的優點,才能使情況變得更好,不是嗎? 宣告 var ItemQuery: TClientDataSet; PassQuery: TClientDataSet; 產生 case i of 0:begin ItemQuery := TClientDataSet.Create(a_owner); PassQuery := TClientDataSet.Create(a_owner); end; else begin ItemQuery := TAdoQuery.Create(a_owner); PassQuery := TAdoQuery.Create(a_owner); end; end; 釋放 FreeAndNil(ItemQuery ); FreeAndNil(PassQuery ) 使用 ItemQuery.[property_or_method_derived_from_TDataSet] TClientDataSet(ItemQuery.[property_or_method_specific_to_TClientDataSet] TAdoQuery(ItemQuery).[property_or_method_specific_to_TAdoQuery] 哈!我也把簡單回答複雜化了,以上謹供參考... </textarea>
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-08-07 15:01:35 IP:59.117.xxx.xxx 訂閱
感謝jow 的回覆~~
不過你的回覆並非我的問題核心~~
二來你的Code 直覺上就有錯~~
所以我幫你改了一下Code~您用強制轉換型別~~但這不是我想要的方式
因為我呼叫函式呼叫方法是
getdata(sqlstr,nil,ItemQuery); 採overload 作業
當用你方式後~~
getdata(sqlstr,nil,TAdoQuery(ItemQuery)); 這樣傳入之Query會變成全都是TAdoQuery Type
那就無法overload 的方法了~~因為實作時期只是強制轉換成TAdoQuery
因為您初期宣告這兩個Query為TClintDataSet~在這個 form 的 life cycle~~它的DataType 都還是TClientDataSet
原因他不能被覆寫~~而只是在case宣告那暫時形態轉換而已~

三來我並非要轉換開發工具~~(D6)
我初衷目的是在 registry 內判別是否有安裝 MS SQL Server
在安裝時期用ReCompiler 編譯程式安裝~~

四來 Syntax 他給我的感覺不是苦口婆心~~
他只是在賣弄姿態而已~~
主觀感覺~~他對我一點建樹都沒有~而是在落井下石~老黃賣瓜~那我何來感恩之心呢?
那我會在乎他功績為何呢?
再來問題是否白爛之說法~~在這論壇裡還有挑問題難易度回答嗎?
而我相信真的看懂我的問題之人~~也少有人在~~反到我會怎麼想呢?
並非筆戰~只是回答您的說法而已!!


宣告
var
ItemQuery: TClientDataSet;
PassQuery: TClientDataSet;

產生
case i of
0:begin
ItemQuery := TClientDataSet.Create(self);
PassQuery := TClientDataSet.Create(self);
end;
else begin
TAdoQuery(ItemQuery) := TAdoQuery.Create(self);
TAdoQuery(PassQuery) := TAdoQuery.Create(self);
end;
end;

釋放
FreeAndNil(ItemQuery );
FreeAndNil(PassQuery );

------
sheng
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-08-07 15:32:44 IP:59.117.xxx.xxx 訂閱
其實我並沒搞混~~而是你miss我一些關鍵字
我本來就是要在編譯時期取得外部資訊~~在做編譯
例如FastReport 這GUI~~
它在Compiler 初期~~它可訂定相關資訊~~
給這個ReCompiler 做編譯時期資訊~~
而那Const i = 1;把它假想為TeeChart Version~~
讓它變成動態宣告~~這就是我問題核心
您可以參考他的程式碼~~神奇的事如何Assign 給同樣的Source code~~(程式碼內沒有定義不同版本Code)
完全靠inc 檔內的資訊~~但他如何判別這個GUI 給他的資訊呢?這就是這GUI厲害的地方~~(GUI 內的資訊有如我判別 Registry 內的資料一樣)
希望您能更了解我的問題~~

===================引 用 暗黑破壞神 文 章===================
其實,你把編譯期跟執行期搞混了。
編譯期,你可以利用 ifdef, define.....等等來跟 compiler 說你要用那一段程式碼。
這就像你舉的例子,不同的 delphi 版本要做不同動作。
但是執行期的數值,在編譯期是完全無意義的。

當然你可以說當你改變了你的 const i 之後,你再重新編譯你的程式。
那這個動作就是在改變你編譯期的程式碼。

如果你想要做到你所想要做的動作。
我想,你不該在 {$IF} 這種編譯期的判斷來做事。

我再舉個很古老的例子。
有一個 class 老定義了”人”
人有一個 method 叫”工作”
男人、女人、小孩、學生、軍人。。。。都是人。
不過對於”工作”,會有不同的動作。
這個是怎麼實現的?
想一想,制定這個機制的人,已經想到你要做什麼,
也幫你想出怎麼做了。只是你並沒有用對方法而已。
------
sheng
jow
尊榮會員


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2007-08-07 15:54:43 IP:210.66.xxx.xxx 訂閱
謝謝指正,不過我覺得我錯誤的部分在以下的部分. <textarea class="delphi" rows="10" cols="60" name="code">宣告 var//copy過來後忘了改了!! ItemQuery: TDataSet; PassQuery: TDataSet; 使用 (1)ItemQuery.* //[property_or_method_derived_from_TDataSet] (2)TClientDataSet(ItemQuery).* //[property_or_method_specific_to_TClientDataSet] (3)TAdoQuery(ItemQuery).* //[property_or_method_specific_to_TAdoQuery] 通常我不會這樣寫: TAdoQuery(ItemQuery) := TAdoQuery.Create(self); TAdoQuery(PassQuery) := TAdoQuery.Create(self); 另外: self代表的是TLoginFrm嗎?如果你在這個class來產生物件, 習慣上也會在此class中釋放,那麼應該確保在使用這些TDataSet 的時候,TLoginFrm還存在著.所以我以a_owner來表示你應該慎選 這些TDataSet的Owner,這跟記憶體釋放很有關係. nil和Application都是可以考慮的選項. 還有: 如果是全域的靜態變數,其實你也可以在 initialization 中產生物件,而在 finalization 中來釋放. </textarea> 因為TClientDataSet, TADODataSet都繼承自TDataSet, 所以物件變數的宣告,只要向上選擇其某一層共同的Ancestor 來當作物件指標,在執行期間必要時再將其轉型成適當的物件型別, 例如你的getdata(),如果沒有用到TClientDataSet或TADODataSet 特別定義的屬性和方法,那麼你大可只用同一個getdata()來處理,而不 需要overload另外一個getdata(). 即使有用到特定物件的屬性和方法, 也能已適當的方法來處理. 最遠的,你大可將這些DataSet宣告成TObject,只是在使用繼承自 TDataSet的屬性時,另外還要加多一道手續,就是TDataSet(ItemQuery).* 見微知著,胡思亂想,以上純屬個人看法,僅供參考...
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#17 引用回覆 回覆 發表時間:2007-08-07 16:53:41 IP:218.170.xxx.xxx 未訂閱
你知道 bcc32  有個 -D 的參數嗎?
你知道 dcc32 也有個 -D 的參數嗎?
你知道它們代表的意義嗎?

可以請你說明一下。所謂的 Compiler 初期的意義。
ReCompiler 的意義?


===================引 用 shengbao 文 章===================
其實我並沒搞混~~而是你miss我一些關鍵字
我本來就是要在編譯時期取得外部資訊~~在做編譯
例如FastReport 這GUI~~
它在Compiler 初期~~它可訂定相關資訊~~
給這個ReCompiler 做編譯時期資訊~~
而那Const i = 1;把它假想為TeeChart Version~~
讓它變成動態宣告~~這就是我問題核心
您可以參考他的程式碼~~神奇的事如何Assign 給同樣的Source code~~(程式碼內沒有定義不同版本Code)
完全靠inc 檔內的資訊~~但他如何判別這個GUI 給他的資訊呢?這就是這GUI厲害的地方~~(GUI 內的資訊有如我判別 Registry 內的資料一樣)
希望您能更了解我的問題~~

===================引 用 暗黑破壞神 文 章===================
其實,你把編譯期跟執行期搞混了。
編譯期,你可以利用 ifdef, define.....等等來跟 compiler 說你要用那一段程式碼。
這就像你舉的例子,不同的 delphi 版本要做不同動作。
但是執行期的數值,在編譯期是完全無意義的。

當然你可以說當你改變了你的 const i 之後,你再重新編譯你的程式。
那這個動作就是在改變你編譯期的程式碼。

如果你想要做到你所想要做的動作。
我想,你不該在 {$IF} 這種編譯期的判斷來做事。

我再舉個很古老的例子。
有一個 class 老定義了”人”
人有一個 method 叫”工作”
男人、女人、小孩、學生、軍人。。。。都是人。
不過對於”工作”,會有不同的動作。
這個是怎麼實現的?
想一想,制定這個機制的人,已經想到你要做什麼,
也幫你想出怎麼做了。只是你並沒有用對方法而已。
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#18 引用回覆 回覆 發表時間:2007-08-07 17:53:17 IP:59.117.xxx.xxx 訂閱

===================引 用 暗黑破壞神 文 章===================
你知道 bcc32? 有個 -D 的參數嗎?-D defines 'name' as a null string,
or use -D= #訂正~~未使用過~~所以我並不知道~~

你知道 dcc32 也有個 -D 的參數嗎?-D = Define conditionals 定義條件~~但我要問的就是如何定義它跟引用它呢?
你知道它們代表的意義嗎? 上述~~
可以請你說明一下。所謂的 Compiler 初期的意義。 就是那個GUI~~在做編譯前~~可以下參數~在編譯期間~可以判斷用哪種Type~
ReCompiler 的意義? 它的意思是在說~~程式可多重編譯~~或是重新編譯的意思~~
這樣回答希望你能滿意~!

===================引 用 shengbao 文 章===================
其實我並沒搞混~~而是你miss我一些關鍵字
我本來就是要在編譯時期取得外部資訊~~在做編譯
例如FastReport 這GUI~~
它在Compiler 初期~~它可訂定相關資訊~~
給這個ReCompiler 做編譯時期資訊~~
而那Const i = 1;把它假想為TeeChart Version~~
讓它變成動態宣告~~這就是我問題核心
您可以參考他的程式碼~~神奇的事如何Assign 給同樣的Source code~~(程式碼內沒有定義不同版本Code)
完全靠inc 檔內的資訊~~但他如何判別這個GUI 給他的資訊呢?這就是這GUI厲害的地方~~(GUI 內的資訊有如我判別 Registry 內的資料一樣)
希望您能更了解我的問題~~

===================引 用 暗黑破壞神 文 章===================
其實,你把編譯期跟執行期搞混了。
編譯期,你可以利用 ifdef, define.....等等來跟 compiler 說你要用那一段程式碼。
這就像你舉的例子,不同的 delphi 版本要做不同動作。
但是執行期的數值,在編譯期是完全無意義的。

當然你可以說當你改變了你的 const i 之後,你再重新編譯你的程式。
那這個動作就是在改變你編譯期的程式碼。

如果你想要做到你所想要做的動作。
我想,你不該在 {$IF} 這種編譯期的判斷來做事。

我再舉個很古老的例子。
有一個 class 老定義了”人”
人有一個 method 叫”工作”
男人、女人、小孩、學生、軍人。。。。都是人。
不過對於”工作”,會有不同的動作。
這個是怎麼實現的?
想一想,制定這個機制的人,已經想到你要做什麼,
也幫你想出怎麼做了。只是你並沒有用對方法而已。
------
sheng
編輯記錄
shengbao 重新編輯於 2007-08-07 18:48:30, 註解 無‧
shengbao 重新編輯於 2007-08-07 18:50:26, 註解 無‧
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#19 引用回覆 回覆 發表時間:2007-08-07 18:20:41 IP:59.117.xxx.xxx 訂閱
其實這個 Loginfrm 也是動態生成的
所以我不必在 finalization 中來釋放.
因為它在form close 時~~會完全free 它的Memory
如下所示:
cardfrm:=nil; 讓他從程式轉成null 型態~相對的form 上的所有物件將會被 destroy
cardfrm.Free; 讓他從記憶體中釋放~~
Create(self) 是指這它包含在這個Form 的Class 裡
讓它可以在這Form 引用~~
如用application 或 nil 一個是沒必要給整個程式(專案)用二來是他本身為nil 入無法儲存資訊
而getdata 是overload 運作~~所以他本身是可以接受那兩種Query~
而為何要載入Query~~是因為連接參數會一併引用至getdata 函數中參考~
並從函數中運算完後帶回結果~~
也因此不能採用您的方法~~強制轉型方式~~

===================引 用 jow 文 章===================
謝謝指正,不過我覺得我錯誤的部分在以下的部分. <textarea class="delphi" rows="10" cols="60" name="code">宣告 var//copy過來後忘了改了!! ????ItemQuery: TDataSet; ????PassQuery: TDataSet; 使用 (1)ItemQuery.*???????????????? //[property_or_method_derived_from_TDataSet] (2)TClientDataSet(ItemQuery).* //[property_or_method_specific_to_TClientDataSet] (3)TAdoQuery(ItemQuery).*???? //[property_or_method_specific_to_TAdoQuery] 通常我不會這樣寫: TAdoQuery(ItemQuery) := TAdoQuery.Create(self); TAdoQuery(PassQuery) := TAdoQuery.Create(self); 另外: self代表的是TLoginFrm嗎?如果你在這個class來產生物件, 習慣上也會在此class中釋放,那麼應該確保在使用這些TDataSet 的時候,TLoginFrm還存在著.所以我以a_owner來表示你應該慎選 這些TDataSet的Owner,這跟記憶體釋放很有關係. nil和Application都是可以考慮的選項. 還有: 如果是全域的靜態變數,其實你也可以在 ????initialization 中產生物件,而在 ????finalization 中來釋放. </textarea> 因為TClientDataSet, TADODataSet都繼承自TDataSet, 所以物件變數的宣告,只要向上選擇其某一層共同的Ancestor 來當作物件指標,在執行期間必要時再將其轉型成適當的物件型別, 例如你的getdata(),如果沒有用到TClientDataSet或TADODataSet 特別定義的屬性和方法,那麼你大可只用同一個getdata()來處理,而不需要overload另外一個getdata(). 即使有用到特定物件的屬性和方法, 也能已適當的方法來處理. 最遠的,你大可將這些DataSet宣告成TObject,只是在使用繼承自 TDataSet的屬性時,另外還要加多一道手續,就是TDataSet(ItemQuery).* 見微知著,胡思亂想,以上純屬個人看法,僅供參考...
------
sheng
編輯記錄
shengbao 重新編輯於 2007-08-07 18:25:54, 註解 無‧
jow
尊榮會員


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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2007-08-07 21:45:31 IP:203.79.xxx.xxx 訂閱
不懂!

首先聲明此回應無意筆戰,只想釐清一些看法上的差異.

(1)請確定你是否已經從Project->Options->Forms中將
loginfrm移至available forms中?如果沒有,那麼你的loginfrm是
自動產生而非動態生成.

(2)如果你在loginfrm中產生這兩個TDataSet物件,那麼你如何在
不確定loginfrm存在下,如何正確引用這兩個TDataSet?

(3)如果你在loginfrm中產生這兩個TDataSet物件,而不在loginfrm中
作釋放的動作,那麼你是否找到適當的位置,在destroy loginfrm時,同
時釋放這兩個TDataSet? 當然, 如果loginfrm只生成一次,而且有適當
位置,在主程式結束前,有釋放的動作,那就沒問題.

(4)如果loginfrm只在使用時產生用畢後釋放,那麼在重複產生的過程
中,這兩個TDataSet也會被重複產生,(未在loginfrm中被釋放)那麼之
前產生的物件將會遺漏.(memory leak)

(5)在VCL中賦予Owner的任務主要是與記憶體的釋放有關,你認為呢?

(6)Delphi支援RTTI(runtime type information)的機制,我認為在相同的
參數型態下,透過"適當"的轉型,應該就能達到你的需求,而不需要使用
overload.

(7)沒有你所謂的~~強制轉型方式~~的問題,透過RTTI你就可以很清楚
地辨釋出參數傳入的物件型態,這個傳入的物件,其在記憶體中的內含,
與該物件在生成時叫用的型態有關.

(8)寫到這裡發現離題太遠,我們在VCL的觀念與認知上,似乎有不同的方向.

上述種種看法純屬個人見解,謹供參考,有誤勿怪...
編輯記錄
jow 重新編輯於 2007-08-07 21:46:25, 註解 無‧
jow 重新編輯於 2007-08-07 21:47:11, 註解 無‧
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#21 引用回覆 回覆 發表時間:2007-08-07 22:37:18 IP:218.170.xxx.xxx 未訂閱
我用 C 的寫法來說明好了
int a;
#ifdef OLD_VERSION
a = 100;
#else
a = 200;
#endif

以上的寫法你同意嗎?
如果同意,那在編譯時。這個 a 的值,就依你是否已經給了 OLD_VERSION 的定義而
會是 100 或是 200 了。在執行時。不會改變了。除非你在程式其它位置有改變它的值。

那我怎麼設定 OLD_VERSION 是否定義呢?
我可以用
#define OLD_VERSION
這一行在 #ifdef 之前。
(PS。這個動作必須更改程式碼)
我也可以在不更改任何的程式碼。而利用 bcc32 -DOLD_VERSION
這樣的動作來做編譯。它就跟我去程式碼中加入 #define OLD_VERSION 一樣。

所以你在程式中看到一堆的 #define, #ifdef..... 有時候必須利用它本身的專案(makefile)
來編譯。它才可以有正確的值。否則它會用 default value 下去編譯。

再看到你期望使用 const 的值來當判斷。
這個修飾詞並不是這樣用的。
const 只是跟 compiler 說它後面的值,無法被改變。
它之所以會產生是原本的用法是
#define PI 3.14

area = PI^2*R;
這樣的寫法。可是它會導致 compiler 的時候,在 phase I 的時候把 PI 置換成 3.14.
而變成 area = 3.14*R
所以當你的程式在編譯時有問題它會提出 error message, 時,它會出現的不會是 PI 這個字眼。
而導致會”殺嘸”錯誤點。(當然對於2-300行程式不會有問題。一眼就能找出來)
所以一開始會訂出 const 這樣的修詞來部份取代 #define 的功能。
因為你利用 const 時 compiler 還會有型別的檢查,這是 #define 不會有的
因為 #define PI 3.14 這樣的寫法。
你只能說 3.14 不是”整數”但你無法告訴 compiler 它是float, double.....etc (我不知道會不會有其它的型別的產生)
而 const 可以明確的告訴 compiler 它是那一種型別。

雖然 const 的修詞跟 #define 有些類似。都無法在執行期去修改它的內容。
不過它們有不同的意義。
const int i = 0;
#define i 0
這兩行。const i =0 在記憶體中,它確確實實的”佔有”一個 int 的空間。
而 #define i 0 並不會在記憶體中佔有任何的空間。

所以你要用
#ifdef (VERSION > 1)
#define ....
#endif
這是可行的
const i = 1;
#ifdef (VERSION > i)
#define ....
#endif
這是不可行的。
以上,如果有問題,指出問題,可以再討論。
===================引 用 shengbao 文 章===================

===================引 用 暗黑破壞神 文 章===================
你知道 bcc32? 有個 -D 的參數嗎?-D defines 'name' as a null string,
or use -D= #訂正~~未使用過~~所以我並不知道~~

你知道 dcc32 也有個 -D 的參數嗎?-D = Define conditionals 定義條件~~但我要問的就是如何定義它跟引用它呢?
你知道它們代表的意義嗎? 上述~~
可以請你說明一下。所謂的 Compiler 初期的意義。 就是那個GUI~~在做編譯前~~可以下參數~在編譯期間~可以判斷用哪種Type~
ReCompiler 的意義?它的意思是在說~~程式可多重編譯~~或是重新編譯的意思~~
這樣回答希望你能滿意~!

===================引 用 shengbao 文 章===================
其實我並沒搞混~~而是你miss我一些關鍵字
我本來就是要在編譯時期取得外部資訊~~在做編譯
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#22 引用回覆 回覆 發表時間:2007-08-08 10:50:16 IP:125.224.xxx.xxx 訂閱

===================引 用 jow 文 章===================
不懂!

首先聲明此回應無意筆戰,只想釐清一些看法上的差異.

(1)請確定你是否已經從Project->Options->Forms中將
loginfrm移至available forms中?如果沒有,那麼你的loginfrm是
自動產生而非動態生成.A. available forms

(2)如果你在loginfrm中產生這兩個TDataSet物件,那麼你如何在
不確定loginfrm存在下,如何正確引用這兩個TDataSet?? A. {$IFDEF}

(3)如果你在loginfrm中產生這兩個TDataSet物件,而不在loginfrm中
作釋放的動作,那麼你是否找到適當的位置,在destroy loginfrm時,同
時釋放這兩個TDataSet? 當然, 如果loginfrm只生成一次,而且有適當
位置,在主程式結束前,有釋放的動作,那就沒問題.
A loginfrm:=nil;
loginfrm.Free;

(4)如果loginfrm只在使用時產生用畢後釋放,那麼在重複產生的過程
中,這兩個TDataSet也會被重複產生,(未在loginfrm中被釋放)那麼之
前產生的物件將會遺漏.(memory leak) A. 不會~~他會一併清除self (form class)上所有物件~~所以我才Create(self) ~

(5)在VCL中賦予Owner的任務主要是與記憶體的釋放有關,你認為呢?
A . Owner 為此物件所有人.有階段之別~~ Application 為程式主體它是最大的其次為form 也稱unit and self(form class)
它有自己的獨立空間~~不與其他unit 衝突~EX: 我可以在其他form 上也可以宣告同名物件或變數~~所以記憶體釋放語法在於
系統本身(設計)
然而Application 是程式主體 ~當他被Shutdown ~~釋放記憶體是OS 的工作

(6)Delphi支援RTTI(runtime type information)的機制,我認為在相同的
參數型態下,透過"適當"的轉型,應該就能達到你的需求,而不需要使用
overload
.A .但轉換機制可適用於小型專案~~大型專案因維護問題與相關資訊統一問題
可能不適用強制轉換方式.overload 好處為程式碼一樣~只在function 端作自動切換
有助於維護等工作。如用強制轉換~~每個unit 內都要做此動作~~一錯就全部都要改~~


(7)沒有你所謂的~~強制轉型方式~~的問題,透過RTTI你就可以很清楚
地辨釋出參數傳入的物件型態,這個傳入的物件,其在記憶體中的內含,
與該物件在生成時叫用的型態有關.
A. 強制轉換我沿用 C 的名詞 Casting ~
但他在宣告時期也有關~~
你可以試試我幫你改的code ~用Casting 過的 Query 傳入 TADOQuery 的function 內
除非你再一次Casting 它~~如getdata(sqlstr,nil,TADOQuery(ItemQuery))
否則它是不被接受的。因為它的原型還是TClintDataSet ~~就算你改為TDataSet 也是一樣。

(8)寫到這裡發現離題太遠,我們在VCL的觀念與認知上,似乎有不同的方向.
沒關係~~有問題就問~~大家切磋無訪。

上述種種看法純屬個人見解,謹供參考,有誤勿怪...
------
sheng
編輯記錄
shengbao 重新編輯於 2007-08-08 11:29:04, 註解 無‧
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#23 引用回覆 回覆 發表時間:2007-08-08 11:08:35 IP:125.224.xxx.xxx 訂閱
##回覆我加入本文內~~
===================引 用 暗黑破壞神 文 章===================
我用 C 的寫法來說明好了
int a;
#ifdef?? OLD_VERSION
a = 100;
#else
a = 200;
#endif

以上的寫法你同意嗎?A. 這裡我相當同意!
如果同意,那在編譯時。這個 a 的值,就依你是否已經給了 OLD_VERSION 的定義而
會是 100 或是 200 了。在執行時。不會改變了。除非你在程式其它位置有改變它的值。

那我怎麼設定 OLD_VERSION 是否定義呢?
我可以用
#define?? OLD_VERSION
這一行在 #ifdef 之前。
(PS。這個動作必須更改程式碼)

///*********************下列這幾句話就是我要的答案了************************************
希望Delphi 也是用一樣的方法給他參數~~那因該就沒問題了~~
我也可以在不更改任何的程式碼。而利用 bcc32 -DOLD_VERSION #define?? OLD_VERSION
這樣的動作來做編譯。它就跟我去程式碼中加入 #define OLD_VERSION 一樣。


所以你在程式中看到一堆的 #define, #ifdef..... 有時候必須利用它本身的專案(makefile)
來編譯。它才可以有正確的值。否則它會用 default value 下去編譯。

再看到你期望使用 const? 的值來當判斷。
這個修飾詞並不是這樣用的。
const 只是跟 compiler 說它後面的值,無法被改變。
它之所以會產生是原本的用法是
#define PI?? 3.14

area = PI^2*R;
?這樣的寫法。可是它會導致 compiler 的時候,在 phase I 的時候把 PI 置換成 3.14.
而變成 area = 3.14*R
所以當你的程式在編譯時有問題它會提出 error message, 時,它會出現的不會是 PI 這個字眼。
而導致會”殺嘸”錯誤點。(當然對於2-300行程式不會有問題。一眼就能找出來)
所以一開始會訂出 const 這樣的修詞來部份取代 #define 的功能。
因為你利用 const 時 compiler 還會有型別的檢查,這是 #define 不會有的
因為 #define PI?? 3.14 這樣的寫法。
你只能說 3.14 不是”整數”但你無法告訴 compiler 它是float, double.....etc (我不知道會不會有其它的型別的產生)
而 const 可以明確的告訴 compiler 它是那一種型別。

雖然 const 的修詞跟 #define 有些類似。都無法在執行期去修改它的內容。
不過它們有不同的意義。
const int i = 0;
#define?? i?? 0
這兩行。const i =0 在記憶體中,它確確實實的”佔有”一個 int 的空間。
而 #define?? i?? 0 並不會在記憶體中佔有任何的空間。

A.會用 const = 1; 是因為我不知道如何從Compiler 初期下參數給它~
所以用此方法做一個Flag ~~有如您所說的 bcc32 -DOLD_VERSION #define?? OLD_VERSION
下這個#define OLD_VERSION 一樣~~
再此非常感謝給我這個資訊~~謝謝

所以你要用
#ifdef (VERSION > 1)
#define?? ....
#endif
這是可行的
const i = 1;
#ifdef?? (VERSION > i)
#define?? ....
#endif
這是不可行的。
以上,如果有問題,指出問題,可以再討論。
===================引 用 shengbao 文 章===================

===================引 用 暗黑破壞神 文 章===================
你知道 bcc32? 有個 -D 的參數嗎?-D defines 'name' as a null string,
or use -D= #訂正~~未使用過~~所以我並不知道~~

你知道 dcc32 也有個 -D 的參數嗎?-D = Define conditionals 定義條件~~但我要問的就是如何定義它跟引用它呢?
你知道它們代表的意義嗎? 上述~~
可以請你說明一下。所謂的 Compiler 初期的意義。 就是那個GUI~~在做編譯前~~可以下參數~在編譯期間~可以判斷用哪種Type~
ReCompiler 的意義?它的意思是在說~~程式可多重編譯~~或是重新編譯的意思~~
這樣回答希望你能滿意~!

===================引 用 shengbao 文 章===================
其實我並沒搞混~~而是你miss我一些關鍵字
我本來就是要在編譯時期取得外部資訊~~在做編譯
------
sheng
編輯記錄
shengbao 重新編輯於 2007-08-08 11:17:44, 註解 無‧
shengbao 重新編輯於 2007-08-08 17:28:51, 註解 無‧
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#24 引用回覆 回覆 發表時間:2007-08-08 12:03:37 IP:211.77.xxx.xxx 未訂閱
delphi 也有這個功能。
我不是問你了嗎?
bcc32 -D
另一個是什麼?dXX32 -D
它的 compiler 有提供這個功能。所以你要做的是去它的 IDE 把這個功能找出來。看是在那邊設定的。
我手頭沒有安裝 delphi 沒辦法跟你說要去那邊做。
不過可以確定你可以用
#define VERSION 100
而不能用
const int version = 100;
來做 #if ...... 的判斷。
這樣應該有解決你的疑問了吧。

===================引 用 shengbao 文 章===================
///*********************下列這幾句話就是我要的答案了************************************
希望Delphi 也是用一樣的方法給他參數~~那因該就沒問題了~~
我也可以在不更改任何的程式碼。而利用 bcc32 -DOLD_VERSION #define?? OLD_VERSION
這樣的動作來做編譯。它就跟我去程式碼中加入 #define OLD_VERSION 一樣。
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#25 引用回覆 回覆 發表時間:2007-08-08 14:26:58 IP:125.224.xxx.xxx 訂閱
我了解你的意思~~
所以一早我再找IDE 是否有這功能可以設定~如你所說
再請教~~BCB的 IDE 可否作這樣的設定?
也許設定上跟Delphi 差不多~
const 我已經改了~~就差導入 {$DEFINE ONLINEMODE) 這個Condition~~
再一次謝謝您的建議~~

PS:我按了結案按鈕~卻無法執行結案動作~希望版主能check 一下~~

==================引 用 暗黑破壞神 文 章===================
delphi 也有這個功能。
我不是問你了嗎?
bcc32 -D
另一個是什麼?dXX32 -D
它的 compiler 有提供這個功能。所以你要做的是去它的 IDE 把這個功能找出來。看是在那邊設定的。
我手頭沒有安裝 delphi 沒辦法跟你說要去那邊做。
不過可以確定你可以用
#define VERSION 100
而不能用
const int version = 100;
來做 #if ...... 的判斷。
這樣應該有解決你的疑問了吧。

===================引 用 shengbao 文 章===================
///*********************下列這幾句話就是我要的答案了************************************
希望Delphi 也是用一樣的方法給他參數~~那因該就沒問題了~~
我也可以在不更改任何的程式碼。而利用 bcc32 -DOLD_VERSION #define?? OLD_VERSION
這樣的動作來做編譯。它就跟我去程式碼中加入 #define OLD_VERSION 一樣。
------
sheng
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#26 引用回覆 回覆 發表時間:2007-08-08 14:29:53 IP:211.22.xxx.xxx 未訂閱
結案按鈕旁有個LISTBOX選擇答題得分的人後按結案。
shengbao
一般會員


發表:6
回覆:15
積分:4
註冊:2002-11-16

發送簡訊給我
#27 引用回覆 回覆 發表時間:2007-08-08 17:27:51 IP:125.224.xxx.xxx 訂閱
謝謝~~
===================引 用 Stallion 文 章===================
結案按鈕旁有個LISTBOX選擇答題得分的人後按結案。
------
sheng
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#28 引用回覆 回覆 發表時間:2007-08-09 14:01:25 IP:61.64.xxx.xxx 訂閱
嘻嘻!要是你中文好一點,多打一點字說明,把問題一開始問清楚就不需繞一個大彎才得到答案:條件式編譯的用法
還是 暗黑破壞神 老大有耐心

不過這樣,跟動態建立物件,就完全沒有關係


===================引 用 shengbao 文 章===================
略~~

///*********************下列這幾句話就是我要的答案了************************************
希望Delphi 也是用一樣的方法給他參數~~那因該就沒問題了~~
我也可以在不更改任何的程式碼。而利用 bcc32 -DOLD_VERSION #define?? OLD_VERSION
這樣的動作來做編譯。它就跟我去程式碼中加入 #define OLD_VERSION 一樣。


===================引 用 shengbao 文 章===================
其實我並沒搞混~~而是你miss我一些關鍵字
我本來就是要在編譯時期取得外部資訊~~在做編譯

------
別看我,我不是高手
系統時間:2024-04-19 2:24:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!