-
zorik © (06.08.09 11:14) [0]Пишу свой DB Aware компонент TMyDBGrid. Отображает только одно поле из датасета. Все вроде получилось. Делал по примеру "Разработка DB-Aware компонентов". Но заметил баг. Если набор данных изменяется вследствии скролинга мастер-таблици, то связаный с подчиненой таблицей мой компонент не перерисовывается (обновляется).
Как отловить событие, которое возникает при изменении набора данных вызваных при скролинге по MasterQuery?
MasterQuery(TDBGrid) --> DetailQuery(TMyDBGrid)
Если я скролирую по MasterQuery, то изменяется содержимое DetailQuery. Как мне отловить это изменение в своем контроле TMyDBGrid. Для TDataLink есть свойство RecordChanged, которое реагирует почти на все изменениия, но как в нем отфильтровать (или может есть какое-то другое) то, что изменился именно набор данных, а не скролинг по DetailQuery
TMyDataLink = class(TFieldDataLink)
private
FMyDBGrid:TMyDBGrid;
protected
procedure ActiveChanged; override;
procedure RecordChanged(Field: TField); override;
...
end;
constructor TmmRGListDataLink.Create(AOwner: TMyDBGrid);
begin
inherited Create;
FMyDBGrid := AOwner;
end;
procedure TmmRGListDataLink.ActiveChanged;
begin
inherited;
FMyDBGrid.Repaint;
end;
procedure TmmRGListDataLink.RecordChanged(Field: TField);
begin
inherited;
- если изменился набор данных то вызвать FMyDBGrid.Repaint для перерисовки контрола TMyDBGrid
- Синхронизация пложения курсора в моем контроле с положением курсора в датасете DetailLink
end;
Собственно вопрос. Как отследить это изменение. Возможно надо использовать не TFieldDataLink, а какой-то другой -
zorik © (06.08.09 11:32) [1]переместите в раздел компоненты, плиз
-
Юрий Зотов © (06.08.09 12:39) [2]Начнем с начала - чем не устраивает стандартный TDBGrid? Никто же не мешает отображать в нем только одно поле, так зачем делать свой компонент?
-
zorik © (06.08.09 12:55) [3]Это не будет грид, я его привел для примера. Это будет наследник TCheckListBox, тоесть список с возможностью выбора елементов.
При перемещении по датасету (query.First, last, next, prev) в TCheckListBox-е выделяются соответствующие строчки, т.е. синхронизация работает -
zorik © (06.08.09 12:58) [4]
procedure TZDBCLBDataLink.RecordChanged(Field: TField);
begin
inherited;
if Assigned(Field) and (Field = DataSet.FindField(FieldName)) then
FCheckListBox.RefreshList; // -- если изменился FieldName
if ValidListField then
with FCheckListBox do // -- синхронизация
ItemIndex := Items.IndexOf(DataSet.FieldByName(FieldName).AsString);
end; -
DimaBr © (06.08.09 13:06) [5]Нарисовать галочку в гриде проще чем создавать свой компонент
-
zorik © (06.08.09 14:02) [6]она (галочка) для управления нужна, тоесть для виделения того что нужно пользователю, а не для отображения каких-то опций из БД
-
Юрий Зотов © (06.08.09 14:16) [7]TFieldDataLink обычно используется для контролов, которые отображают только только одно значение (TDBEdit и т.п.). Тот же TDBGrid использует свой DataLink. Можно посмотреть и сделать по аналогии.
-
DimaBr © (06.08.09 14:20) [8]
> для виделения того что нужно пользователю
Трудно чтоли обработать клик ? -
имя(20.10.15 19:13) [9]Удалено модератором