{$IF}運用問題~~煩請高手解惑~~謝謝 |
答題得分者是:暗黑破壞神
|
shengbao
一般會員 發表:6 回覆:15 積分:4 註冊:2002-11-16 發送簡訊給我 |
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 |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
你太執著於「動態生成」字面上的意義
由你的程式碼看來,並無「動態」的能力,於編譯時期就會決定使用哪種方式,並編成固定的程式碼 如此,何來動態? 如過你想要程式能夠在不同處理方式間切換,你必須要有控制方式,如參數與判斷式,並於是當位置分割你的作業流程,切換處理方式 ===================引 用 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 發送簡訊給我 |
誠如 syntax 前輩說的,條件式編譯跟動態產生物件沒有絕對的關係!據我瞭解條件式編譯比較常運用在「偵錯」、「跨平台或Compiler程式碼型態宣告轉換」等,你所述的情形以一般的條件句即可達到目的,何必自找麻煩呢?
===================引 用 syntax 文 章=================== 你太執著於「動態生成」字面上的意義 由你的程式碼看來,並無「動態」的能力,於編譯時期就會決定使用哪種方式,並編成固定的程式碼 如此,何來動態? 如過你想要程式能夠在不同處理方式間切換,你必須要有控制方式,如參數與判斷式,並於是當位置分割你的作業流程,切換處理方式
編輯記錄
Stallion 重新編輯於 2007-08-03 23:47:28, 註解 無‧
|
shengbao
一般會員 發表:6 回覆:15 積分:4 註冊:2002-11-16 發送簡訊給我 |
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 發送簡訊給我 |
抱歉~你的需求無法達到!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 發送簡訊給我 |
先說明一下,我對 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 發送簡訊給我 |
動態生成,不是高手說怎樣就怎樣
動態生成,是指在程式運作時,動態建立在記憶體中的物件,這樣你還聽不懂的話 建議你去看書,補充一點,本來就應該要知道的基本知識與基本用語 不然說在多,你都不會懂,最後會變成幫你從頭上課上到尾,這大概需要半年吧! 從頭教到尾,與點出問題點、給意見,是不一樣的,也不是網路論壇的功能之一 那這樣,先繳學費來吧! ===================引 用 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 發送簡訊給我 |
或許是你不懂我的問題或是在裝傻~~
我當然知道動態生成的意思~~不然我宣告這兩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 發送簡訊給我 |
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 發送簡訊給我 |
很感謝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 |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
其實,你把編譯期跟執行期搞混了。
編譯期,你可以利用 ifdef, define.....等等來跟 compiler 說你要用那一段程式碼。 這就像你舉的例子,不同的 delphi 版本要做不同動作。 但是執行期的數值,在編譯期是完全無意義的。 當然你可以說當你改變了你的 const i 之後,你再重新編譯你的程式。 那這個動作就是在改變你編譯期的程式碼。 如果你想要做到你所想要做的動作。 我想,你不該在 {$IF} 這種編譯期的判斷來做事。 我再舉個很古老的例子。 有一個 class 老定義了”人” 人有一個 method 叫”工作” 男人、女人、小孩、學生、軍人。。。。都是人。 不過對於”工作”,會有不同的動作。 這個是怎麼實現的? 想一想,制定這個機制的人,已經想到你要做什麼, 也幫你想出怎麼做了。只是你並沒有用對方法而已。 |
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
發言請注意措辭
===================引 用 shengbao 文 章=================== 或許是你不懂我的問題或是在裝傻~~ 給那些自以為是高手的一句話~~學學外國人回覆文章的動機與方式~~ 不要以為自己是高手姿態放這麼高~~看的懂人家問題在回答~~會比較好~~因為我直覺你根本不知道我在問什麼~~ 資深會員不代表你就是真正的高手~~也許是你問題與廢話特別多才成為資深會員吧~!! 最後一句~~回復前先看懂問題點~~再做回應~~ 而不是一昧只為了發言而發言~~這樣反而會相形見拙~~共勉之
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
<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 發送簡訊給我 |
感謝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 發送簡訊給我 |
其實我並沒搞混~~而是你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 發送簡訊給我 |
謝謝指正,不過我覺得我錯誤的部分在以下的部分. <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 發送簡訊給我 |
你知道 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 發送簡訊給我 |
===================引 用 暗黑破壞神 文 章=================== 你知道 bcc32? 有個 -D 的參數嗎?-D or use -D 你知道 dcc32 也有個 -D 的參數嗎?-D 你知道它們代表的意義嗎? 上述~~ 可以請你說明一下。所謂的 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
一般會員 發表:6 回覆:15 積分:4 註冊:2002-11-16 發送簡訊給我 |
其實這個 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 發送簡訊給我 |
不懂!
首先聲明此回應無意筆戰,只想釐清一些看法上的差異. (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的觀念與認知上,似乎有不同的方向. 上述種種看法純屬個人見解,謹供參考,有誤勿怪... |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
我用 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 or use -D 你知道 dcc32 也有個 -D 的參數嗎?-D 你知道它們代表的意義嗎? 上述~~ 可以請你說明一下。所謂的 Compiler 初期的意義。 就是那個GUI~~在做編譯前~~可以下參數~在編譯期間~可以判斷用哪種Type~ ReCompiler 的意義?它的意思是在說~~程式可多重編譯~~或是重新編譯的意思~~ 這樣回答希望你能滿意~! ===================引 用 shengbao 文 章=================== 其實我並沒搞混~~而是你miss我一些關鍵字 我本來就是要在編譯時期取得外部資訊~~在做編譯 |
shengbao
一般會員 發表:6 回覆:15 積分:4 註冊:2002-11-16 發送簡訊給我 |
===================引 用 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 發送簡訊給我 |
##回覆我加入本文內~~
===================引 用 暗黑破壞神 文 章=================== 我用 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 or use -D 你知道 dcc32 也有個 -D 的參數嗎?-D 你知道它們代表的意義嗎? 上述~~ 可以請你說明一下。所謂的 Compiler 初期的意義。 就是那個GUI~~在做編譯前~~可以下參數~在編譯期間~可以判斷用哪種Type~ ReCompiler 的意義?它的意思是在說~~程式可多重編譯~~或是重新編譯的意思~~ 這樣回答希望你能滿意~! ===================引 用 shengbao 文 章=================== 其實我並沒搞混~~而是你miss我一些關鍵字 我本來就是要在編譯時期取得外部資訊~~在做編譯
------
sheng |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
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 發送簡訊給我 |
我了解你的意思~~
所以一早我再找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 發送簡訊給我 |
|
shengbao
一般會員 發表:6 回覆:15 積分:4 註冊:2002-11-16 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
嘻嘻!要是你中文好一點,多打一點字說明,把問題一開始問清楚就不需繞一個大彎才得到答案:條件式編譯的用法
還是 暗黑破壞神 老大有耐心 不過這樣,跟動態建立物件,就完全沒有關係 ===================引 用 shengbao 文 章=================== 略~~ ///*********************下列這幾句話就是我要的答案了************************************ 希望Delphi 也是用一樣的方法給他參數~~那因該就沒問題了~~ 我也可以在不更改任何的程式碼。而利用 bcc32 -DOLD_VERSION #define?? OLD_VERSION 這樣的動作來做編譯。它就跟我去程式碼中加入 #define OLD_VERSION 一樣。 ===================引 用 shengbao 文 章=================== 其實我並沒搞混~~而是你miss我一些關鍵字 我本來就是要在編譯時期取得外部資訊~~在做編譯 ------ 別看我,我不是高手 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |