在使用 Delphi (或 VB6) 的 ADO 元件時,常見需求是將查詢結果填入 ComboBox 下拉選單。許多開發者初次嘗試會寫出如下程式碼,卻發現下拉選單裡全是重複的第一筆資料:
// 錯誤示範:游標未移動,導致每次讀到同一筆
ADOQuery1.SQL.Text := 'SELECT * FROM gps';
ADOQuery1.Open;
if ADOQuery1.RecordCount > 0 then
for i := 0 to ADOQuery1.RecordCount - 1 do
ComboBox1.Items.Add(ADOQuery1.FieldByName('name').AsString);
RecordCount 雖能取得筆數,但 游標並未自動移動。每次迴圈皆讀取當前游標位置(預設停在第一筆),故產生重複資料。
with ADOQuery1 do
begin
SQL.Text := 'SELECT * FROM gps';
Open;
if RecordCount > 0 then
begin
for i := 0 to RecordCount - 1 do
begin
// 使用 Fields 索引或 FieldByName 皆可
DW_ComboBox.Items.Add(Recordset.Fields[2].Value); // 第 3 個欄位
Recordset.MoveNext; // 關鍵:移動游標到下一筆
end;
end;
end;
DisableControls / EnableControls 避免 UI 重繪。CursorLocation = clUseClient 且 CursorType = ctStatic 或 ctKeyset,才能正確取得 RecordCount。Close 並釋放 Recordset 參考。Fields 集合索引從 0 開始,Fields[2] 即第 3 個欄位。若資料量極大,可考慮 var Arr := Recordset.GetRows(RecordCount); 一次讀入陣列,再迴圈填入控制項,減少 COM 互呼叫開銷。
掌握 MoveNext 這一關鍵步驟,即可輕鬆解決 ComboBox 重複資料問題,讓資料綁定更穩健。