分数大放送了!(100分)

  • 主题发起人 主题发起人 海风吹
  • 开始时间 开始时间

海风吹

Unregistered / Unconfirmed
GUEST, unregistred user!
我在这里想吧TTable的open方法覆盖掉
我建了一个类,并把这个方法重载,结果不行?
请问什么原因?
谢谢,有其他解决方法嘛?比如修改vcl源码?
type
TMyTable = class(TTable)
procedure Open ;
end;

var
Form1: TForm1;
MyTable :TMyTable ;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin
MyTable := TMyTable.Create(self);
MyTable.databasename := 'bbb';
MyTable.Tablename := 'reader';
DAtasource1.DataSet := MyTable;
MyTable.Active := true ;
MyTable.open;
end;

{ TMyTable }

procedure TMyTable.Open;
begin
inherited;
showmessage('hi,everyone');
end;

 
为什么不响应BeforeOpen事件呢?
procedure TForm1.Table1BeforeOpen(DataSet: TDataSet);
begin
showmessage('hi,everyone');
end;
 
你的应该是AfterOpen事件
procedure TForm1.Table1AfterOpen(DataSet: TDataSet);
begin
showmessage('hi,everyone');
end;
 
你那样做也可以。不过你的先弄清楚
Active和Open的关系。
程序中调用Open时,实际是将Active设置为True;
设置Active时触发SetActive过程。
>>MyTable.Active := true ;
>>MyTable.open;
所以你的代码用重复。
第一句不会调用Open。但第二句会调用SetActive。
当你使用第一句时,你的Open方法永远不会被执行。
当你使用第二句时,你的程序正确(我已经测试了)。


 
我看了那个Open方法
不是虚拟的抽象的
是不是也可以继承呢?
 
可以啊,你的MyTable1.Open是正确的啊。
但你的MyTable1.Active := True不会调用
MyTabel1的Open方法。而是使用其祖先类
TDataSet的SetActive方法。
 
谢谢了!
 
后退
顶部