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

如何讓一支dpr 共用十支pas

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-05 17:05:10 IP:61.66.xxx.xxx 未訂閱
請問各位!    這個問題有點難說明, 請耐心瞭解一下    我設計一支程式, 要接十台不同的儀器, 每一台儀器有其一支driver(以pas寫出來的), 及因為控制方式不同, 所有有十支控制儀器的程式 如下    machine.dpr    uses m1drive, m1ctrl (m2drive, m2ctrl....)    其中, 因為其他的程式都一樣, 只有 m1drive, m1ctrl不同而已, 我想只用一 個專案就可以控制十台儀器, 但我並不想如下做    
uses m1drive, m1ctrl, m2drive, m2ctrl, m3drive, m3ctrl... m10drive, m10ctrl;    implemenet    function Control(machine: string): boolean;
begin
     if machine='1' then begin
     end
     else if machine='2' then begin
     end
     ............
end;
因為這樣寫必須把十支drive, 十支control全部compiler進來, 那程式會變的 十分可怕(因為每一支pas都很大) 我現在的做法是有十支dpr(m1~m10), 分別分開來寫, 但仍是很麻煩, 因為流程 一改, 我要同時改十支 有沒有其他方法可以利用一支dpr來解決(但不是上述的做法), 可以解決程式的大小, 也可以讓我不要做十次相同的事情 我有想過用dll方法來做, 但因為drive 部份必須在 machine.dpr中的引用, 所以machine.dpr中一定要掛上 m1drive (m2drive, m3drive..), 因此無法使用 ps:所有的流程及 function 都是完全一樣的下法及名稱, 就是引用的drive不一樣及control中控制方式的流程不同
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-05 17:30:27 IP:147.8.xxx.xxx 未訂閱
I think plugin dll is best way.. maybe you could try using compiler directives? e.g. {$ifdef M1} {$endif} {$ifdef M2} {$endif} {$ifdef M3} {$endif}
P.D.
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-05 23:19:23 IP:61.66.xxx.xxx 未訂閱
引言: I think plugin dll is best way.. maybe you could try using compiler directives? e.g. {$ifdef M1} {$endif} {$ifdef M2} {$endif} {$ifdef M3} {$endif}
DLL部份我已試過, 似乎不太行的通, IFDEF方式我也想過, 但 IFDEF方式是 在編譯時就已加入到程式, 如果我要一支DPR可以共用十支DRIVER, 那 IFDEF 便沒有意義了, 因為我還是得加入十支DRIVER一起 COMPILER, 雖然程式是可 行, 但檔案的大小則太可怕了, 我做過十支進去要 11M
aip999
初階會員


發表:10
回覆:63
積分:44
註冊:2002-03-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-06 02:09:01 IP:218.187.xxx.xxx 未訂閱
引言:
引言: I think plugin dll is best way.. maybe you could try using compiler directives? e.g. {$ifdef M1} {$endif} {$ifdef M2} {$endif} {$ifdef M3} {$endif}
DLL部份我已試過, 似乎不太行的通, IFDEF方式我也想過, 但 IFDEF方式是 在編譯時就已加入到程式, 如果我要一支DPR可以共用十支DRIVER, 那 IFDEF 便沒有意義了, 因為我還是得加入十支DRIVER一起 COMPILER, 雖然程式是可 行, 但檔案的大小則太可怕了, 我做過十支進去要 11M
把每一個driver都各成一個dll 然後再去LoadLibrary載入在去呼叫他就好了.. 用GetProcAddress去取得位址 在用@Function_Name去呼叫 而且你要呼叫的function name 都一樣..那更方便
syntax
尊榮會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-07 00:51:27 IP:61.70.xxx.xxx 未訂閱
既然每個控制方式都不同 那只有寫十個程式庫來使用 可是為何又說"我現在的做法是有十支dpr(m1~m10), 分別分開來寫, 但仍是很麻煩, 因為流程一改, 我要同時改十支" ? 每個都不同,當然要每個每個去更改 不過要是需要同時改10個,那表示每個程式間有一定的相同區域,或許你可以用一個繼承一個的方式來發展,這樣同樣的東西只要改一次,然後個別編成一個專案,最後在用一個獨立的程式,也就是第11支來控制這10支程式,反正執行後結果都一樣,不管是一支 11 MB 的程式,還是十支 1MB 的程式,如果要一起在一台機器上同時執行,所佔的資源會幾乎一樣多,只是一支程式編起來可能很慢,十支程式個別編起來較快 如果你可以切確說出你的需要,那我也許有更好的方法可以幫忙! (哪十種機器啦做哪些事拉等等等詳細一點)
P.D.
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-08 11:14:35 IP:61.66.xxx.xxx 未訂閱
引言: 既然每個控制方式都不同 那只有寫十個程式庫來使用 可是為何又說"我現在的做法是有十支dpr(m1~m10), 分別分開來寫, 但仍是很麻煩, 因為流程一改, 我要同時改十支" ? 每個都不同,當然要每個每個去更改 不過要是需要同時改10個,那表示每個程式間有一定的相同區域,或許你可以用一個繼承一個的方式來發展,這樣同樣的東西只要改一次,然後個別編成一個專案,最後在用一個獨立的程式,也就是第11支來控制這10支程式,反正執行後結果都一樣,不管是一支 11 MB 的程式,還是十支 1MB 的程式,如果要一起在一台機器上同時執行,所佔的資源會幾乎一樣多,只是一支程式編起來可能很慢,十支程式個別編起來較快 如果你可以切確說出你的需要,那我也許有更好的方法可以幫忙! (哪十種機器啦做哪些事拉等等等詳細一點)
syntax! 你誤會我的意思了, 我是說我有十台儀器要透過程式來控制, 但十台儀器可能是在十台電腦上或是在一台電腦上控制(如果是在一台電腦上, 另外一個控制器切換, 因為是透過rs-232連接), 所以我才會有十支程式要跑, 這支程式是先人留下的, 當初在開發時並未考慮整合, 所以分開來寫, 但因為操作介面是一模一樣, 差別在控制點及驅動方式不同, 故只要是程式中有關到控制及驅動的部份是以function來做, 可是操作介面常因客戶的需求會改版, 這下就很好玩了, 有時為了一個edit位置, 我就要改十支程式, 就因為如此, 常常改了這支, 忘了那支, 實在很苦惱, 因此我才想說是否十台儀器可以共用一支程式, 我只要改一次, 編譯一次就可以完成所有的異動, 其實這個方式用dll是最好的,如 william, aip999所說, driver及control以dll來呼叫, 但我這邊有實際的困難, 因為當初未考慮整合, 所以在driver及control中有使用到大量的變數是來自main及其他共用的form,(當然還有其他問題), 如果要整合我等於是大改版!這個案子是已close進入maintain階段, 在沒有金主的情況我是不可能做這種事,(當然照現在改版模式來做是可以和客戶收多一點, 但總遭受到客戶質疑改一點東西要那麼久, 也不便宜!), 所以我才想說按現在的程式, 是否有辦法整合在一起, 又可以不讓我改十次, 同時檔案資源也不會膨脹太厲害! 不知這樣清楚否!!?
m0210
一般會員


發表:31
回覆:29
積分:17
註冊:2002-08-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-12 14:08:55 IP:210.59.xxx.xxx 未訂閱
P.D. 兄您好: 我作過類似的案子,提供淺見給您,希望對您有幫助. 以下做法,簡稱DRV介面 一.使用歸類法 在儀器方面,總是會有共用的特性.把那些特性寫成物件. 儘可能,儘可能,儘可能,物件化. 二,介面DRV規格化,定出DRV與RS-232的呼叫介面, 定出DRV介面與主程式的呼叫介面 主程式 <----> [DRV] <---->[Rs232] 三,別將資料庫與介面DRV單元放在一起,DRV單元不要在FORM裡做. 四.用一個文字檔儲存儀器總目錄檔,以用來索引不同的儀器 五.每種儀器,皆有獨立的"指令格式"檔(文字檔格式). (*******重點在這********) 例如: 儀器A 的指令格式檔裡 Scan='AAAA' Loop='Yes' 儀器B 的指令格式檔裡 Scan='BBBB' Loop='No' 以此方式,Scan能代表不同的指令格式 Loop能代表該儀器是否需要持續讀取....... 把不同的儀器指令存成文字檔,那就如同驅動程式一樣囉~
P.D.
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-12 17:35:20 IP:61.66.xxx.xxx 未訂閱
引言: P.D. 兄您好: 我作過類似的案子,提供淺見給您,希望對您有幫助. 以下做法,簡稱DRV介面 一.使用歸類法 在儀器方面,總是會有共用的特性.把那些特性寫成物件. 儘可能,儘可能,儘可能,物件化. 二,介面DRV規格化,定出DRV與RS-232的呼叫介面, 定出DRV介面與主程式的呼叫介面 主程式 <----> [DRV] <---->[Rs232] 三,別將資料庫與介面DRV單元放在一起,DRV單元不要在FORM裡做. 四.用一個文字檔儲存儀器總目錄檔,以用來索引不同的儀器 五.每種儀器,皆有獨立的"指令格式"檔(文字檔格式). (*******重點在這********) 例如: 儀器A 的指令格式檔裡 Scan='AAAA' Loop='Yes' 儀器B 的指令格式檔裡 Scan='BBBB' Loop='No' 以此方式,Scan能代表不同的指令格式 Loop能代表該儀器是否需要持續讀取....... 把不同的儀器指令存成文字檔,那就如同驅動程式一樣囉~
m0210 ! 你的點子的確很另類, 我之前沒有想到, 這倒是可行! 我這邊的問題 1.之前的程式未曾規劃好, 所以如你所說, database, driver 都是在form中執行 2.drv的部份我花了很多時間把十支都統一成同一種function, 下法都相同, 所以這部份是已解決, 但因為第1項的問題, 造成如果想讓十支driver變成一支的 話, 則不太容易合併, 我知道如果不post程式上來是很難讓各位明白, 但本系統 受合約保護無法釋出(連一點都不行), 所以這是我麻煩的地方 3.改成你說的方式倒也可以, 不過就是我說的要有金主, 否則所投入的費用, 業 主不會幫我出, 或者我自願發善心, 做功德了! 不過我會好好參考你的建議, 搞不好心一橫, 做功德吧!
系統時間:2024-05-13 20:04:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!