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