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

請教一個重複利用TDataModule的問題...

尚未結案
David
一般會員


發表:13
回覆:26
積分:7
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-09 20:40:28 IP:203.217.xxx.xxx 未訂閱
請教各位先進: 這個問題有點不知如何表達才能讓前輩們了解我的意思,然後再進一步幫助我,所以我的描述如有不解的地方請提問。 假設:有一個表單Form1,Form1上有許多可視的資料庫表現元件組,相關資料庫作業程式已經撰寫完畢,元件組對應的相關TDataSet,如TTable,TQuery等元件放在一個TDataModule上,假設它的名字為DMF1,然後一切資料庫程式都已經實現完畢成功了,假設它所關聯的資料內容是A部門的。 現在我的問題是:要在目前上述已經完成的程式架構上,在同一支程式中要新增另一個B部門且能進行切換方便瀏覽及顯示A部門與B部門資訊,也就是可能我只需按個A鍵及顯示A部門資訊,按個B鍵及顯示B部門資訊。B部門的資料庫與A部門的完全一樣(從表格到欄位結構),換言之對應的資料庫是獨立的另一份,我構想中最好的方式是能共用上述Form1等已經做好表單。請問該如何做才能最省事呢? 我盡量簡單描述我的需求,希望能讓前輩明白,最主要整個程式內的資料庫表單決不會只有Form1一個而是好多個,如果要重新再複製一份恐怕程式會變得很大,維護上也沒效率,希望有前輩能指引個想法來解決這問題。 Thanks for your help.
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-09 20:52:48 IP:211.74.xxx.xxx 未訂閱
你的解法正確的阿~~直接使用 TdataSource 做切換就好了. 更改 TdataSource 的 DataSet 到A或B的部門即可. (PS1. 先決條件,兩者的欄位都是一模一樣) (PS2. 記得資料庫要先Close()過再Open(); 免得出問題 ) 另外還有很多解法啦~~例如用 SQL 語法來選著資料庫 select *from A where... 或者 select * from B where.... 還有一種解法就是在資料庫內再多一個 Department 的欄位. 下 SQL select 指令時,在 where 裡面加入部門的篩選條件.
David
一般會員


發表:13
回覆:26
積分:7
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-09 21:15:00 IP:203.217.xxx.xxx 未訂閱
引言: 你的解法正確的阿~~直接使用 TdataSource 做切換就好了. 更改 TdataSource 的 DataSet 到A或B的部門即可. (PS1. 先決條件,兩者的欄位都是一模一樣) (PS2. 記得資料庫要先Close()過再Open(); 免得出問題 ) 另外還有很多解法啦~~例如用 SQL 語法來選著資料庫 select *from A where... 或者 select * from B where.... 還有一種解法就是在資料庫內再多一個 Department 的欄位. 下 SQL select 指令時,在 where 裡面加入部門的篩選條件.
海星前輩您好: 首先感謝您的回應。 只是我還沒有適當的解法啊。因為上述的DMF1中有許多TDataSource,TTable與TQuery元件,如果要手寫程式去逐一切換TDataSource的話,恐怕要費許多力氣,更別提Form1等許多資料庫瀏覽表單上的程式中,有需多是直接引用DMF1內的TTable與TQuery,一但用切換的方式,恐怕工程不小。 我使用的資料庫是Paradox。 你另外提的方法都是很好,如果是一開始我就會參照,把部門用個變數代替,只是現在是,程式完成後再新增了一個部門,一旦修改起來實在沒玩沒了。原先我的想法是複製一份DMF1,假設另一份為DMF2,修改DMF2內的TTable與TQuery中有關表格名稱成為B部門對應的表格名稱,然後假設一個變數為aDMF,在切換部門時用 aDMF := DMF1; 與 aDMF := DMF2; 指定aDMF內容,再置換程式碼中所有原先是DMF1的變數,但失敗了,因為aDMF並不認識DMF1與DMF2內的TTable,TQuery,也對,因為我還找不出如何宣告aDMF的變數型態,使它能繼承DMF1與DMF2的成員。 所以,能再請您想想有其他方式嗎?還是我不明瞭您上述的建議,那再煩請您說明多一些。THKS 發表人 - David 於 2004/01/09 21:22:54
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-09 22:22:41 IP:211.74.xxx.xxx 未訂閱
假設你是使用 Table 來寫程式. 在 DM 上擺 Table1、Table2、DataSource1 這三個元件就好. 記住 TDataSource 只有擺一個而已.不是兩個. TDataSource1 裡面是不是有 DataSet 屬性? 當用戶按按鈕就執行 DataSource1.DataSet := Table2; 再執行一次,就變成 DataSource1.DataSet := Table1; 這樣瞭解了沒??? 其餘的 TDBEdit 的 DataSource 全部都是只有指向 DataSource1 你有 100個 TDBEdit 也是只有一行程式碼而已.
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-09 22:34:13 IP:211.74.xxx.xxx 未訂閱
上面那個方式你不喜歡的話,另一個方式就是改 Table 的 TableName 他有100個部門也沒差,每個部門做成一個資料庫, 但欄位內容一定要一模一樣, 假設部門有 QC、IT、RD三個..那你就製造 QC.DB、IT.DB、RD.DB 三個資料庫. 以後要切換就 Table1.Active := false; Table1.TableName := QC; Table1.Active := true; 這樣子去切換就好了. 反正方法太多種啦~~你高興怎樣做就怎樣做..完全都不會麻煩. 都用同一組元件就好,不要再去增加新的 DM、Table或 xxoo
David
一般會員


發表:13
回覆:26
積分:7
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-09 23:11:00 IP:203.217.xxx.xxx 未訂閱
引言: 假設你是使用 Table 來寫程式. 在 DM 上擺 Table1、Table2、DataSource1 這三個元件就好. 記住 TDataSource 只有擺一個而已.不是兩個. TDataSource1 裡面是不是有 DataSet 屬性? 當用戶按按鈕就執行 DataSource1.DataSet := Table2; 再執行一次,就變成 DataSource1.DataSet := Table1; 這樣瞭解了沒??? 其餘的 TDBEdit 的 DataSource 全部都是只有指向 DataSource1 你有 100個 TDBEdit 也是只有一行程式碼而已. 上面那個方式你不喜歡的話,另一個方式就是改 Table 的 TableName 他有100個部門也沒差,每個部門做成一個資料庫, 但欄位內容一定要一模一樣, 假設部門有 QC、IT、RD三個..那你就製造 QC.DB、IT.DB、RD.DB 三個資料庫. 以後要切換就 Table1.Active := false; Table1.TableName := QC; Table1.Active := true; 這樣子去切換就好了. 反正方法太多種啦~~你高興怎樣做就怎樣做..完全都不會麻煩. 都用同一組元件就好,不要再去增加新的 DM、Table或 xxoo
實在非常感謝海星前輩的不吝指點與費時解說。 依照您的方法1,是很好的方式,但是上一篇有報告過: ”Form1等許多資料庫瀏覽表單上的程式中,有許多是直接引用DMF1內的TTable與TQuery,一但用切換的方式,恐怕工程不小。” 換言之Unit1.pas(Form1對應的程式檔)內有許多如: DMF1.Query1.SQL.Add('select * from t1 where f1 > 121...'); ... DMF1.Active := True; x := DMF1.Query1.FieldByName('f1').AsString; ... 這種直接引用DMF1內的TTable與TQuery的程式作為其他資料運算的成果,並沒有連結TDataSource,所以才費事。 依照您的方法2,如果是只有TTable元件還好,只有TableName修改即可,但是TQuery要keyin的就不少了,而Unit1.pas的程式碼也無法解決。 很感謝您的熱情義助,能請問還有其他想法嗎?THKS.
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-09 23:23:55 IP:211.74.xxx.xxx 未訂閱
引言: 換言之Unit1.pas(Form1對應的程式檔)內有許多如: DMF1.Query1.SQL.Add('select * from t1 where f1 > 121...'); ... DMF1.Active := True; x := DMF1.Query1.FieldByName('f1').AsString; ...
不要懶惰..事後補救該花時間的就該花..你逃避不了的.. 反正你程式碼只需再改一次而已. 把資料庫名稱改為變數型態,這樣你的問題就一次解決了.
      String BaseName;  // 資料庫名稱用動態的.
 String SQLStr;     BaseName := 'f1';     SQLStr := 'select * from '   BaseName    ' where f1 > 121...';
 DMF1.Query1.SQL.Add( SQLStr );     x := DMF1.Query1.FieldByName( BaseName ).AsString;    
發表人 - 海星 於 2004/01/09 23:25:58 發表人 - 海星 於 2004/01/09 23:27:07
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-10 16:51:20 IP:203.204.xxx.xxx 未訂閱
請問您的TTable及TQuery的DataBaseName 是不是直接指定BDE裏設定的別名? 如果是的話 你可參考以下文章 讓DataBaseName不變 但指向的資料庫路徑去改變,如此連結此資料庫的DataSet元件就可不用改了。    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=42991
David
一般會員


發表:13
回覆:26
積分:7
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-11 00:40:43 IP:203.217.xxx.xxx 未訂閱
引言: 請問您的TTable及TQuery的DataBaseName 是不是直接指定BDE裏設定的別名? 如果是的話 你可參考以下文章 讓DataBaseName不變 但指向的資料庫路徑去改變,如此連結此資料庫的DataSet元件就可不用改了。 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=42991
謝謝前輩的指引,我會朝這個想法測試看看,再向各位報告。更謝謝海星前輩的幫忙指引,謝謝各位,萬分感謝。
David
一般會員


發表:13
回覆:26
積分:7
註冊:2002-04-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-12 00:36:31 IP:203.217.xxx.xxx 未訂閱
引言: 請問您的TTable及TQuery的DataBaseName 是不是直接指定BDE裏設定的別名? 如果是的話 你可參考以下文章 讓DataBaseName不變 但指向的資料庫路徑去改變,如此連結此資料庫的DataSet元件就可不用改了。 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=42991
感謝Chance36前輩的指引,小弟測試後確定可達到自己的需求,再次感謝您的不吝指點與海星前輩的幫忙,謝謝您們。 Best regards.
系統時間:2024-07-03 18:39:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!