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

有關 DBComboBox & DBGrid 之間的聯結

尚未結案
cklu
一般會員


發表:19
回覆:18
積分:7
註冊:2005-05-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-15 18:22:52 IP:140.130.xxx.xxx 未訂閱
我想做一個「查詢」的程式 … 可是不知道如何做    << 問題 一 >> 如下圖,假如想將下表單(一)中「作者」那一欄的資料,新增至 DBComboBox 的選項裡面,而且只要表單(一)的資料一變動, DBComboBox 裡面的選項也跟著變,那我要怎麼做?      << 問題 二 >> 接上個問題,假如點選 DBComboBox 中的一個選項,根據那選項,找出與表單(二)符合,而show出表單(二)的資料,那要怎麼做呢?
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-15 18:52:00 IP:202.62.xxx.xxx 未訂閱
您好﹗    DBComboBox是屬于資料感知元件﹐所以不太适合使用在這樣的要求環境下﹐您可改用ComboBox元件(Standard元件頁)﹐相關程式碼如下﹕
假設Table1對應表單一的資料表﹐在Form中加入一個Query元件﹐設定相關的上游Database屬性相同于Table1
問題一﹒
procedure TForm1.FormCreate(Sender: TObject);
//此為Form1元件的OnCreate事件
begin
  ComboBox1.Items.Clear;
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select Distinct(作者) From 資料表名稱');
  //以上SQL語句中的'資料表名稱'請換成您實際的資料表名稱
  Query1.Open;
  While Not Query1.Eof do
  begin
    ComboBox1.Item.Add(Table1.FieldByName('作者').AsString);
    Query1.Next;
  end;
end;
將以上程式碼共享在Table1元件的AfterPost事件和AfterDelete事件中﹒    問題二﹒
假設Table2對應表單二的資料表
procedure TForm1.ComboBox1Change(Sender: TObject);
//此為ComboBox1元件的OnChange事件
begin  
  if ComboBox1.Text = '' then
    begin
      Table2.Filtered := False;
    end
  else
    begin
      Table2.Filtered := False;
      Table2.Filter := ComboBox1.Text;
      Table2.Filtered := True;
    end;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================ 發表人 - cashxin2002 於 2005/06/15 18:52:47
------
忻晟
cklu
一般會員


發表:19
回覆:18
積分:7
註冊:2005-05-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-15 19:04:13 IP:140.130.xxx.xxx 未訂閱
假設Table1對應表單一的資料表﹐在Form中加入一個Query元件﹐設定相關的上游Database屬性相同于Table1 ==> 是在Form中加入Table和Query元件嗎?    將以上程式碼共享在Table1元件的AfterPost事件和AfterDelete事件中﹒ ==> 那是什麼意思? ,是要將程式碼貼在哪?
cklu
一般會員


發表:19
回覆:18
積分:7
註冊:2005-05-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-15 20:09:54 IP:140.130.xxx.xxx 未訂閱
您好!    關於下圖的問題...  [Error] Unit3.pas(100): Undeclared identifier: 'Item' 我已在Table1元件的AfterPost事件和AfterDelete事件中做編輯了,為什麼還會這樣呢?    
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-15 20:14:22 IP:202.62.xxx.xxx 未訂閱
您好﹗    就Table1元件的AfterPost事件和AfterDelete需共享Form1的OnCreate事件程式碼的意思就是指﹕ 雙擊Table1元件的AfterPost事件﹐開啟程式碼輸入區域﹐然后將Form1的OnCreate事件中所有的程式碼复制到這個區域中﹒ 雙擊Table1元件的AfterDelete事件﹐開啟程式碼輸入區域﹐然后將Form1的OnCreate事件中所有的程式碼复制到這個區域中﹒ 注意﹕開啟任何事件的程式碼輸入區域時﹐其已經包含beginend;的程式碼﹐所以要注意不要重复beginend;了﹐可以先刪除掉﹐然后再貼進來﹒ ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
cklu
一般會員


發表:19
回覆:18
積分:7
註冊:2005-05-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-15 20:35:03 IP:140.130.xxx.xxx 未訂閱
您好!    雙擊Table1元件的AfterPost事件﹐開啟程式碼輸入區域﹐然后將Form1的OnCreate事件中所有的程式碼复制到這個區域中﹒    ==> 這樣的話,就有三個 ↓ 的程式碼相同,是嗎? procedure TForm1.FormCreate(Sender: TObject); procedure TForm1.Table1AfterDelete(DataSet: TDataSet); procedure TForm1.Table1AfterPost(DataSet: TDataSet);    如果是的話,那我也那樣做了,但跑出錯誤訊息 ... 那是什麼意思啊??    < >< >
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-15 21:13:39 IP:202.62.xxx.xxx 未訂閱
您好﹗    沒有錯﹐您的理解是對的﹐再舉個例子來講﹐如下程式碼中﹐紅色部分不需要复制﹐藍色部分需要复制﹕
procedure TForm1.FormCreate(Sender: TObject);
//此為Form1元件的OnCreate事件
begin
  ComboBox1.Items.Clear;
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select Distinct(作者) From 資料表名稱');
  //以上SQL語句中的'資料表名稱'請換成您實際的資料表名稱
  Query1.Open;
  While Not Query1.Eof do
  begin
    ComboBox1.Item.Add(Table1.FieldByName('作者').AsString);
    Query1.Next;
  end;
end;    比如說复制到Table1元件的AfterPost事件中﹕
procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin
  //复制到這里
end;    比如說复制到Table1元件的AfterDelete事件中﹕
procedure TForm1.Table1AfterDelete(DataSet: TDataSet);
begin
  //复制到這里
end;
您之前貼出的錯誤信息﹐修正如下﹕ ComboBox1.Items.Add('....略'); 第二個貼圖的錯誤信息是指找不到Table1對應資料表中的'作者'欄位﹐檢查一下Table1對應的資料表是否正确﹐其中的'作者'欄位名稱是否打錯﹒ ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================ 發表人 - cashxin2002 於 2005/06/15 21:15:42
------
忻晟
cklu
一般會員


發表:19
回覆:18
積分:7
註冊:2005-05-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-15 21:34:06 IP:140.130.xxx.xxx 未訂閱
您好! 我有設下面三個元件,及其屬性,這樣對嗎? Books --> 資料庫名稱 Writer --> 表單名稱 Table1 --> DatabaseName (Books) & TableName (Writer) DataSource1 --> DataSet (Table1) Query1 --> DatabaseName (Books) & DataSource (DataSource1) 發表人 - cklu 於 2005/06/15 21:35:20
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-15 21:41:49 IP:202.62.xxx.xxx 未訂閱
您好﹗    對滴﹗    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
cklu
一般會員


發表:19
回覆:18
積分:7
註冊:2005-05-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-15 21:52:22 IP:140.130.xxx.xxx 未訂閱
您好!    雖然它是對的,可是...就是它還是會出現剛剛的那個錯誤 ==> 錯誤信息是指找不到Table1對應資料表中的'作者'欄位    我的欄位沒打錯啊 ~~~~~~~  為什麼會這樣子.........
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-15 21:57:01 IP:202.62.xxx.xxx 未訂閱
您好﹗    發現是我筆誤了﹐見諒﹗請見如下紅色處﹕
procedure TForm1.FormCreate(Sender: TObject);
//此為Form1元件的OnCreate事件
begin
  ComboBox1.Items.Clear;
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select Distinct(作者) From 資料表名稱');
  //以上SQL語句中的'資料表名稱'請換成您實際的資料表名稱
  Query1.Open;
  While Not Query1.Eof do
  begin
    ComboBox1.Items.Add(Query1.Fields[0].Value);
    Query1.Next;
  end;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================ 發表人 - cashxin2002 於 2005/06/15 21:58:41
------
忻晟
cklu
一般會員


發表:19
回覆:18
積分:7
註冊:2005-05-05

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-15 22:27:17 IP:140.130.xxx.xxx 未訂閱
您好!    改了之了,ComboBox 裡的選項出來了。可是當我按 ComboBox 裡的選項時, 沒有反應耶!    我是想-當我按 ComboBox 的選項("作者")時,DBGrid 會出現(table2的"作者")與(ComboBox的選項)相同的資料!    我有設 Table2 和 DBGrid,還要設其它元件嗎? Table2 --> DatabaseName (Books) & TableName (Book) DBGrid --> DataSource (???)    
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-15 22:35:54 IP:202.62.xxx.xxx 未訂閱
您好﹗    加入另外顯示Table2資料表的DataSource2和DBGrid2﹐DataSource2的DataSet屬性設為Table2﹐DBGrid2的DataSource屬性設為DataSource2﹐更改程式碼如下﹕
procedure TForm1.ComboBox1Change(Sender: TObject);
//此為ComboBox1元件的OnChange事件
begin  
  if ComboBox1.Text = '' then
    begin
      Table2.Filtered := False;
    end
  else
    begin
      Table2.Filtered := False;
      Table2.Filter := '作者=' + ''''+ComboBox1.Text+'''';
      //以上皆為單引號
      Table2.Filtered := True;
    end;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
cklu
一般會員


發表:19
回覆:18
積分:7
註冊:2005-05-05

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-15 22:49:03 IP:140.130.xxx.xxx 未訂閱
您好! 謝謝您,可以了! 再問你一個小問題,如果我想在把form關掉時,ComboBox的選項,回到一開始的畫面<<作者姓名>>,那要怎麼寫? 我有設一個按鈕↓,當form結束時,table2先不要顯示,那ComboBox的部份要怎麼寫? procedure TForm3.BitBtn1Click(Sender: TObject); begin close; table2.Active:=false; end;
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-06-16 09:07:14 IP:202.62.xxx.xxx 未訂閱
您好﹗    是在Form結束的時候嗎﹖如果是的話﹐請參考如下﹕
procedure TForm3.BitBtn1Click(Sender: TObject);
begin
  Form3.close;
  //在Form3 Close的時候﹐會自動触發以下的OnClose事件
end;    procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
//此為Form3的OnClose事件﹐將以下程式碼寫在此事件中
begin
  Table1.Close;
  ComboBox1.ItemIndex := -1;
end;
================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
cklu
一般會員


發表:19
回覆:18
積分:7
註冊:2005-05-05

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