继承TDBGrid为TXDBGrid,如何在XDBGrid中继承DataSource.DataSet中的事件如AfterOpen? (50分)

  • 主题发起人 主题发起人 mywuti
  • 开始时间 开始时间
M

mywuti

Unregistered / Unconfirmed
GUEST, unregistred user!
继承TDBGrid为TXDBGrid,如何在XDBGrid中继承DataSource.DataSet中的事件如AfterOpen?
 
从TCustomDBGrid继承,overide,TCustomDBGrid的linkactive方法,通过参数Value判断是否打开数据集。
 
(1)不可能继承 因为父类没有这个东西
(2)如果要增加这个事件 就这样写
TDXGrid = class (TDBGrid)
private
FAfterOpen: TDataSetNotifyEvent;
public
property AfterOpen: TDataSetNotifyEvent read FAfterOpen write FAfterOpen;
end;
 
TDXGrid = class (TDBGrid)
private
FAfterOpen: TDataSetNotifyEvent;
public
property AfterOpen: TDataSetNotifyEvent read FAfterOpen write FAfterOpen;
end;
这样AfterOpen和DataSource.DataSet.AfterOpen没有关系呀.
我想在DataSource.DataSet.AfterOpen添加过程怎办?
 
这样的思路本来就不对 应该对 DATASET 继承系统才可靠,A对象好象没有办法跟踪B对象做了什么事情,然后马上跟着做。你到底想达到什么目的,可以说吗?
 
这样行不
TDXGrid = class (TDBGrid)
protected
procedure LinkActive(Value: Boolean); override;
end;

implementation

procedure TDXGrid.LinkActive(Value: Boolean);
begin
if Value then .... ; // 做你要做的事情
inherited LinkActive(Value);
end;
 
但是要处理关联DataSet中的其它事件呢?如AfterScroll等等,
type
TXDbGridEh = class(TDbGridEh)
procedure AfterOpen(DataSet: TDataSet);
procedure FieldChange(Sender:TField);
.
.
implementation
.

procedure TXDBGridEh.AfterOpen(DataSet:TDataSet);
begin
inherited
.
.
end;

在那里指定
DataSource.DataSet.AfterOpen:=AfterOpen;
DataSource.DataSet.Fields.OnChange:=FieldChange
这样我可以较自由控制XDBGrid要达到的一些功能.
分较少可以加,谢谢
 
DataSource.DataSet.AfterOpen:=AfterOpen;
会覆盖原事件,看来我要实现的问题不小.
 
还是从TCustomDbGrid好。
DataSet.AfterOpen->TCustomDBGrid.LinkActive(True)
Dataset.AfterClose->TCustomDBGrid.LinkAcitve(False)
DataSet.AfterScrol->TCustomDBGrid,Scroll(Distance:integer)
 
要繼承基類的事件和方法﹐
只要發布一下就可以了
 
DBGrid本来就必须和DataSet结合在一起,
在继承DBGrid的同时,有必要在其DataSet中的事件工作,
type
TXDBGrid = class(TDBGrid)
private
FDataset:TDataset;
protected
procedure DataSetAfterEdit(DataSet: TDataSet);//有什么办法从TDataSet中
procedure DataSetAfterPost(DataSet: TDataSet); 继承下来
procedure LinkActive(Value: Boolean); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;

implementation

procedure TXDBGridEh.LinkActive(Value: Boolean);
begin
if Value then
begin
FDataset := TDataset.Create(nil);
FDataset := Datasource.DataSet;
end;
inherited LinkActive(Value);
end;
 
为什么要继承 dateSet的事件呢?有点不明白。
dbGrid 的 dataLink有好多重要的方法。你改写这各
你看看GriddataLink就清楚了
TGridDataLink = class(TDataLink)
private
FGrid: TCustomDBGrid;
FFieldCount: Integer;
FFieldMap: array of Integer;
FModified: Boolean;
FInUpdateData: Boolean;
FSparseMap: Boolean;
function GetDefaultFields: Boolean;
function GetFields(I: Integer): TField;
protected
procedure ActiveChanged; override;
procedure BuildAggMap;
procedure DataSetChanged; override;
procedure DataSetScrolled(Distance: Integer); override;
procedure FocusControl(Field: TFieldRef); override;
procedure EditingChanged; override;
function IsAggRow(Value: Integer): Boolean; virtual;
procedure LayoutChanged; override;
procedure RecordChanged(Field: TField); override;
procedure UpdateData; override;
function GetMappedIndex(ColIndex: Integer): Integer;
public
constructor Create(AGrid: TCustomDBGrid);
destructor Destroy; override;
function AddMapping(const FieldName: string): Boolean;
procedure ClearMapping;
procedure Modified;
procedure Reset;
property DefaultFields: Boolean read GetDefaultFields;
property FieldCount: Integer read FFieldCount;
property Fields[I: Integer]: TField read GetFields;
property SparseMap: Boolean read FSparseMap write FSparseMap;
property Grid: TCustomDBGrid read FGrid;
end;

 
努力学习,谢谢各位
 
后退
顶部