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

form共用query,切換時發生field not found?

尚未結案
myboss
一般會員


發表:25
回覆:42
積分:13
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-20 11:25:10 IP:218.163.xxx.xxx 未訂閱
請問各位大大:     我有10個form一個datamodule--dm上有一個query dm有一個公用函數
dm->openquery(String s,TQuery *q){
q->Close();
q->SQL->Clear();
q->SQL->Add(s);
q->Open();}
我在form->active時呼叫dm->openquery("select * from db",dm->Query1);
每一個form用的db不同,欄位也不同
每一個form都用這函數開啟資料表而毫無問題
但當我開啟了2個以上的FORM時,發生field not found?
為此我再呼叫form之前另建了一個函數
dm->ClearQuery(TQuery *q){
q->Close();
q->SQL->Clear();
q->Fields->Clear();}
再呼叫dm->openquery("select * from db",dm->Query1);
之後才開啟form
如此我呼叫各FORM而無問題\,但當螢幕有兩個以上的FORM
做切換時,又會field A7 not found
所以我在form->deactive的地方先dm->Query1->active= false;
再呼叫dm->ClearQuery(dm->Query1);
不過問題依舊,請問該如何解決?
發表人 - myboss 於 2004/06/20 11:26:25 發表人 - taishyang 於 2004/06/20 14:58:28
myboss
一般會員


發表:25
回覆:42
積分:13
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-21 11:46:07 IP:218.163.xxx.xxx 未訂閱
對不起,經過一再實驗後,發現是DBEDIT呼叫QUERY1 時因呼叫項目空了所以發生錯誤,請問該如何解決? 當我將DBEDIT移除時,錯誤就不再發生了,所以問題 應該是出在這裡,只是我有十多個FORM,每一個都有 DBEDIT,請問DBEDIT可以設定當form--active-deactive 時不去呼叫QUERY1嗎?
gentrice
一般會員


發表:4
回覆:9
積分:2
註冊:2004-05-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-22 01:35:10 IP:218.166.xxx.xxx 未訂閱
看來你是共用一個data module instance 且可同時開啟多個子視窗 這樣就會發生你講的問題 因為你的DM只有一個,他不能一會兒是From A的Query內容 一下子是Form B的Query內容 如果懶得改太多code 就是每一個form自己產生自己的DM instance 這樣可能會好一點
myboss
一般會員


發表:25
回覆:42
積分:13
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-22 11:52:05 IP:218.163.xxx.xxx 未訂閱
gentrice兄你好: 是否無法共用DataModule及DataModule上之Query 如果要一個Form搭配一個DataModule那我用DataModule 就沒意義了。 根據書上所述,DataModule可以提供共用環境,可把相同 需重複的code及反覆使用的非可視元件放此共用不是嗎? 為何只多了DbEdit就無法共用了,是DataModule與DbEdit 不相容嗎?難道沒有DataModule--Query與DbEdit共存之道嗎?
gentrice
一般會員


發表:4
回覆:9
積分:2
註冊:2004-05-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-24 16:01:30 IP:61.222.xxx.xxx 未訂閱
Hi, 據個人淺薄的認知,DM是一個物件,而一個物件只會有一組run time value DM當然可以"共用" 但前提是"同時"共用還是"不同時"的共用 當你要同時共用DM,您就必須要同時有一個以上的DM instance這樣大家才會相安無事 所以這並不是Query與QEdit相處融不融洽的問題 而是物件導向的精神之故 另外一點,就是您提的是不是要重複很多份DM 基本上DM還是只有設計一份 只是每一個form自行去new 出自己的DM 並沒有重複拉很多DM (當然這份DM就不適宜用auto-generation的屬性了) 發表人 - gentrice 於 2004/06/24 16:04:59
yehcwin
一般會員


發表:1
回覆:10
積分:2
註冊:2002-06-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-25 14:26:15 IP:220.228.xxx.xxx 未訂閱
是不是TDBEdit::OnChange()裡有存取dm->Query1 ?
myboss
一般會員


發表:25
回覆:42
積分:13
註冊:2004-01-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-06-25 17:04:39 IP:218.163.xxx.xxx 未訂閱
gentrice小姐你好: 我DataModule在共用尚沒有問題,有問題的是其上的TQuery與其他 Form上的DBEdit,因為當我把Form上的DBEdit刪除剩下DBGrid時切換 TQuery之SQL內容而不會出現問題,所以我才會認為是DBEdit與共用 TQuery發生問題的,不知妳看法如何? yehcwin兄你好: 我沒有為TDBEdit撰寫OnChange事件,而是發現只要Form上有DBEdit 若想在Form與Form間做切換,就無法只用一個DataModule的Query 如果事先開啟一個Form,關閉後再開另一個Form就沒問題,但是若 想在Form與Form間做切換,且Form上有DBEdit,則每個Form要有一 個相對應的Query才不會有問題,但這樣Form一多Query也要增加許多 我想請問的是 有辦法只用一個Query讓我在各Form中切換使用嗎?
yehcwin
一般會員


發表:1
回覆:10
積分:2
註冊:2002-06-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-06-25 18:08:25 IP:220.228.xxx.xxx 未訂閱
將NonActive's DBEdit1->DataSource=NULL ; Active's DBEdit1->DataSouce=dm->DataSource ; 這樣會不會麻煩 ?
myboss
一般會員


發表:25
回覆:42
積分:13
註冊:2004-01-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-06-28 22:11:01 IP:218.163.xxx.xxx 未訂閱
yehcwin兄你好: 我一個FORM上有好幾個DBEdit,請問您的意思是要 在Form--active&deactive時將其一一DataSource 設為dm->Query1及NULL嗎? 我照著試驗過,但很容易出錯漏了等等,翻書籍及 Online Help知道可以用Component Count及ClassName 設定更改,以後新增及刪除DBEdit十遍不用再去修 程式碼了,可是對這一段不熟,請問該如何撰寫呢? 又可否讓這一段放在datamodule供各FORM共用呢?
yehcwin
一般會員


發表:1
回覆:10
積分:2
註冊:2002-06-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-06-29 12:39:20 IP:220.228.xxx.xxx 未訂閱
 
大致如下:
 for(int i=0; iComponentCount; i  )
 {
  if( (pDBEdit=dynamic_cast(pForm->Components[i]))
   != NULL )
  {
   if( bIsActive )
    pDBEdit->DataSource = dm->DataSource ;
   else
    pDBEdit->DataSource = NULL ;
  }
 }
gentrice
一般會員


發表:4
回覆:9
積分:2
註冊:2004-05-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-06-30 00:14:39 IP:218.166.xxx.xxx 未訂閱
雖然沒有看到code 但是上述的方式,都不是很正確的作法 補來補去,問題鐵定一堆 如果同一個Application同時允許兩個from在run time被使用 請同時產生兩份DM的物件(run time instance) 這樣才有獨立的data space
yehcwin
一般會員


發表:1
回覆:10
積分:2
註冊:2002-06-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-07-01 12:16:28 IP:220.228.xxx.xxx 未訂閱
gentrice 說得沒錯, 像我的做法是有個公用的DM; 另Form取用Table數 -多的:Form有自己的DM, -少的:直接佈在Form上 . 僅供參考, 請不吝指教 ..
myboss
一般會員


發表:25
回覆:42
積分:13
註冊:2004-01-13

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-07-01 14:04:23 IP:218.163.xxx.xxx 未訂閱
gentrice小姐、yehcwin先生你們好: 看到你們的指導,有些問題想請教。 1.我原先form上只有dbgrid,共用datamodule--dm 上面有一個query,於切換form時更改query--SQL 內容,原以為這樣可以節省系統及網路資源,請問 這個作法錯了嗎? PS:我用的是MDI FORM 2.應使用者要求在form上加了DBEDIT,之後共用一個 query方法以不能使用,於是在DM上為各form產生一個 query--q01~q13,一個FORM若需要一個以上query,則 取用q01第一個FORM取用q02,請問這樣做對嗎? 3.你們都說多的Form有自己的DM,是指當我有13個FORM 時,應該產生13個DM嗎? 4.書上說當有重複的CODE時,與其反覆寫入,不如集中 一處,如此在維護上較為方便,更改CODE時也只要修改 一次即可,因此我將所有的TQuery及TTable集中於DM 撰寫函式讓各FORM呼叫,請問這樣的作法是否正確呢? 發表人 - myboss 於 2004/07/01 15:31:49
系統時間:2024-11-25 8:06:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!