gpt4 book ai didi

delphi - 保留从 beforepost 事件到 afterpost 事件的值

转载 作者:行者123 更新时间:2023-12-03 14:54:59 25 4
gpt4 key购买 nike

我正在为 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 - 保留从 beforepost 事件到 afterpost 事件的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26767350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com