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

請問有關 ComboBox 的問題

尚未結案
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-15 00:36:25 IP:203.69.xxx.xxx 未訂閱
請問各位高手,我有一個部門的Table,裡面有部門編號及部門名稱兩個欄位,我現想將部門編號及部門名稱使用ComboBox 給add 進來,但我只想顯示部門名稱,在存做儲存時,只存部門編號,請問我要如何做呢?
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-15 00:39:37 IP:218.163.xxx.xxx 未訂閱
您好: 您可以使用dblookupcombobox元件, 設定listsouorce,listfield,keyfield 以這個例子來說,listfield是部門名稱,而keyfield是部門編號
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-15 00:51:03 IP:203.69.xxx.xxx 未訂閱
感謝您的回答,這個方法我知道,但因為都是使用DBEdit及Table直接連接資料庫,若在多人使用的狀況下,是否會影響效能,因此我才想使用ComboBox將部門編號及部門名稱給add進來,如果一定要使用ComboBox時能否做的出來呢?
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-15 00:58:03 IP:218.163.xxx.xxx 未訂閱
以薪資系統中的員工資料為例 員工資料表中的部門編號欄位, 若要使用dblookupcombobox來連結部門資料表 透過部門編號作keyfield,部門名稱作listfield... 若是部門沒有上千筆的話,應該不至於影響效能太多... 如果真的擔心效能,可以考慮用 dbcombobox,在formcreate的時候讀取部門資料填入 不過,這麼一來,就沒有dblookupcombobox的listfield的方便了...
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-15 01:28:07 IP:211.76.xxx.xxx 未訂閱
您好: 在存檔時做如下的動作,copy(combobox.text,1,3),假定編號長度3碼 add進來時先用另一QUERY SELECT 然後用combobox.item.add(query.fieldbyname('部門編號') query.fieldbyname('部門名稱')) 這樣子不知道您是否瞭解 ~~應無所住而生其心~~
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-15 08:33:53 IP:203.69.xxx.xxx 未訂閱
謝謝您的回答,但這樣做在ComboBox 裡會看到部門編號及部門名稱,不知能否做到把部門編號隱藏,只顯示部門名稱,但在儲存時卻存部門編號
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-15 11:47:57 IP:211.76.xxx.xxx 未訂閱
您好: 要只顯示部門名稱,但在儲存時卻存部門編號還是可以的 只要您在存檔時,用另一QUERY去SELECT,以部門名稱為查詢條件,查出來之後 將編號存入即可。 ComboBox 給add 進來===>原理相同 ~~應無所住而生其心~~
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-15 12:24:45 IP:203.69.xxx.xxx 未訂閱
謝謝您,但這不是我要的答案,這樣說吧,部門名稱是不可能有兩個,但如果以員工資料來說,就有可能是兩個員工一樣的姓名,如果這樣就不可能用姓名去做Query的動作吧,在微軟的 j# 就有我說的這個功能,它的ComboBox可以一次add兩個欄位,而且一次只顯示一個欄位,儲存時存另一個欄位,我只是想問問看Delphi可不可以做得出來,或者有那些元件可以有類似的功能
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-02-15 12:29:13 IP:211.76.xxx.xxx 未訂閱
您好: 除了DBLookupcombobox外,官方所提供的元件似乎沒有您要的功能 ~~應無所住而生其心~~
cxh17895
初階會員


發表:13
回覆:37
積分:25
註冊:2003-03-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-02-16 11:27:07 IP:210.68.xxx.xxx 未訂閱
大大,你是要這種格式嗎? 下拉選課可多個,儲存時只存一個 關鍵field
carter6
初階會員


發表:53
回覆:108
積分:42
註冊:2002-12-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-02-16 12:08:46 IP:218.170.xxx.xxx 未訂閱
您好: 你可以開兩個陣列存(部門編號和部門名稱) 說明 a[i,0] := 部門編號 a[i,1] := 部門名稱 i := combox.itemindex 把 部門名稱 Add 到 Combox 裡 這樣就可以取得 部門編號和部門名稱 了~~~
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-02-16 13:44:44 IP:210.201.xxx.xxx 未訂閱
To cxh17895 謝謝您的回答,但我的意思是要同時add 編號及名稱,但只顯示名稱,您這樣做是同時顯示編號及名稱 To carter6 謝謝您的回答,您的意思是否將部門編號及名稱存到二維陣列裡,ComboBox再從陣列add部名稱,檔選取時再到陣列裡找出編號是嗎?
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-02-16 13:52:51 IP:211.22.xxx.xxx 未訂閱
引言: 謝謝您,但這不是我要的答案,這樣說吧,部門名稱是不可能有兩個,但如果以員工資料來說,就有可能是兩個員工一樣的姓名,如果這樣就不可能用姓名去做Query的動作吧,在微軟的 j# 就有我說的這個功能,它的ComboBox可以一次add兩個欄位,而且一次只顯示一個欄位,儲存時存另一個欄位,我只是想問問看Delphi可不可以做得出來,或者有那些元件可以有類似的功能
如果是姓名相同又不顯示編號,COMBOBOX內不就會有兩ㄍ同名同姓的人,那要如何做選擇 ~~應無所住而生其心~~
carter6
初階會員


發表:53
回覆:108
積分:42
註冊:2002-12-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-02-16 13:54:34 IP:218.170.xxx.xxx 未訂閱
對阿 a[i,0] := 部門編號 當 選取了之後 把 i := combox.itemindex a[i,1] 就是 部門名稱
cxh17895
初階會員


發表:13
回覆:37
積分:25
註冊:2003-03-19

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-02-16 16:20:34 IP:210.68.xxx.xxx 未訂閱
你好: 基本上你問題若是沒理解錯誤的話,你的設計方式在存取 ComboBox 時會很麻煩 誠如其他大大所說,若是同名字,操作者在識別上會有問題。 -------- ...我有一個部門的Table,裡面有部門編號及部門名稱兩個欄位,我現想將部門編號及部門名稱使用ComboBox 給add 進來,但我只想顯示部門名稱,在存做儲存時,只存部門編號,請問我要如何做呢? ----- 以上你的要求,是可以用其他方式,但無法用 COMBOBOX 單純作到(要有一翻修改),可以在OnCloseUp 事件,下query查詢,用名稱查詢,填回代號,即可,但是若是同名資料,問題又出來了! 只顯示單一欄位,就要 "要求"使用者不可輸入同名之顯示資料,像本案例中,有多名"李正賢",若是用名字單一顯示,操作者將無法選擇!
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-02-16 16:38:13 IP:210.201.xxx.xxx 未訂閱
To cxh17895 謝謝您回答,我之所以會這樣問,是因為我在微軟的 j# 上看到有如此的功能,所以我才想 Delphi 能否做出如此的功能,我目前還不會寫 VCL 元件,如果我會寫,我就會改成我所要用的功能的元件,無論如何還是謝謝您們,真的感激不盡! To carter6 兄 我想如果要使用二維陣列的話,應該使用動態陣列吧,我回去時再做做看,有問題再來請教,謝謝您們,真的感激不盡!
Chance36
版主


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-02-18 14:39:21 IP:211.20.xxx.xxx 未訂閱
To: kwon    ComboBox.Items中除了可以儲存文字外還可以額外放個物件(TObject),利用此屬性可以達到你所說的功能
Type      TSelectItem=Class
    No : String ;
    Name:String;
  End;    procedure TForm1.Button2Click(Sender: TObject);
Var
  Si:TSelectItem ;
  i : Integer ;
begin
  If Combobox1.items.Count =0 Then Begin
    // 加入Items的內容
    Si := TSelectitem.Create;
    Si.No   := 'No:1';
    Si.Name := 'Name:1';
    Combobox1.Items.AddObject(Si.No,Si);
    Si := TSelectitem.Create;
    Si.No   := 'No:2';
    Si.Name := 'Name:2';
    Combobox1.Items.AddObject(Si.No,Si);
  End Else Begin
    If Combobox1.ItemIndex <> -1 Then Begin
      Si := TSelectItem(Combobox1.Items.Objects[Combobox1.ItemIndex]) ;
      ShowMessage(Si.Name);
      Si := nil ;
    End;
    // 清除內容
    For i:= Combobox1.Items.Count-1 Downto 0 Do Begin
      TSelectItem(ComboBox1.Items.Objects[i]).Free;
      Combobox1.Items.Delete(i);
    End;
  End;    end;
其中 的TSelectItem 我使用物件而不用Record,是因為Record與TObject的轉換我不會,如果可以用Record的話,對記憶體的使用可以少一些,
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-02-18 17:15:12 IP:210.201.xxx.xxx 未訂閱
To Chance36 謝謝您,這就是我一直想要的功能,但您是否能教我一次把一個 Table 的資料給加到這個 si 的物件呢?
Chance36
版主


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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-02-18 17:40:54 IP:211.20.xxx.xxx 未訂閱
    // 先清除內容()
    For i:= Combobox1.Items.Count-1 Downto 0 Do Begin
      TSelectItem(ComboBox1.Items.Objects[i]).Free;
      Combobox1.Items.Delete(i);
    End;
   // 加入Items的內容
    Table1.First;
    Whilt Not Table1.Eof Do Begin
      Si := TSelectitem.Create;
      Si.No   := Table1.FieldByname('No').AsString;
      Si.Name := Table1.FieldByname('Name').AsString;
      Combobox1.Items.AddObject(Si.No,Si);
      Table1.Next;
    End;
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-02-22 09:42:39 IP:203.69.xxx.xxx 未訂閱
真對不起,這晚才來回覆,因為我在寫這個程式及在尋找錯誤,我發現如果將它寫成procedure 就沒有作用,我將我的程式碼貼上來,請您們幫我看看那裡錯了,謝謝! unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, DBTables, StdCtrls; type TSelectItem = Class No : String; Name : String; end; type TForm1 = class(TForm) ComboBox1: TComboBox; Query1: TQuery; Database1: TDatabase; procedure DptAdd; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Dpt : TSelectItem; implementation {$R *.dfm} procedure TForm1.DptAdd; var I:Integer; begin Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('Select Dep_ID, Dep_Name from DEPARTMENT'); Query1.Open; for i:= ComboBox1.Items.Count-1 Downto 0 Do begin TSelectItem(ComboBox1.Items.Objects[i]).Free; ComboBox1.Items.Delete(i); end; // 加入Items的內容 Query1.first; While Not Query1.Eof Do begin Dpt := TSelectitem.Create; Dpt.No := Query1.Fields[0]; Dpt.Name := Query1.Fields[1]; //FieldByname('Dep_Name').AsString; ComboBox1.Items.AddObject(Dpt.Name,Dpt); Query1.Next; end; end; procedure TForm1.FormShow(Sender: TObject); begin DptAdd; end; end.
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#21 引用回覆 回覆 發表時間:2004-02-22 10:38:41 IP:218.163.xxx.xxx 未訂閱
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Query1: TQuery;
    Database1: TDatabase;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    procedure DptAdd;
  public
    { Public declarations }
  end;    
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#22 引用回覆 回覆 發表時間:2004-02-22 11:21:33 IP:203.69.xxx.xxx 未訂閱
謝謝 hahalin 回答,但還是沒有作用耶!不知為什麼?
TATSU
版主


發表:50
回覆:135
積分:62
註冊:2003-01-16

發送簡訊給我
#23 引用回覆 回覆 發表時間:2004-02-22 16:26:03 IP:203.218.xxx.xxx 未訂閱
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, StdCtrls;    type
  TSelectItem = Class
    No   : String;
    Name : String;
  end;    type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Query1: TQuery;
    Database1: TDatabase;
    procedure DptAdd;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;
  Dpt : TSelectItem;
  
implementation    {$R *.dfm}    procedure TForm1.DptAdd;
begin       qryDept.Close;
   qryDept.SQL.Clear;
   qryDept.SQL.Add('Select Dep_ID, Dep_Name from DEPARTMENT ORDER BY Dep_Name');
   qryDept.Open;
   ComboBox1.items.Clear ;
   ComboBox1.Items.BeginUpdate ;       // 加入Items的內容
   Query1.first;
    While Not Query1.Eof Do
    begin
      ComboBox1.Items.Add(qryDept.Fields[1].AsString) ;
      qryDept.Next;
    end;
    ComboBox1.items.EndUpdate ;
end;    procedure TForm1.FormShow(Sender: TObject);
begin
   DptAdd;
end;    end.        //你不論如何選擇,你的 Combobox1 都會傳來一個數值,ComboBox1.ItemIndex 。    //你要找出 department number 不難:
//Combobox 的 itemindex 由零開始
//query 的 record number 由一開始    qryDept.RecNo := ComboBox1.ItemIndex   1 ; // 去到指定的 record     strDepNo := qryDept.Fields[0].AsString ; //抓取要用的 department number    //你已經拿到要用的 department number 了
這個程式運行時,你的 query 不要關閉,那你一定可以找到你要的 department number 。 發表人 - TATSU 於 2004/02/22 16:33:28
kwon
一般會員


發表:14
回覆:64
積分:22
註冊:2002-08-08

發送簡訊給我
#24 引用回覆 回覆 發表時間:2004-02-22 18:05:20 IP:203.69.xxx.xxx 未訂閱
謝謝 TATSU 熱心的回答,我的問題已解決了,只有 Chance36 的回答才是我要的答案,再次的謝謝大家,感激不盡!
系統時間:2024-06-29 16:58:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!