Cita:
Empezado por Al González
¡Órale! Alguien se interesa en el código de mi antiguo blog.
Afortunadamente hoy también yo uso Delphi Berlin. Veré si puedo encontrar un espacio para revisar lo que comentas. Dos preguntas:
¿Te refieres a FireDAC? (Creo que antes se llamaba UNIDAC).
¿Podrías explicar con el mayor detalle posible lo que estás obteniendo?
Muchas gracias.
|
Hola Al González
Implemente el componente TSysClientDataSet con los eventos BeforeFieldChange / AfterFieldChange en Delphi 7/2006 según sus ejemplos de 2010 y realmente han sido de gran utilidad hasta hoy, sin embargo, estoy migrando todos los componentes a Delphi Berlin / Tokyo, el problema está en los Pointer que pasaron a TValueBuffer en el Berlin / Tokyo.
¿Tiene alguna idea de lo que puede estar equivocado?
Código Delphi
[-] protected
TempFieldData:PPointer;
function NativeValue(const Field :TField; const Buffer:TValueBuffer):Variant;
procedure SetFieldData(Field: TField; Buffer: TValueBuffer);override;
public
function GetFieldData(Field: TField; var Buffer: TValueBuffer):Boolean;override;
Código Delphi
[-]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
Move(TempFieldData^, Buffer[0], Field.Size);
end;
end;
function TSysClientDataSet.NativeValue (Const Field :TField; Const Buffer :TValueBuffer):Variant;
begin
TempFieldData := @Buffer[0];
try
Result := Field.Value;
finally
TempFieldData := Nil;
end;
end;
procedure TSysClientDataSet.SetFieldData(Field: TField; Buffer: TValueBuffer);
var
Value :Variant;
begin
if State in [dsEdit, dsInsert] then
begin
Value := NativeValue (Field, Buffer);
if Value <> Field.Value Then begin
if Assigned (BeforeFieldChange) Then
BeforeFieldChange (Field, Value);
Value := Field.Value; inherited SetFieldData (Field, Buffer);
if Assigned (AfterFieldChange) then
AfterFieldChange (Field, Value);
exit;
end;
end;
inherited SetFieldData (Field, Buffer);
end;
Muchas gracias