компонент наследник от TTable
От: Chad  
Дата: 06.06.02 11:17
Оценка:
Подскажите, пожалуйста, как создать компоненту наследник от TTable, в которой при скроллинге по мастер таблице, информация в подчинённой отображается с задержкой (задержка задается пользователем).
Уже весь измучился. Помогите!!!
Re: компонент наследник от TTable
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.06.02 21:04
Оценка:
Здравствуйте Chad, Вы писали:

C>Подскажите, пожалуйста, как создать компоненту наследник от TTable, в которой при скроллинге по мастер таблице, информация в подчинённой отображается с задержкой (задержка задается пользователем).

C>Уже весь измучился. Помогите!!!
Хороший вопрос. Вижу два основных варианта:
1. Написать свой потомок TTable, который будет задерживать извещение визуальных компонентов, приделанных к нему, об изменении мастера. Использовать его для подчиненной таблицы.
2. Переписать TDBGrid чтобы он замедленно реагировал на то же самое.
Щас попробую накропать что-то вроде варианта 1 — он выглядит проще. Результат опубликую.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: компонент наследник от TTable
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.06.02 22:49
Оценка:
Здравствуйте Chad, Вы писали:

C>Подскажите, пожалуйста, как создать компоненту наследник от TTable, в которой при скроллинге по мастер таблице, информация в подчинённой отображается с задержкой (задержка задается пользователем).

C>Уже весь измучился. Помогите!!!
В общем, сделал. Вот код:
unit DelayedDetailTable;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, ExtCtrls, Forms, Dialogs,
  Db, DBTables;

type
  TDDataSource = class(TDataSource)
  end;

  TDelayedDetailTable = class(TTable)
  private
    FMasterChangeDelay: Cardinal;
    FOldMasterChangedProc: TNotifyEvent;
    FMasterNotifyTimer: TTimer;
  protected
    procedure NotifyDBGrids;
    procedure TimeToUpdate(Sender:TObject);
    procedure NewMasterChanged(Sender: TObject);
  public
    Constructor Create(AOwner: TComponent); override;
{    procedure Resync(Mode: TResyncMode); override;
    procedure CheckActive; override;}
  published
    property MasterChangeDelay: Cardinal read FMasterChangeDelay write FMasterChangeDelay default 0;
  end;

procedure Register;

implementation
uses DBGrids;

procedure Register;
begin
  RegisterComponents('Samples', [TDelayedDetailTable]);
end;

{ TDelayedDetailTable }
{
procedure TDelayedDetailTable.CheckActive;
begin
  inherited;
end;}

constructor TDelayedDetailTable.Create(AOwner: TComponent);
begin
  inherited;
  FOldMasterChangedProc:= MasterLink.OnMasterChange;
  MasterLink.OnMasterChange:= NewMasterChanged;
end;

procedure TDelayedDetailTable.NewMasterChanged(Sender: TObject);
begin
  // Set the timer to call the old proc;
  FreeAndNil(FMasterNotifyTimer);
  FMasterNotifyTimer:= TTimer.Create(self);
  NotifyDBGrids;
  with FMasterNotifyTimer do begin
    Interval:= MasterChangeDelay;
    OnTimer:= TimeToUpdate;
  end;
end;

procedure TDelayedDetailTable.NotifyDBGrids;
var
  I: integer;
begin
{  with TDDataSource(DataSource) do
  for i:= 0 to DataLinks.Count-1 do
  begin
    if TDataLink(DataLinks[i]) is TGridDataLink then TGridDataLink(DataLinks[i]).Modified;
  end;}
end;
{
procedure TDelayedDetailTable.Resync(Mode: TResyncMode);
begin
  inherited;
end;}

procedure TDelayedDetailTable.TimeToUpdate(Sender: TObject);
begin
  FreeAndNil(FMasterNotifyTimer);
  FOldMasterChangedProc(Sender);
end;

end.

Проблема только одна — есть шанс, что пользователь переключит фокус ввода в подчиненную сетку, а она все еще не обновила датасет. Че-то пока не смог я перехватить такую ситуацию не переписывая грид. Выше закомментированный код содержит попытки забабахать это.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.