[fpc-devel] Can someone confirm if this is a bug? (ancestor in TWRiter.WriteProperty)
Martin
lazarus at mfriebe.de
Tue Aug 18 13:21:49 CEST 2009
Paul Ishenin wrote:
> Michael Van Canneyt wrote:
>>>
>>> when you get to write TPersistenChild you enter the following code
>>>
>>> tkClass:
>>> begin
>>> ObjValue := TObject(GetObjectProp(Instance, PropInfo));
>>> if HasAncestor then
>>> begin
>>> AncestorObj := TObject(GetObjectProp(Ancestor, PropInfo));
>>> if Assigned(AncestorObj) then
>>> if Assigned(ObjValue) and
>>> (TComponent(AncestorObj).Owner = FRootAncestor) and
>>> (TComponent(ObjValue).Owner = Root) and
>>> (UpperCase(TComponent(AncestorObj).Name) =
>>> UpperCase(TComponent(ObjValue).Name)) then
>>> AncestorObj := ObjValue
>>> // else
>>> // AncestorObj := nil;
>>> end else
>>> AncestorObj := nil;
>>> --------------
>>>
>>> TObject(GetObjectProp(Ancestor, PropInfo)); returns the
>>> TpersistentChil
>>> as well as ObjValue being TPersistent
>>>
>>>
>>> both get casted to TComponent with no check?
>> I may have mis-judged t, but the problem is still the same:
>>
>> Ancestors can only be a TComponent.
> Ancestor (in this report http://bugs.freepascal.org/view.php?id=14364)
> is TLabel, HasAncestor = True (since Ancestor is TLabel and
> Instance.ClassType = Ancestor.ClassType) and both ObjValue and
> AncestorObj are TAnchorSide (descendant of TPersistent and not
> TComponent). Therefore it accessing TAnchorSide property (TPersistent)
> as TComponent and we have a crash.
>
> But maybe the problem is somewhere else. For example can Ancestor be
> TLabel or it is usually some form, frame or datamodule?
and on top of that, Ancestor can be a TPersitent:
because if the AnchorSide writes it's properties, the following code,
sts ancestor to anchorside:
begin
SavedAncestor := Ancestor;
SavedPropPath := FPropPath;
try
FPropPath := FPropPath + PPropInfo(PropInfo)^.Name + '.';
if HasAncestor then
Ancestor := TPersistent(GetObjectProp(Ancestor,
PropInfo)); // <<<<<
WriteProperties(TPersistent(ObjValue));
finally
Ancestor := SavedAncestor;
FPropPath := SavedPropPath;
end;
More information about the fpc-devel
mailing list