加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:21:03 所属栏目:大数据 来源:网络整理
导读:我正在为Delphi 2007编写这个问题,但我很确定这是所有语言中的常见问题. 所以,我有一个项目,我需要保存关于某些字段的旧值和新值的信息(在我正在使用的数据集的BeforePost事件中给出)并在AfterPost事件中使用它们. 目前,我一直在使用全局变量,但在项目中已经
我正在为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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读