Hola.
Sigue la solución que encontré para continuar utilizando los eventos Before / Afterfieldchange en Delphi Tokyo.
Estamos en el camino correcto, algún ajuste?
Código Delphi
[-]unit utilclientdataset;
Interface
uses
DB, DBClient;
type
TFieldAfterChangeEvent = procedure (Field :TField; PrevValue :Variant) Of Object;
TFieldBeforeChangeEvent = procedure (Field :TField; NewValue :Variant) Of Object;
TSysClientDataSet = Class (TClientDataSet)
private
FAfterFieldChange :TFieldAfterChangeEvent;
FBeforeFieldChange :TFieldBeforeChangeEvent;
protected
TempFieldData:TValueBuffer;
procedure NativeValue(Const Field :TField; ABuffer :TValueBuffer; var ANewValue:Variant; var ANewValueBuffer :TValueBuffer);
procedure SetFieldData(Field :TField; Buffer :TValueBuffer);override;
public
function GetFieldData(Field: TField; var Buffer: TValueBuffer): Boolean;override;
published
property AfterFieldChange :TFieldAfterChangeEvent Read FAfterFieldChange Write FAfterFieldChange;
property BeforeFieldChange :TFieldBeforeChangeEvent Read FBeforeFieldChange Write FBeforeFieldChange;
end;
implementation
type
TFieldAccess = Class (TField);
function TSysClientDataSet.GetFieldData(Field: TField; var Buffer: TValueBuffer): Boolean;
begin
if TempFieldData=nil then
Result:=Inherited GetFieldData(Field,Buffer)
else
begin
Result:=TempFieldData <> Nil;
if Result and (Buffer <> Nil) then
TPlatformValueBuffer.Copy(TempFieldData,0,Buffer,Field.DataSize);
end;
end;
procedure TSysClientDataSet.NativeValue(Const Field :TField; ABuffer :TValueBuffer; var ANewValue:Variant; var ANewValueBuffer :TValueBuffer);
begin
TempFieldData := TPlatformValueBuffer.CreateValueBuffer(Field.DataSize);
try
TPlatformValueBuffer.Copy(ABuffer,0,TempFieldData,Field.DataSize);
TPlatformValueBuffer.Copy(ABuffer,0,ANewValueBuffer,Field.DataSize);
ANewValue:=Field.Value;
finally
TempFieldData:=Nil;
end;
end;
procedure TSysClientDataSet.SetFieldData(Field :TField; Buffer :TValueBuffer);
var
NewValue, PrevValue:Variant;
NewValueBuffer:TValueBuffer;
begin
if State in [dsEdit, dsInsert] then
begin
NewValueBuffer:= TPlatformValueBuffer.CreateValueBuffer(Field.DataSize);
try
NativeValue (Field, Buffer, NewValue, NewValueBuffer);
if NewValue <> Field.Value then
begin
if Assigned (BeforeFieldChange) Then
BeforeFieldChange (Field, NewValue);
PrevValue := Field.Value;
inherited SetFieldData (Field, NewValueBuffer);
if Assigned (AfterFieldChange) then
AfterFieldChange (Field, PrevValue);
Exit;
end;
finally
NewValueBuffer:=nil;
end;
end;
inherited SetFieldData (Field, Buffer);
end;
end.