Заполнение TComboBox из TDataSet

Иногда необходимо заполнить TComboBox данными из DataSet, сопоставив каждое значение определенному индексу или другому значению. Обычно, это статичные данные, которые за время работы программы не должны меняться, например, названия кабинетов и сопоставленные им индексы в базе данных или другое значение.

unit rlComboBD;

interface

uses Windows, SysUtils, DB, Classes;

type
  TIDD = class
    IntData: integer;
    StrData: string;
  end;

procedure rewFillStrings(AList: TStrings; DataSet: TDataSet;
 AIDField: string = 'null'; ANameField: string = 'null'; 
 ASTRField: string = 'null');

implementation

// универсальная процедура заполнения comboboxs
procedure rewFillStrings(AList: TStrings; DataSet: TDataSet;
  AIDField: string; ANameField: string; ASTRField: string);
var
  idd: tidd;
  irec: integer;
begin
  irec := 0;
  with DataSet do
  begin
    //prepare update
    AList.BeginUpdate;
    AList.Clear;
    DisableControls;
    // close active dataset
    if Active then Close;
    try
      open;
      while not EOF do
      begin
        AList.Add(FieldByName(ANameField).AsString);
        idd := tidd.create;
        if AIDField <> 'null' then
          idd.IntData := FieldByName(AIDField).value
        else
          idd.IntData := -1;

        if ASTRField <> 'null' then
          idd.StrData := FieldByName(ASTRField).AsString
        else
          idd.StrData := '';
        AList.Objects[IRec] := idd;
        inc(irec);
        next;
      end;
    finally
      EnableControls;
      AList.EndUpdate;
    end;
  end;
end;

end.

Как это использовать?
Например у нас есть таблица (набор данных) вида:

CODE_INT NAMESTR CODE_STR
1001 Зал 1 Первый этаж
1002 Зал 2 Первый этаж
1003 Зал 3 Второй этаж

При вызове функции:

rewFillStrings(ComboBox1.Items,pFIBDataSet1,'CODE_INT', 'NAMESTR','CODE_STR');

Где ‘CODE_INT’, ‘NAMESTR’, ‘CODE_STR’ название полей в датасете.

При этом Combobox очистится и заполнится строками из ‘NAMESTR’.

Каждой строке будет сопоставлено int и string значения, которые можно будет использовать следующим образом:
для string

TIDD(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).StrData

для integer

TIDD(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).IntData

Благодаря этому, мы можем сопоставить выбранному полю в TComboBox индекс значения в БД или его некоторое текстовое значение не совершая лишний запрос к БД. После заполнения, коннект к БД можно закрыть.

Comments are closed