[fpc-pascal] TFPGObjectList error
Sven Barth
pascaldragon at googlemail.com
Tue Jul 3 20:35:07 CEST 2018
Am 01.07.2018 um 04:14 schrieb Michalis Kamburelis:
> 2018-07-01 4:01 GMT+02:00 Vojtěch Čihák <vojtech.cihak at atlas.cz>:
>> this seems to be misleading error message. TFPGObjectList works well for
>> objects (classes). When I tried to push record to it, I got the same error
>> message. TVec3 is not class, right?
> Indeed, it's a misleading message. The message
>
> ...identifier idents no member "Free"
>
> doesn't talk about the line
>
> list.Free;
>
> (which is fine, "list" is an instance of a class). It talks most
> likely about the "Free" call inside FGL implementation in
>
> """
> procedure TFPGObjectList.Deref(Item: Pointer);
> begin
> if FFreeObjects then
> T(Item^).Free;
> end;
> """
>
> If you look inside the FGL unit sources of your FPC version, you will
> likely find this to be at line 992 :)
>
> Short explanation:Since your TVec3 is probably not a class, you cannot
> do "Free" on it.
>
> The solution is to use TFPGList instead of TFPGObjectList. You should
> also define an equality operator if TVec3 is a record. See e.g. my
> example in https://castle-engine.io/modern_pascal_introduction.html#_operator_overloading
> (scroll to the example with TMyRecordList).
I've now added a TObject constraint to TFPGObjectList and the TData
parameter of TFPGObjectMap. Sadly I can't add it to
TFPGInterfacedObjectList or TFPGInterfacedObjectMap as currently both
interfaces and objects implementing interfaces can be used.
Regards,
Sven
More information about the fpc-pascal
mailing list