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

請問Form與ADOQuery1之間的應用。

尚未結案
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-13 16:52:06 IP:61.221.xxx.xxx 未訂閱
請問各位。 兩個問題, 第一。 如有兩個Form1/Form2, Form1有ADOQuery1,DBGRID1 (ADOQuery1 -> select * from CPURA) Form2中會處理一些判斷式 (RA001='0002')將同時利用Form1.ADOQurey1中, 同時讓Form1的DBGrid1作變化。 因為我有試過好像沒有反應。 比如,如下。 procedure TForm2.SpeedButton1Click(Sender: TObject); begin Form1.ADOQuery1.Close; Form1.ADOQuery1.SQL.Add(' Select RA001,RA002,RA003,RA004,RA005 FROM CPURA Where '); Form1.ADOQuery1.SQL.Add(sSQL);//sSQL = RA001='0001' Form1.ADOQuery1.Open; end; 第二。 當Form2執行完畢後,關閉視窗可以回到Form1的PageControl.TabSheet1.DBGrid. 請問這個部份該如何去控管。 麻煩大家。 謝謝。
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-13 17:19:10 IP:218.172.xxx.xxx 未訂閱
1,2在Form2 Public區段宣告一ADOQuery   
Public  
     InADOQry : TADOQry
在Form1建立Form2時傳給他
  Form2 := TForm2.Create(Self);
  Form2.InADOQry := ADOQuery1;
  Form2.ShowModal;
  FreeAndNil(Form2);
  PageControl.ActivePageIndex := 0;
  DBGrid.SetFocus;
  
這時直接拿傳來的ADOQuery使用
  InADOQry.Close;
  InADOQry.SQL.Add(' Select RA001,RA002,RA003,RA004,RA005 FROM CPURA Where ');
  InADOQry.SQL.Add(sSQL);//sSQL = RA001='0001'
  InADOQry.Open;
我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-14 08:27:16 IP:61.221.xxx.xxx 未訂閱
Hi Miles: 謝謝。 Public        InADOQry : TADOQuery 要定義如上才不會有錯。 另外,有兩個問題。 1。 InADOQry.Close; InADOQry.SQL.Add(' Select RA001,RA002,RA003,RA004,RA005 FROM CPURA Where '); InADOQry.SQL.Add(sSQL);//sSQL = RA001='0001' InADOQry.Open; 好像沒有反應。因為我直接指定。 RA001='0001'時應該在Form1會指標會秀出只有1筆,可是好像只有閃一下。 2。 當我離開Form2時會出現如下的錯誤訊息。 Cannot focus a disable or invisible window. 麻煩您。是否少設定些什麼。 謝謝。
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-14 09:15:45 IP:218.15.xxx.xxx 未訂閱
插花: t0288542您好, 1、在Form2中會處理一些判斷式时,将(RA001='0002')改为:(RA001="0002")试试 2、出现Cannot focus a disable or invisible window,是因为当前活动窗体是在Form2,而不是在Form1上。 综合,改成如下试试:
 
procedure TForm2.Button1Click(Sender: TObject);
//var
//  sSQL:string;
begin
 // sSQL:='ID="0005"';
  Form1.ADOQuery1.Close;
  Form1.ADOQuery1.SQL.Clear;
  Form1.ADOQuery1.SQL.Add('select * from table1');
  Form1.ADOQuery1.SQL.Add('where ' sSQL); //此处的sSQL应为ID="0005"
  Form1.ADOQuery1.Open;
  FreeAndNil(Form2); //关闭和释放Form2窗体
  Form1.PageControl1.ActivePage:=Form1.TabSheet1;  //假设您的DBGrid是放在Form1中的TabSheet1上
  Form1.DBGrid1.SetFocus;  //获取焦点
end;
试试看 <> ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-14 10:26:06 IP:61.221.xxx.xxx 未訂閱
Hi deity: 謝謝,您的方法我已嘗試過。 目前資料庫為SQL所以, ID='0001'必需為單引號才行。 另外,結束Form2的查詢方框,還是一樣會出現有錯誤訊息。 謝謝您,是否我有什麼地方沒有考慮到呢。 麻煩您。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-14 11:07:09 IP:61.222.xxx.xxx 未訂閱
if Visible then DBGrid1.SetFocus; 看不出來有什麼問題? 另外 deity 兄,指明的地方是對的! 假設有一字串 ID := '0001'; sSQL 就應該為 sSQL := 'RA001=''' ID ''''; ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ 發表人 - wameng 於 2005/07/14 11:08:42
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-14 13:26:16 IP:61.221.xxx.xxx 未訂閱
謝謝wameng。 可是排除字串的問題。 似乎一樣無法查詢到那一筆資料。 以下。是我的程式碼。 FCPURM->BUTTON procedure TFCPURM.SpeedButton3Click(Sender: TObject); begin   //FCPURM02.ShowModal;//使用此方式可能無法關閉FCPURM   FCPURM02.Show; end;    FCPURM02->BUTTON procedure TFCPURM02.SpeedButton1Click(Sender: TObject); begin   case PageControl1.ActivePageIndex of     0 : begin           //Process tabsheet1 .....           if (TRIM(ComboBox1.Text)<>'') AND (TRIM(Edit1.Text)<>'') then begin             sSQL := 'RA001 '+ TRIM(ComboBox1.Text) +' ''' + TRIM(Edit1.Text)+'''';             showmessage(sSQL);           end;         end;     1 : begin            //Process tabsheet2 .....           if (TRIM(ComboBox1.Text)<>'') AND (TRIM(Edit1.Text)<>'') then begin             sSQL := 'RA001 '+ TRIM(ComboBox1.Text) +' ''' + TRIM(Edit1.Text)+'''';             showmessage(sSQL);           end;         end;   else     //Another process .....   end;   if sSQL<>'' then begin         FCPURM.ADOQuery1.Close;      FCPURM.ADOQuery1.SQL.Add(' Select RA001,RA002,RA003,RA004,RA005 FROM CPURA Where ');      FCPURM.ADOQuery1.SQL.Add(sSQL);      FCPURM.ADOQuery1.Open;      FreeAndNil(FCPURM02);      FCPURM.PageControl1.ActivePage:=FCPURM.TabSheet1;      FCPURM.DBGrid1.SetFocus;   end; end;    可否幫我看到底那裡出問題,麻煩大家。    
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-14 14:37:27 IP:218.172.xxx.xxx 未訂閱
1. 將組出來的SQL字串拿到SQL Query Analyzer執行看結果是否正確, 並確定ADOQuery沒有設定任何Filter 條件.    2.建議

   FCPURM.ADOQuery1.Close;
   FCPURM.ADOQuery1.SQL.Add(' Select RA001,RA002,RA003,RA004,RA005 FROM CPURA Where ');
   FCPURM.ADOQuery1.SQL.Add(sSQL);
   FCPURM.ADOQuery1.Open;
   FCPURM.Show;
   FCPURM.PageControl1.ActivePage:=FCPURM.TabSheet1;
   FCPURM.DBGrid1.SetFocus;
   FreeAndNil(FCPURM02);
我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-14 14:46:46 IP:218.15.xxx.xxx 未訂閱
t0288542 您好:    考虑下面几个问题 1、您的PageControl1、ComboBox1、Edit1、DBGrid几个组件是不是都在FCPURM窗体上。是的话,凡在FCPURM02上使用请在其前面加上FCPURM。如:FCPURM.ComboBox1; case FCPURM.PageControl1.ActivePageIndex of; 不是的话,就不用了。 2、您的DBGrid有几个,是放在FCPURM.PageControl1的哪个TabSheet上? 因我看您所提问时说: 當Form2執行完畢後,關閉視窗可以回到Form1的PageControl.TabSheet1.DBGrid. 是放在FCPURM.PageControl1.TabSheet1.DBGrid上? 所以是这样给您试范了 FCPURM.PageControl1.ActivePage:=FCPURM.TabSheet1;//先将TabSheet1设当前活动的Page FCPURM.DBGrid1.SetFocus; //让DBGrid1获得焦点 上面也有了详细的注解!您可以将这两句取消,看能不能得出结果,再来返回焦点。 3、仔细试试,不行可将程式放入求助区。 ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-14 14:58:25 IP:61.221.xxx.xxx 未訂閱
謝謝Miles和deity。 我先將程式放在求助區。 研究看看。 謝謝。
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-14 16:54:17 IP:219.129.xxx.xxx 未訂閱
您好:
procedure TFCPURM02.SpeedButton1Click(Sender: TObject);
begin
  case PageControl1.ActivePageIndex of
    0 : begin
          //Process tabsheet1 .....
          if (TRIM(ComboBox1.Text)<>'') AND (TRIM(Edit1.Text)<>'') then begin
            sSQL := 'RA001 '  TRIM(ComboBox1.Text)  ' '''   TRIM(Edit1.Text) '''';
            showmessage(sSQL);
          end;
        end;
    1 : begin
           //Process tabsheet2 .....
          if (TRIM(ComboBox1.Text)<>'') AND (TRIM(Edit1.Text)<>'') then  //是ComboBox1与Edit1还是ComboBox2与Edit2,怎么两者一样?  begin
            sSQL := 'RA001 '  TRIM(ComboBox1.Text)  ' '''   TRIM(Edit1.Text) '''';
            showmessage(sSQL);
          end;
        end;
  else
    //Another process .....
  end;
  if sSQL<>'' then begin         FCPURM.ADOQuery1.Close;
FCPURM.ADOQuery1.SQL.Clear; //加上此句,将之前sql语句清除
     FCPURM.ADOQuery1.SQL.Add(' Select RA001,RA002,RA003,RA004,RA005 FROM CPURA Where ');
     FCPURM.ADOQuery1.SQL.Add(sSQL);
showmessage(FCPURM.ADOQuery1.SQL.text);//加上此句,看看查询语句是否正确
     FCPURM.ADOQuery1.Open;
     FCPURM.DataSource1.DataSet := FCPURM.ADOQuery1;
     //FCPURM.ADOQuery1.DataSource := FCPURM.DataSource1;
     FCPURM.DBGrid1.DataSource := FCPURM.DataSource1;
     FreeAndNil(FCPURM02);
     FCPURM.PageControl1.ActivePage:=FCPURM.TabSheet2;
     FCPURM.DBGrid1.SetFocus;
  end;
end;
 
其他的就没仔细看,应该没什么问题了,Good Luck! PS:下载档案,因设定了数据库,导致打开会长时间停顿并报错,再则因没数据表,所以没具体的测试下,您按上面的方法改进一下,看还有问题否,有的话,我再帮您测试下 <> ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-15 09:24:35 IP:61.221.xxx.xxx 未訂閱
謝謝deity。 之前的問題已解決。 不好意思, 但是當我查詢結束後,再點選一次查詢鈕。 卻發現錯誤。我利用F7去追踪。 發現是錯誤程式碼在,如下。 procedure TFCPURM.SpeedButton3Click(Sender: TObject); begin   //FCPURM02.ShowModal;   FCPURM02.Show; end; 似乎無法開啓FCPURM02表單,如改為ShowModal則畫面好像當掉。 FCPURM02.Show則是發生錯誤訊息,是否沒有結束什麼東西嗎。 錯誤訊息,如下。
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-07-15 09:47:14 IP:218.15.xxx.xxx 未訂閱
t0288542您好:那是您在
procedure TFCPURM02.SpeedButton1Click(Sender: TObject);
begin
……
 FreeAndNil(FCPURM02); //已将FCPURM02全部释放掉了,再次调用就会报错,将此句改成
    FCPURM02.Close;    ……
end;
============================ 为什么经过多年以后,得失的过程如此冷漠 ============================
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-07-15 10:25:55 IP:61.221.xxx.xxx 未訂閱
謝謝deity。 不好意思。麻煩您。 ^^
系統時間:2024-11-23 12:06:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!