Конференция "Компоненты" » свой DBAware компонент
 
  • 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]
    Удалено модератором
 
Конференция "Компоненты" » свой DBAware компонент
Есть новые Нет новых   [134427   +34][b:0][p:0.001]