[fpc-devel] Recent changes to TField.SetData
LacaK
lacak at zoznam.sk
Tue Apr 26 13:56:54 CEST 2011
Michael,
do you plan do something else with this "OnValidate" problem ?
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20110426/9905e33b/attachment.html>
More information about the fpc-devel
mailing list