• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

delphi–保持beforepost事件中的值到afterpost事件

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
我正在为Delphi 2007编写这个问题,但我很确定这是所有语言中的常见问题.

所以,我有一个项目,我需要保存关于某些字段的旧值和新值的信息(在我正在使用的数据集的BeforePost事件中给出)并在AfterPost事件中使用它们.

目前,我一直在使用全局变量,但在项目中已经有很多这样的变量,在管理文档和/或注释时,这成为一个真正的问题.

基本上,我问是否有更好的方法(在Delphi 2007或一般情况下)保持数据集的BeforePost事件的信息并将它们返回到AfterPost事件中.

解决方法

首先创建一个新的自定义数据源
TDataRecord = array of record
    FieldName: string;
    FieldValue: Variant;
  end;
 
  TMyDataSource = class(TDataSource)
  private
    LastValues: TDataRecord;
    procedure MyDataSourceBeforePost(DataSet: TDataSet);
    procedure SetDataSet(const Value: TDataSet);
    function GetDataSet: TDataSet;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function GetLastValue(FieldName: string): Variant; 
    property MyDataSet: TDataSet read GetDataSet write SetDataSet;
  end;
 
{ TMyDataSource }
 
constructor TMyDataSource.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;
 
destructor TMyDataSource.Destroy;
begin
  SetLength(LastValues,0);
  inherited Destroy;
end;
 
function TMyDataSource.GetDataSet: TDataSet;
begin
  Result := DataSet;
end;
 
procedure TMyDataSource.SetDataSet(const Value: TDataSet);
begin
  DataSet := Value;
  DataSet.BeforePost := MyDataSourceBeforePost;
end;
 
procedure TMyDataSource.MyDataSourceBeforePost(DataSet: TDataSet);
var
  i: integer;
begin
  SetLength(LastValues,DataSet.FieldCount);
  for i:=0 to DataSet.FieldCount-1 do
  begin
    LastValues[i].FieldName := DataSet.Fields.Fields[i].FieldName;
    LastValues[i].FieldValue := DataSet.Fields.Fields[i].OldValue;
  end;
end;
 
function TMyDataSource.GetLastValue(FieldName: string): Variant;
var
  i: integer;
begin
  Result := Null;
  for i:=0 to Length(LastValues)-1 do
    if SameText(FieldName,LastValues[i].FieldName) then
    begin
      Result := LastValues[i].FieldValue;
      break;
    end;
end;

并覆盖应用程序数据源

TForm1 = class(TForm)
  private
    MyDataSource: TMyDataSource;
  end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  ADOQuery1.Active := true;
  MyDataSource := TMyDataSource.Create(Self);
  MyDataSource.MyDataSet := ADOQuery1;
  DBGrid1.DataSource := MyDataSource;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  MyDataSource.Free;
end;
 
procedure TForm1.ADOQuery1AfterPost(DataSet: TDataSet);
var
  AValue: Variant;
begin
  AValue := MyDataSource.GetLastValue('cname');
  if not VarIsNull(AValue) then;
end;

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
matlab画三维图像 - 不做程序猿发布时间:2022-07-18
下一篇:
理解Delphi的类(九)-关于类的向前声明发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap