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

{$ifdef}用法再問

答題得分者是:ccchen
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-02 00:44:17 IP:61.66.xxx.xxx 未訂閱
再請教 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-02 08:03:07 IP:61.219.xxx.xxx 未訂閱
{$ifdef}應該無法達到你想要的目的, 他是給Compiler看的, 例如你在compiler該Dll時未{#define B PROGRAM},則DLL Build完後其中不會包含DBCHECKBOXF,G,H等, 你必須為B重新compiler一個DLL, 我相信這應該不是你要的 你的狀況, 應該連變數都不用宣告,直接RunTime Create就好了
P.D.
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-02 11:18:29 IP:211.78.xxx.xxx 未訂閱
引言: {$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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-02 12:09:22 IP:61.219.xxx.xxx 未訂閱
{$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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-01-02 18:10:31 IP:211.78.xxx.xxx 未訂閱
引言: {$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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-01-03 07:38:39 IP:61.219.xxx.xxx 未訂閱
不要用{$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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-01-03 17:15:34 IP:61.66.xxx.xxx 未訂閱
引言: 不要用{$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. 看起來你似乎是要做權限管理, 若配合資料庫可能不須傳入參數可直接由資料庫取得資料來建立 (只是提供一個想法, 我們是將所有模組代碼, 功能代碼都存在資料庫的)
我這支DLL檔的確是要做權限管理, 而且相當複雜, 除控制到POPMENU, HOTKEY的使用權外, 包含每一個FORM上的BUTTON(如新增, 修改, 刪除....)都要做到控管, 但每一支專案的BUTTON都不一樣(80%的相似度), 而我希望DLL檔只要開發一次, 以後每個專案都可以針對這20%相異度的部份做修正即可, 而不是每一個專案就弄一支DLL檔, 那萬一我有30個專案, 而這支權限檔對80%的部份有做功能性調整時, 那我就得修改30支檔案(USER.DLL), 這是累死人的事, 所以用runtime create object方式之前有想過, 但可行性很低就此作罷, 才想說是否有 {$ifdef}的用法可以解決, 看來我是還得再想其他方法來解決了, 謝謝版主多次的提點!
系統時間:2024-05-05 6:19:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!