delphi – 保持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;
复制代码

 

posted on   癫狂编程  阅读(482)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示