Вы делаете это излишне трудным из-за структуры вашего кода. Вместо этого попробуйте что-то вроде этого:
Откройте ADOQuery1, ВЫБЕРИв все его содержимое, например,
procedure TForm4.OpenCitiesTable;
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select City from City');
ADOQuery1.Open;
end;
, и оставьте его открытым, пока пользователь выполняет любые операции, которые приводят к желанию добавить новый город.
Затем, когда пользователи хотят добавить город, вызовите эту процедуру, например, указав значение City из Form5.DBEdit1.Text.
procedure TForm4.AddCity(ACity : String);
begin
ACity := Trim(ACity); // remove any leading or trailing blanks
// Do any formatting checks on ACity here, re.g convert it to Proper case
// check for adding a duplicate
if ADOQuery1.Locate('City', ACity, []) then begin
ShowMessageFmt('%s is already in the City table', [ACity]);
Exit;
end;
try
ADOQuery1.Insert;
ADOQuery1.FieldByName('City').AsString := ACity;
finally
ADOQuery1.Post;
// at this point you might want to refresh the contents of whatever source
// you are populating Form5.DBEdit1.Text from
end;
end;
Я предполагаю, что вы можете настроить код, относящийся к TForm4.Query_spe c самостоятельно;
Кстати, вы можете рассмотреть возможность использования TDBLookUpComboBox вместо вашего DBEdit1.