Один из вариантов решения задачки.
Нет нужды применять два комбобокса (один для текста, другой для идентификатора). ID может храниться в том же комбобоксе что и текст.
Код:
procedure TFormPacient.OblastChange(Sender: TObject);
var IDObl:Integer;
begin
IDOblast.itemIndex:=Oblast.ItemIndex;
IDObl:=StrToInt(IDOblast.Text);
PacientCity.Open;
City.clear;
PacientCity.First;
while not PacientCity.Eof do begin
City.AddItem(PacientCity.FieldValues['NCity'],
TObject(PacientCity.FieldValues['IDCity']));
PacientCity.next;
end;
City.itemindex:=0;
PacientCity.Close;
end;
//получения сохраненного значения ID:
// if City.ItemIndex > -1 then
// IDCity := Integer(City.Items.Objects[City.ItemIndex]);
Если IDObl переменная целого типа (Integer), то ее значение в запросе необходимо конвертировать в строку (SQL запрос - это текст)
Код:
'where IDOblast='+IntToStr(IDObl)
Если запрос сформирован в редакторе, то IDObl должен быть параметром:
Код:
select IDCity,IDOblast, NCity
from City
where IDOblast = :IDObl
order by NCity
И перед открытием датасета нужно присвоить этому параметру значение:
Код:
DS.ParamByName('IDObl').Value := IDObl; //имена параметров и переменных не обязательно должны совпадать