Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > динамическое заполнение ComboBox из бызы данных.


Автор: gambit 14.3.2007, 11:29
грубый пример но примерно так:
На форме есть таблица dbgrid из 2 столбцов(id,ФИО), ComboBox и label.

Так вот мне надо чтоб в ComboBox появились все значения столбца фио, а при выборе, в label записывалось значение id выбранного ФИО.


 smile 

Автор: Yanis 14.3.2007, 11:33
Цитата(gambit @  14.3.2007,  12:29 Найти цитируемый пост)
Так вот мне надо чтоб

Как вижу слово надо, так и хочется ответить "Больше тебе ничего не надо?" smile
Почему бы не сипользовать TDBComboBox и TDBText?

Автор: Данкинг 14.3.2007, 11:35
Ну, циклом проходим по таблице и добавляем значения в комбик, больше никак ИМХО.

Автор: gambit 14.3.2007, 11:37
Цитата(Yanis @  14.3.2007,  11:33 Найти цитируемый пост)
Почему бы не сипользовать TDBComboBox и TDBText? 


Цитата(gambit @  14.3.2007,  11:29 Найти цитируемый пост)
чтоб в ComboBox появились все значения столбца фио


Автор: ama_kid 14.3.2007, 12:24
Что-то я не понял, видимо, проблему...
Такой код:
Код

var
 Con: TADOConnection; 
 aq:TADOQuery;

// функция:
Сon.ConnectionString:=' твоя строка подключения ';
aq.Connection:=Con;

aq.SQL.Text:='SELECT [name] FROM твоя_таблица';
try
 aq.Open;
except
end;
ComboBox1.Clear;
for i:=0 to aq.Recordcount-1 do
 begin
  ComboBox1.Items.Add(aq.Recordset.Collect[0]);
  aq.MoveNext;
 end; 

у меня никогда не вызывал проблем...

Автор: gambit 15.3.2007, 11:54
Использую код
Код

begin
ComboBox1.Clear;
form1.ADOTable1.First;
for i:=0 to form1.ADOTable1.RecordCount-1 do
begin
s:=form1.ADOTable1.Recordset.Collect[1]+' '+form1.ADOTable1.Recordset.Collect[2]+' '+form1.ADOTable1.Recordset.Collect[3];
ComboBox1.Items.Add(s);
application.ProcessMessages;
form1.ADOTable1.Next;
end;


На форме таблица

| а | b | c |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 4 | 4 |
| 5 | 5 | 5 |

После выполнения в combobox1 должно появится
1 1 1
2 2 2 
3 3 3
4 4 4
5 5 5

Запускаю и получаю
1 1 1
5 5 5
5 5 5
5 5 5
5 5 5
5 5 5

Начинаю проверять что не так, ставлю точку прерывания делаю по шагам и о чудо в итоге получаю
1 1 1
2 2 2 
3 3 3
4 4 4
5 5 5

На радостях снимаю точку, запускаю и в итоге
1 1 1
5 5 5
5 5 5
5 5 5
5 5 5
5 5 5

Снятие оптимизации кода непомогает, что это может быть? Я уже измучился.  smile  smile  smile  smile 




Автор: ama_kid 15.3.2007, 12:48
Если в дебаге на данном участке кода все нормально - вывод: скорее всего какой-то другой код еще вступает в действие и выполняет работу с комбобоксом. Приведи полностью проект...

Автор: gambit 15.3.2007, 16:00
Лови

Автор: gambit 15.3.2007, 16:28
Кстати там в реестре надо будет добавит ключ pach с путем к проге.
Просто это маленькая часть огромного комплекса. И лови то что готово от бызы данных. Она должна лежать в папке pach.

Автор: ama_kid 15.3.2007, 16:46
во-первых, из-за того, что у меня не открывалась по умолчанию таблица, я добавил еще открытие таблицы:
Код

...
ComboBox1.Clear;
try
 ADOTable1.Open;
except
end;
form1.ADOTable1.First;
...

Не совсем понятно, почему у тебя она открывается, ну да ладно...
Во вторых: замени 
Код
form1.ADOTable1.Next;

на 
Код
form1.ADOTable1.MoveBy(1);

Должно заработать...

Добавлено:
Нет, нифига, чо-та не хочет... Копаем дальше... Вообще е совсем правильная концепция - использование TADOTable для получения информации...

Добавлено @ 16:58 
А, блин...
Надо использовать конструкцию типа:
s:=form1.ADOTable1.Fields[1].AsString +' '+form1.ADOTable1.Fields[2].AsString+' '+form1.ADOTable1.Fields[3].AsString;

Автор: gambit 15.3.2007, 17:13
Цитата(ama_kid @  15.3.2007,  16:46 Найти цитируемый пост)
s:=form1.ADOTable1.Fields[1].AsString +' '+form1.ADOTable1.Fields[2].AsString+' '+form1.ADOTable1.Fields[3].AsString;

Лови +


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)