如何讓一支dpr 共用十支pas |
答題得分者是:william
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位! 這個問題有點難說明, 請耐心瞭解一下 我設計一支程式, 要接十台不同的儀器, 每一台儀器有其一支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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言:把每一個driver都各成一個dll 然後再去LoadLibrary載入在去呼叫他就好了.. 用GetProcAddress去取得位址 在用@Function_Name去呼叫 而且你要呼叫的function name 都一樣..那更方便引言: 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 |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
既然每個控制方式都不同
那只有寫十個程式庫來使用
可是為何又說"我現在的做法是有十支dpr(m1~m10), 分別分開來寫, 但仍是很麻煩, 因為流程一改, 我要同時改十支" ?
每個都不同,當然要每個每個去更改
不過要是需要同時改10個,那表示每個程式間有一定的相同區域,或許你可以用一個繼承一個的方式來發展,這樣同樣的東西只要改一次,然後個別編成一個專案,最後在用一個獨立的程式,也就是第11支來控制這10支程式,反正執行後結果都一樣,不管是一支 11 MB 的程式,還是十支 1MB 的程式,如果要一起在一台機器上同時執行,所佔的資源會幾乎一樣多,只是一支程式編起來可能很慢,十支程式個別編起來較快 如果你可以切確說出你的需要,那我也許有更好的方法可以幫忙!
(哪十種機器啦做哪些事拉等等等詳細一點)
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 既然每個控制方式都不同 那只有寫十個程式庫來使用 可是為何又說"我現在的做法是有十支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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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.改成你說的方式倒也可以, 不過就是我說的要有金主, 否則所投入的費用, 業 主不會幫我出, 或者我自願發善心, 做功德了! 不過我會好好參考你的建議, 搞不好心一橫, 做功德吧! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |