Подскажите, пожалуйста, как создать компоненту наследник от TTable, в которой при скроллинге по мастер таблице, информация в подчинённой отображается с задержкой (задержка задается пользователем).
Уже весь измучился. Помогите!!!
Здравствуйте 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.
Проблема только одна — есть шанс, что пользователь переключит фокус ввода в подчиненную сетку, а она все еще не обновила датасет. Че-то пока не смог я перехватить такую ситуацию не переписывая грид. Выше закомментированный код содержит попытки забабахать это.