ComboBox的AddObject及IndexOfObject要怎麼對應? |
答題得分者是:h@visli
|
Sei
一般會員 發表:22 回覆:38 積分:17 註冊:2002-05-22 發送簡訊給我 |
請教前輩們:
我用一個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 發送簡訊給我 |
首先讓我來回答您最後一個問題“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 發送簡訊給我 |
如果用迴圈去對應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 發送簡訊給我 |
首先感謝二位前輩的回答
在問題裡的「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 發送簡訊給我 |
引言: 我是想要知道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之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |