{$ifdef}用法再問 |
答題得分者是:ccchen
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
再請教 ccchen 版主! 上回談到 {$ifdef} 用法已解決, 但現在又有一個情況, 我查了一些書籍都沒有提到, 不知版主是否可再指點一二 我設計一支DLL檔, 由其他專案程式來呼叫共用, 這個DLL會開啟一個 USER 的 Table並對應其TDBCHECKBOX, 但每一個專案所建構的 user table 其欄位不一, 舉例說明 A PROGRAM 的 USER Table 有 A,B,C,D,E 5個欄位
B PROGRAM 的 USER Table 有 A,B,C,D,E,F,G,H 8個欄位
C PROGRAM 的 USER Table 有 A,B,C,D,E 5個欄位
我想這樣寫 Unit User
...
...
DBCHECKBOXA: TDBCheckBox;
DBCHECKBOXB: TDBCheckBox;
DBCHECKBOXC: TDBCheckBox;
DBCHECKBOXD: TDBCheckBox;
DBCHECKBOXE: TDBCheckBox;
{$ifdef B PROGRAM}
DBCHECKBOXF: TDBCheckBox;
DBCHECKBOXG: TDBCheckBox;
DBCHECKBOXH: TDBCheckBox;
{$endif} 這個程式 user.dll 分別由 A.EXE, B.EXE, C.EXE 來呼叫 那 b program 該如何定義及傳入呢? 謝謝!
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: {$ifdef}應該無法達到你想要的目的, 他是給Compiler看的, 例如你在compiler該Dll時未{#define B PROGRAM},則DLL Build完後其中不會包含DBCHECKBOXF,G,H等, 你必須為B重新compiler一個DLL, 我相信這應該不是你要的 你的狀況, 應該連變數都不用宣告,直接RunTime Create就好了版主, 我不太明白你的意思, 要如何直接在 runtime create 如果是對每一支程式去complier新的dll, 那我也就不要這麼麻煩了, 因為這個dll檔是針對系統使用權限的設定function, 當然設計上不是像我上面說的那麼簡單就完事, 所以我才會想要讓這支dll可以成為共用, 可以適用在我所有客戶的專案上, 我日後也比較容易維護! 另外 {#define B PROGRAM} 1. 我的dll檔是由一個 library..開頭然後透過一支純unit程式來做為main, 其下才是我一堆由 form 構成的 unit 程式, 而我這些tdbcheckbox都是在這些 form 下的 unit, 那這段define 應該下在那一個 pas上, 以及如何下 2.是否可指點一下那兒可以找到相關的文件資料(我手上的書幾乎都沒有談到) 再次打擾, 只能謝謝! |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
{$ifedf}不是像你想像的,是給Compiler看的
DLL一旦Build完就已定型
compiler依據你的{$ifedf}選擇那些程式碼要Compiler入執行檔或DLL
如下之Define
{$ifdef B PROGRAM}
DBCHECKBOXF: TDBCheckBox;
DBCHECKBOXG: TDBCheckBox;
DBCHECKBOXH: TDBCheckBox;
{$endif}
1. 若有定義B PROGRAM,最後在DLL中是相當於
DBCHECKBOXF: TDBCheckBox;
DBCHECKBOXG: TDBCheckBox;
DBCHECKBOXH: TDBCheckBox;
在執行檔中(或DLL)後那些if 都不存在了 2. 若未定義B PROGRAM,最後在DLL中是什麼也沒有
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: {$ifedf}不是像你想像的,是給Compiler看的 DLL一旦Build完就已定型 compiler依據你的{$ifedf}選擇那些程式碼要Compiler入執行檔或DLL 如下之Define {$ifdef B PROGRAM} DBCHECKBOXF: TDBCheckBox; DBCHECKBOXG: TDBCheckBox; DBCHECKBOXH: TDBCheckBox; {$endif} 1. 若有定義B PROGRAM,最後在DLL中是相當於 DBCHECKBOXF: TDBCheckBox; DBCHECKBOXG: TDBCheckBox; DBCHECKBOXH: TDBCheckBox; 在執行檔中(或DLL)後那些if 都不存在了 2. 若未定義B PROGRAM,最後在DLL中是什麼也沒有嗯! 版主! 您的意思是如果要做到我想要的這種功能, 除非針對每一支program去complier一支獨立的DLL檔外, 沒有其他更好的方法囉? ~~~~我的興趣, 打破砂鍋問到底 謝謝! |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
不要用{$ifdef}
1.利用DLL所Export的procedure接受參數來決定須要多少TDBCheckBox,然後在RunTime Create.
例如若傳入參數代表program B則 with TDBCheckbox.create(self) do begin parent:=self; left:=12; top:=y; y:=y 18; Caption:=xxxx; DataSource:=...; DataField:=...; end;2. 看起來你似乎是要做權限管理, 若配合資料庫可能不須傳入參數可直接由資料庫取得資料來建立 (只是提供一個想法, 我們是將所有模組代碼, 功能代碼都存在資料庫的) |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 不要用{$ifdef} 1.利用DLL所Export的procedure接受參數來決定須要多少TDBCheckBox,然後在RunTime Create.我這支DLL檔的確是要做權限管理, 而且相當複雜, 除控制到POPMENU, HOTKEY的使用權外, 包含每一個FORM上的BUTTON(如新增, 修改, 刪除....)都要做到控管, 但每一支專案的BUTTON都不一樣(80%的相似度), 而我希望DLL檔只要開發一次, 以後每個專案都可以針對這20%相異度的部份做修正即可, 而不是每一個專案就弄一支DLL檔, 那萬一我有30個專案, 而這支權限檔對80%的部份有做功能性調整時, 那我就得修改30支檔案(USER.DLL), 這是累死人的事, 所以用runtime create object方式之前有想過, 但可行性很低就此作罷, 才想說是否有 {$ifdef}的用法可以解決, 看來我是還得再想其他方法來解決了, 謝謝版主多次的提點!例如若傳入參數代表program B則 with TDBCheckbox.create(self) do begin parent:=self; left:=12; top:=y; y:=y 18; Caption:=xxxx; DataSource:=...; DataField:=...; end;2. 看起來你似乎是要做權限管理, 若配合資料庫可能不須傳入參數可直接由資料庫取得資料來建立 (只是提供一個想法, 我們是將所有模組代碼, 功能代碼都存在資料庫的) |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |