![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите!!! :)
Andrey196 © (2001-12-23 19:49:00)Мне нужно чтобы в комбобокс.items заносилось поле из БД
и при выборе из списка индекс БД вставал на выбранную запись.
СПАСИБО!!!!!!
DiggerAbstract (2001-12-24 12:57:00) [1]а DBLookUpComboBox тебе не подойдет?
AlexSV (2001-12-24 12:13:00) [2]Я тоже столкнулся с этой проблемой.
Сначала использовал для этих целей TDBLookupComboBox, в котором
свойства DataSource и DataField не инициальзаровал. Вообщем работало,
пока не поставил этот режим на Master, у которого был Detail, который
в свою очередь был Master. Стало тормозить.
Оказалось, что TDBLookupComboBox при выпадании списка переоткрывает
запрос дважды (ну и соответственно все подчиненные).
При этом, когда бегаешь по выпавшему списку скроллом, то он не отключает механизм Master-Detail, что тоже тормозит.
Собственно решений я не нашел (или плохо искал).
Первое, что я сделал, это в Tag TComboBox-а записал указатель на DataSet.
Вот так:
procedure SetDataSetToComboBox(cb : TComboBox; ds : TDataSet);
begin
cb.Tag := LongInt(ds);
end;
Далее организовал заполнение ComboBox-а соответствующими значениями поля
из набора:
function FillComboBoxList(cb : TComboBox; DispField : string): Integer;
var
qInCB : TQuery;
begin
Result := 1;
if (cb.Tag < 0) then begin
Result := 0;
Exit;
end;
qInCB := TQuery(cb.Tag);
if qInCB.Active then
qInCB.Close;
if (InitQueryParams(qInCB) > 0) then with qInCB do begin
qInCB.Open;
if (FindField(DispField) = nil) then begin
Result := -1;
Exit;
end;
cb.Clear;
if RecordCount > 0 then begin
First;
while not Eof do
begin
cb.Items.AddObject(FieldByName(DispField).AsString, GetBookmark);
Next;
end;
cb.ItemIndex := 0;
GotoBookmark(cb.Items.Objects[0]);
cb.Enabled := True;
end else begin
cb.Enabled := False;
end;
end;
end;
И, наконец, в самом ComboBox-е на OnChange:
procedure TForm.cbChange(Sender: TObject);
var
dsInCB : TDataSet;
cb: TComboBox;
begin
if not (Sender is TComboBox) then
Exit;
cb := (Sender as TComboBox);
dsInCB := TDataSet((Sender as TComboBox).Tag);
dsInCB.GotoBookmark(cb.Items.Objects[cb.ItemIndex]);
// Здесь можно выполнять еще дополнительные действия
end;
Основное, на что надо обращать внимание при этом:
1. Переоткрытие запроса должно отслеживать перезаполнение ComboBox-а,
или его Text-а в случае удаления записи из DataSet-а.
2. Синхронизация DataSet-а с другими, и соответственно переход на
активную запись в самом ComboBox-е.
Когда это все надоело, то для себя слепил компонент.
Если будет интерес, то пиши на мой ящик.
Пока.
Сергей Иванов (2001-12-24 10:00:00) [3]//дополню ответ Atrem
//заполнение. например, в обработчике FormCreate
with MainData.Table do begin
if not Active then Open;
First;
while not EOF do begin
MyCombo.Items.Add(FieldByName("Name").AsString);
Next;
end; {while not EOF}
end; {MainData.Table}
//позиционирование
if not MainData.Table.Locate("Name", MyCombo.Text, []) then exit {не нашли?}
//инкрементный поиск можно сделать, навесив обработчик на MyComboKeyPress, хорошй пример есть в хелпе.
//более простой вариант - взять из кладовки компонент TFieldFinder.
Turalyon (2001-12-24 09:37:00) [4]Я что то не понял, что надо заносить столбцы (названия) или строки (поля из записей)????
Atrem (2001-12-23 22:25:00) [5]Занести данные в комбобокс
yourtable.first;
while not eof(yourtable) do begin
combobox.items.add(yourtable.field.value);
yourtable.next;
end;
А встать на выбранную запись можно с помощью метода locate,правда если поле заносимое в комбобокс уникальное
А вообще мне кажется лучше использовать DBlookupcombobox
Andrey196 (2001-12-23 21:08:00) [6]У меня есть база данных там есть много столбцов,
Мне нужно все запись одного столбца запихнуть в combobox (желательно автоматически) и при выборе из списка combobox указатель таблици должен встать на выбранную запись
Light Elf (2001-12-23 20:56:00) [7]Может я и где, но вопроса не понял.
Andrey196 (2001-12-23 20:37:00) [8]ТУТ ВОБЩЕ PEOPLE LIFE ЕСТЬ ИЛИ ВСЕ DEAD!!!!!