[fpc-devel] GetPropValue and enumerated types (Bug #4738 follow-up)
Graeme Geldenhuys
graemeg.lists at gmail.com
Wed May 17 11:12:31 CEST 2006
> Even so:
> This Assign() method does not need to use a variant, but can still offer
> the same functionality as it does now. It just means that the method
> needs to determine the actual type itself...
tiOPF has done a lot to get rid of using variants and it isn't used
that much anymore. If there is anything else we can do to get rid of
the last few cases, we would.
Below is one of the methods used in the Assign method. GetPropValue
and SetPropValue returns/uses Variant, so how would you do it
otherwise using RTTI?
eg: Query PropInfo and call the individual methods (GetOrdProp,
GetStrProp, etc.) based on PropInfo.Kind in a case statement?
const
// All string type properties
ctkString = [ tkChar, tkString, tkWChar, tkLString, tkWString
{$IFDEF FPC},tkAString{$ENDIF} ] ;
// Integer type properties
ctkInt = [ tkInteger, tkInt64 ] ;
// Float type properties
ctkFloat = [ tkFloat ] ;
// Numeric type properties
ctkNumeric = [tkInteger, tkInt64, tkFloat];
// All simple types (string, int, float)
ctkSimple = ctkString + ctkInt + ctkFloat ;
procedure TtiObject.AssignPublishedProp( pSource : TtiObject ;
psPropName : string) ;
var
lPropType: TTypeKind;
lPropValue: Variant;
begin
lPropType := TypInfo.PropType( pSource, psPropName ) ;
if lPropType in ctkSimple + [tkVariant, tkEnumeration] then
begin
{ Graeme 2006-05-16: Passing in False, as a workaround for a FPC bug. }
lPropValue := TypInfo.GetPropValue(pSource, psPropName, False);
TypInfo.SetPropValue( Self, psPropName, lPropValue);
end
else
raise EtiOPFProgrammerException.CreateFmt(cErrorSettingProperty,
[ClassName, psPropName, 'Unknown property type']);
end ;
> Variants are for (excuse me the term) lazy coders...
I've heard that before.. :-)
Graeme.
--
There's no place like 127.0.0.1
More information about the fpc-devel
mailing list