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

ComboBox的AddObject及IndexOfObject要怎麼對應?

答題得分者是:h@visli
Sei
一般會員


發表:22
回覆:38
積分:17
註冊:2002-05-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-29 14:30:37 IP:61.221.xxx.xxx 未訂閱
請教前輩們: 我用一個DBGrid、一個ComboBox DBGrid裡的第一欄資料是長這樣: 900-1 900-2 900-3 900-4 900-5 901-1 901-2 901-3 902-1 902-2 902-3    ComboBox Items的資料: 全部   (ComboBox.ItemIndex = 0) 900系列(ComboBox.ItemIndex = 1) 901系列(ComboBox.ItemIndex = 2) 902系列(ComboBox.ItemIndex = 3)    DBGrid在移動資料時,會對應到ComboBox(ex:DBGrid指到901-1,ComboBox會對到901系列) 因目前測試資料量算少,所以我都是用迴圈方式去判斷前三碼 正式資料十來萬筆,如果用迴圈去對應ComboBox,會看到ComboBox掃瞄的情況,效率也不好 我有上網找了一下ComboBox.Items.AddObject的方法 http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200309_03090043.html http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N023.html    並且做了小小測試
procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.Items.AddObject('900 Ser',TObject(NewStr('900')));
  ComboBox1.Items.AddObject('901 Ser',TObject(NewStr('901')));
  ComboBox1.Items.AddObject('902 Ser',TObject(NewStr('902')));
  ComboBox1.Items.AddObject('903 Ser',TObject(NewStr('903')));
end;
  
procedure TForm1.ComboBox1Change(Sender: TObject);
var
  Idx: Integer;
  Ser: String;
begin
  Idx := ComboBox1.ItemIndex;
  Ser := PString(ComboBox1.Items.Objects[Idx])^;
  Label1.Caption  := Ser;
end;  
以上測試是OK,可以讀到Object的900、901、902、903 可是……可是~~我要怎麼在DBGrid在移動資料時對應回去到ComboBox的Object?? 如果是用ComboBox1.Items.IndexOfObject,可否麻煩前輩提示我一下,TOjbect是什麼?? 謝謝~
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-29 17:35:47 IP:222.248.xxx.xxx 未訂閱
首先讓我來回答您最後一個問題“TOjbect是什麼??” TObject是所有對象與組件的最基礎的繼承對象,所有的對象與組件都是直接或間接的繼承於TObject。更詳細的解釋您可以查看Delphi的幫助文件。 TCombobox組件的Items屬性是個TString對象,它有AddObject這個方法可以用來關聯更複雜的對象,以保存更豐富的數據結構與內容。 但我感覺在您的這個應用中,使用AddObject方法來解決,似乎不太合適,因為最終也還得用循環的方式來定位選擇TCombobox中的顯示項。 我提供一個可能更方便的方法供您借鑒一下:在您的數據表中,增加一個列,以保存第一欄與Combobox組件的ItemIndex關係: 900-1 1 900-2 1 900-3 1 900-4 1 900-5 1 901-1 2 901-2 2 901-3 2 902-1 3 902-2 3 902-3 3 這樣就可以使用下面的方法來操作了: procedure TForm1.Table1AfterScroll(DataSet: TDataSet); begin Combobox1.ItemIndex := table1.Fields[1].AsInteger; end; 另外,如果您不希望在數據表中增加一欄,也可以直接在DBGrid添加一欄,方法也一樣。
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
wameng
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-29 22:05:17 IP:61.31.xxx.xxx 未訂閱
如果用迴圈去對應ComboBox,會看到ComboBox掃瞄的情況,效率也不好? 無法理解?什麼叫做 ComboBox掃瞄 ? 另外 IndexOfObject 本身也是用迴圈處理效率不會比較好。 若是要更改 Combobox.Items 內容 一般可用 BeginUpdate .... EndUpdate 來避免每次均觸發 OnChange 事件。 TOjbect 可以視為一個物件或是Class。 在此您以把它當作 指針用途,用來存放 900...的資料。 您這樣的需求,使用這樣的方式感覺有點小題大作。可能也於事無補。 Items.AddObject 主要讓 Items 有兩個值。 一個是顯示的項目,Object 可以說是項目的內容。 另亦可參考 h@visli 兄的作法。 參考 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
Sei
一般會員


發表:22
回覆:38
積分:17
註冊:2002-05-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-29 23:04:29 IP:220.134.xxx.xxx 未訂閱
首先感謝二位前輩的回答 在問題裡的「ComboBox1.Items.IndexOfObject,可否麻煩前輩提示我一下,TOjbect是什麼??」,是我打太快了 我是想要知道 class="code"> for i := 0 to ComboBox1.Items.Count-1 be begin ComboBox1.ItemIndex := i; if Copy(ComboBox1.Items[i],1,3)=Copy(FieldByName('XXX').AsString,1,3) then break; end; 造成每次點選,ComboBox1都要從頭到尾比對,user會看到ComboBox1從頭一直跑到600Ser,或從頭一直跑到900,覺得很奇怪,所以才想有沒有那種馬上可以比對到的方法或元件,也很謝謝您的建議
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-30 10:52:43 IP:222.248.xxx.xxx 未訂閱
引言: 我是想要知道ComboBox1.Items.IndexOfObject(AObject: TObject)的TObject該放什麼值
(AObject: TObject)這裡的AObject指示為TObject類型,也就是說可以放任何對象。衹要它的直接或間接繼承於TObject,如組件、您自己定義的對象等。
引言:
for i := 0 to ComboBox1.Items.Count-1 be
begin
  ComboBox1.ItemIndex := i;
  if Copy(ComboBox1.Items[i],1,3)=Copy(FieldByName('XXX').AsString,1,3) then 
    break;
end;
造成每次點選,ComboBox1都要從頭到尾比對,user會看到ComboBox1從頭一直跑到600Ser,或從頭一直跑到900,覺得很奇怪,所以才想有沒有那種馬上可以比對到的方法或元件,也很謝謝您的建議
您這段代碼寫法有點不妥,應該改成下面的寫法:
for i := 0 to ComboBox1.Items.Count-1 be
begin
  if Copy(ComboBox1.Items[i],1,3)=Copy(FieldByName('XXX').AsString,1,3) then 
  begin
    ComboBox1.ItemIndex := i;
    break;
  end;
end;
---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
系統時間:2024-11-23 8:32:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!