Форум: "Базы";
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];
ВнизПомогите!!! :) Найти похожие ветки
← →
AlexSV (2001-12-24 12:13) [7]Я тоже столкнулся с этой проблемой.
Сначала использовал для этих целей 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-е.
Когда это все надоело, то для себя слепил компонент.
Если будет интерес, то пиши на мой ящик.
Пока.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c