[fpc-devel] Recent changes to TField.SetData
michael.vancanneyt at wisa.be
michael.vancanneyt at wisa.be
Tue Apr 26 14:20:58 CEST 2011
On Tue, 26 Apr 2011, LacaK wrote:
> Michael,
> do you plan do something else with this "OnValidate" problem ?
I thought I had done everything, or did I (again) forget something ?
Michael.
> Thanks
> -Laco.
>
>> Hi,
>> here are diffs with changes, I hope they will be good for all TDataSet
>> descendants (those specific to FPC and also those which are also for use in
>> Delphi)
>> Code which is general (and is used repeatedly) is placed in TField methods
>> and only small code remains which must be placed into each TDataSet
>> descendant.
>> (I patched only TBufDataSet, but later can be updated also other TDataSet
>> descendants ... remove redundant code and add Field.Validate(...))
>> Thanks
>> -Laco.
>>
>>>
>>>>>> The whole code, which is repeated (and can be put in one place) is:
>>>>>>
>>>>>> if not (State in [dsEdit, dsInsert, dsFilter, dsCalcFields]) then
>>>>>> begin
>>>>>> DatabaseErrorFmt(SNotEditing,[Name],self);
>>>>>> exit;
>>>>>> end;
>>>>>> if (Field.FieldNo>0) and not (State in [dsSetKey, dsFilter]) then
>>>>>> begin
>>>>>> if Read
>>>>>> OnlythenDatabaseErrorFmtSReadOnlyField,[Field.DisplayName],
>>>>>> Self);
>>>>>> Field.Validate(Buffer);
>>>>>> end;
>>>>>
>>>>> You are right in your dislike.
>>>>>
>>>>> I will create a 'BeforeSetFieldData' in TDataset and put the code in
>>>>> there,
>>>>> and the same for 'AfterSetFieldData' with the OnChange code.
>>>>>
>>>> OK,
>>>> Then please do not forget commit necessary changes also in other
>>>> descendants (not only in TCustomBufDataSet but also in TParadox,
>>>> TMemDataset, TFixedFormatDataSet, TDbf) to completelly fix 'missing
>>>> onvalidate call' problem.
>>>> Thanks
>>>>
>>> I am still thinking about this.
>>> I have other solution, which is relative simple , puts base logic into
>>> base TField methods (so all TDataSet descendants can benefit from it) and
>>> does not negatively affect existing TDataSet descendants and does not
>>> require introduce new methods (BeforeSetFieldData, AfterSetFieldData).
>>> Let's distributes repeating used code as follows:
>>>
>>> 1. base checks "before" into procedure TField.SetData(Buffer: Pointer;
>>> NativeFormat : Boolean);
>>>
>>> 820 begin
>>> 821 If Not Assigned(FDataset) then
>>> 822 DatabaseErrorFmt(SNoDataset,[FieldName]);
>>>
>>> if not (State in [dsEdit, dsInsert, dsFilter, dsCalcFields]) then
>>> //here should be IMO also dsNewValue
>>> DatabaseErrorFmt(SNotEditing,[FDataSet.Name],FDataSet);
>>>
>>> if ReadOnly and (FieldNo>0) and not (FDataSet.State in [dsSetKey,
>>> dsFilter]) then
>>> DatabaseErrorFmt(SReadOnlyField, [DisplayName], Self);
>>>
>>> 829 FDataSet.SetFieldData(Self,Buffer, NativeFormat);
>>> --------------------------------------------------------------------------
>>>
>>> 2. into procedure TField.Validate(Buffer: Pointer);
>>>
>>> 892 begin
>>> if FData S et.Statein[dsSetKey,dsFilter]thenExit893If
>>> assigned(OnValidate) Then
>>>
>>> --------------------------------------------------------------------------
>>>
>>> 3. "after call" into procedure TDataSet.SetFieldData(Field: TField;
>>> Buffer: Pointer);
>>> begin
>>> if not (State in [dsCalcFields, dsFilter, dsNewValue]) then
>>> DataEvent(deFieldChange, Ptrint(Field));
>>> end;
>>>
>>> --------------------------------------------------------------------------
>>>
>>> And now all what we must do, is put into method SetFieldData in TDataSet
>>> descendants one line:
>>>
>>> Field.Validate(Buffer);
>>> and one line at end:
>>>
>>> inherited; //calls "field change" ... this is done by all TDataSet
>>> descendants in fcl-db as a last thing
>>>
>>>
>>> It is only draft, so some detils may be changed ... ;-)
>>> What do you think ?
>>>
>>> Laco.
>>>
>>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> fpc-devel maillist - fpc-devel at lists.freepascal.org
>> http://lists.freepascal.org/mailman/listinfo/fpc-devel
>
>
More information about the fpc-devel
mailing list