Code: Select all
'*root* -> TYPECAP
'integer -> INTEGERCAP
'single -> SINGLECAP
'zstring_ptr -> ZSTRINGPTRCAP
type TYPECAP extends OBJECT
declare abstract operator cast() as integer
declare abstract operator cast() as single
declare abstract operator cast() as string
declare abstract function GetType() as string
declare abstract function ToString() as string
end type
type VARIANT as TYPECAP ptr
type INTEGERCAP extends TYPECAP
declare constructor()
declare constructor(byval I as integer)
declare operator let(byref as integer)
declare virtual operator cast() as integer override
declare virtual operator cast() as single override
declare virtual operator cast() as string override
declare virtual function GetType() as string override
declare virtual function ToString() as string override
as integer _value
end type
constructor INTEGERCAP()
BASE()
end constructor
constructor INTEGERCAP(byval I as integer)
BASE()
THIS._value => I
end constructor
operator INTEGERCAP.let(byref LetValue as integer)
THIS._value = LetValue
end operator
operator INTEGERCAP.cast() as integer
'---->
return THIS._value
end operator
operator INTEGERCAP.cast() as single
'---->
return THIS._value
end operator
operator INTEGERCAP.cast() as string
'---->
return Str(THIS._value)
end operator
function INTEGERCAP.GetType() as string
'---->
return "integercap"
end function
function INTEGERCAP.ToString() as string
'---->
return str(THIS._value)
end function
type SINGLECAP extends TYPECAP
declare constructor()
declare constructor(byval S as single)
declare operator let(byref as single)
declare virtual operator cast() as integer override
declare virtual operator cast() as single override
declare virtual operator cast() as string override
declare virtual function GetType() as string override
declare virtual function ToString() as string override
as single _value
end type
constructor SINGLECAP()
BASE()
end constructor
constructor SINGLECAP(byval S as single)
BASE()
THIS._value => S
end constructor
operator SINGLECAP.let(byref LetValue as single)
THIS._value = LetValue
end operator
operator SINGLECAP.cast() as integer
'---->
return THIS._value
end operator
operator SINGLECAP.cast() as single
'---->
return THIS._value
end operator
operator SINGLECAP.cast() as string
'---->
return Str(THIS._value)
end operator
function SINGLECAP.GetType() as string
'---->
return "singlecap"
end function
function SINGLECAP.ToString() as string
'---->
return str(THIS._value)
end function
type ZSTRINGPTRCAP extends TYPECAP
declare constructor()
declare constructor(byval Z as zstring ptr)
declare operator let(byref as zstring ptr)
declare virtual operator cast() as integer override
declare virtual operator cast() as single override
declare virtual operator cast() as string override
declare virtual function GetType() as string override
declare virtual function ToString() as string override
as zstring ptr _value
end type
constructor ZSTRINGPTRCAP()
BASE()
end constructor
constructor ZSTRINGPTRCAP(byval Z as zstring ptr)
BASE()
THIS._value => Z
end constructor
operator ZSTRINGPTRCAP.let(byref LetValue as zstring ptr)
THIS._value = LetValue
end operator
operator ZSTRINGPTRCAP.cast() as integer
'---->
return Val(*THIS._value)
end operator
operator ZSTRINGPTRCAP.cast() as single
'---->
return Val(*THIS._value)
end operator
operator ZSTRINGPTRCAP.cast() as string
'---->
return *THIS._value
end operator
function ZSTRINGPTRCAP.GetType() as string
'---->
return "zstringptrcap"
end function
function ZSTRINGPTRCAP.ToString() as string
'---->
return *THIS._value
end function
'````````````````````````````````````````````````````````````````````
'define an array of variant
dim as VARIANT arrayOfVariant(any)
'fill the array
redim arrayOfVariant(1 to 3)
arrayOfVariant(1) = @INTEGERCAP(99)
arrayOfVariant(2) = @SINGLECAP(3.1415)
arrayOfVariant(3) = @ZSTRINGPTRCAP("hello_variant")
'now you can get back the type of each variable stored as well as its value
? 1, arrayOfVariant(1)->GetType(), *arrayOfVariant(1)
? 2, arrayOfVariant(2)->GetType(), *arrayOfVariant(2)
? 3, arrayOfVariant(3)->GetType(), *arrayOfVariant(3)
?
'some operations
? "? 1+2+3", *arrayOfVariant(1) + *arrayOfVariant(2) + *arrayOfVariant(3)
? "? 1&2&3", *arrayOfVariant(1) & *arrayOfVariant(2) & *arrayOfVariant(3)
?
'other operations
? *arrayOfVariant(1) + *arrayOfVariant(2)
? *arrayOfVariant(1) & *arrayOfVariant(2)
? *arrayOfVariant(3)
?
'ToString method
? (type<INTEGERCAP>(*arrayOfVariant(2) + *arrayOfVariant(1))).ToString()
? arrayOfVariant(2)->ToString()
? arrayOfVariant(3)->ToString()
'````````````````````````````````````````````````````````````````````
getKey()
'(eof)
Code: Select all
'testing an implementation of variant array
' ___type encapsulation____
'*root* -> TYPECAP
'integer -> INTEGERCAP
'single -> SINGLECAP
'zstring_ptr -> ZSTRINGPTRCAP
type TYPECAP extends OBJECT
declare function GetType() as string
as string _typeId = "typecap"
declare static function CommonString(byval as TYPECAP ptr) as string
end type
type VARIANT as TYPECAP
function TYPECAP.GetType() as string
'---->
return THIS._typeId
end function
type INTEGERCAP extends TYPECAP
declare constructor()
declare operator let(byref as integer)
declare operator cast() byref as integer
declare function ToString() as string
as integer _value
end type
constructor INTEGERCAP()
BASE()
THIS._typeId = "integercap"
end constructor
operator INTEGERCAP.let(byref LetValue as integer)
THIS._value = LetValue
end operator
operator INTEGERCAP.cast() byref as integer
'---->
return THIS._value
end operator
function INTEGERCAP.ToString() as string
'---->
return str(THIS._value)
end function
type SINGLECAP extends TYPECAP
declare constructor()
declare operator let(byref as single)
declare operator cast() byref as single
declare function ToString() as string
as single _value
end type
constructor SINGLECAP()
BASE()
THIS._typeId = "singlecap"
end constructor
operator SINGLECAP.let(byref LetValue as single)
THIS._value = LetValue
end operator
operator SINGLECAP.cast() byref as single
'---->
return THIS._value
end operator
function SINGLECAP.ToString() as string
'---->
return str(THIS._value)
end function
type ZSTRINGPTRCAP extends TYPECAP
declare constructor()
declare operator let(byref as zstring ptr)
declare operator cast() byref as zstring ptr
declare function ToString() as string
as string _id
as zstring ptr _value
end type
constructor ZSTRINGPTRCAP()
BASE()
THIS._typeId = "zstringptrcap"
end constructor
operator ZSTRINGPTRCAP.let(byref LetValue as zstring ptr)
THIS._value = LetValue
end operator
operator ZSTRINGPTRCAP.cast() byref as zstring ptr
'---->
return THIS._value
end operator
function ZSTRINGPTRCAP.ToString() as string
'---->
return *THIS._value
end function
function TYPECAP.CommonString(byval TCPtr as TYPECAP ptr) as string
select case uCase( TCPtr->GetType() )
case "INTEGERCAP"
'---->
return cPtr(INTEGERCAP ptr, TCPtr)->ToString()
case "SINGLECAP"
'---->
return cPtr(SINGLECAP ptr, TCPtr)->ToString()
case "ZSTRINGPTRCAP"
'---->
return cPtr(ZSTRINGPTRCAP ptr, TCPtr)->ToString()
case else
'---->
return "error"
end select
end function
'````````````````````````````````````````````````````````````````````
'define an array of variant
dim as VARIANT ptr arrayOfVariant(any)
'define and assign some variable of different types
dim as INTEGERCAP i
i = 4
dim as SINGLECAP s
s = 0.233
dim as ZSTRINGPTRCAP z
z = @"hello"
'put the pointers of the variable in the array
redim arrayOfVariant(1 to 3)
arrayOfVariant(1) = @i
arrayOfVariant(2) = @s
arrayOfVariant(3) = @z
'now you can get back the type of each variable stored as well as its value
? 1, arrayOfVariant(1)->GetType(), "value=";
? VARIANT.CommonString(arrayOfVariant(1))
? 2, arrayOfVariant(2)->GetType(), "value=";
? VARIANT.CommonString(arrayOfVariant(2))
? 3, arrayOfVariant(3)->GetType(), "value=";
? VARIANT.CommonString(arrayOfVariant(3))
'````````````````````````````````````````````````````````````````````
getKey()
'(eof)
Hi there,
I'm using some encapsulation to make some variant array. I've not really encountered any difficulty, but 2 weird things.
If I don't print the results in CommonString() procedure, I can't print it from outside... But it's all string here.
And second thing, my zstring has its value disapeared... I don't master too much zstrings so what happened?
Thanks for any help.
Code: Select all
'testing an implementation of variant array
' ___type encapsulation____
'*root* -> TYPECAP
'integer -> INTEGERCAP
'single -> SINGLECAP
'zstring_ptr -> ZSTRINGPTRCAP
type TYPECAP extends OBJECT
declare function GetType() as string
as string _typeId = "typecap"
declare static sub CommonString(byref as TYPECAP ptr)
end type
type VARIANT as TYPECAP
function TYPECAP.GetType() as string
'---->
return THIS._typeId
end function
type INTEGERCAP extends TYPECAP
declare constructor()
declare operator let(byref as integer)
declare operator cast() byref as integer
declare function ToString() as string
as integer _value
end type
constructor INTEGERCAP()
BASE()
THIS._typeId = "integercap"
end constructor
operator INTEGERCAP.let(byref LetValue as integer)
THIS._value = LetValue
end operator
operator INTEGERCAP.cast() byref as integer
'---->
return THIS._value
end operator
function INTEGERCAP.ToString() as string
'---->
return str(THIS._value)
end function
type SINGLECAP extends TYPECAP
declare constructor()
declare operator let(byref as single)
declare operator cast() byref as single
declare function ToString() as string
as single _value
end type
constructor SINGLECAP()
BASE()
THIS._typeId = "singlecap"
end constructor
operator SINGLECAP.let(byref LetValue as single)
THIS._value = LetValue
end operator
operator SINGLECAP.cast() byref as single
'---->
return THIS._value
end operator
function SINGLECAP.ToString() as string
'---->
return str(THIS._value)
end function
type ZSTRINGPTRCAP extends TYPECAP
declare constructor()
declare operator let(byref as zstring ptr)
declare operator cast() byref as zstring ptr
declare function ToString() as string
as string _id
as zstring ptr _value
end type
constructor ZSTRINGPTRCAP()
BASE()
THIS._typeId = "zstringcap"
end constructor
operator ZSTRINGPTRCAP.let(byref LetValue as zstring ptr)
THIS._value = LetValue
end operator
operator ZSTRINGPTRCAP.cast() byref as zstring ptr
'---->
return THIS._value
end operator
function ZSTRINGPTRCAP.ToString() as string
'---->
return *THIS._value
end function
sub TYPECAP.CommonString(byref TCPtr as TYPECAP ptr)
select case uCase( TCPtr->GetType() )
case "INTEGERCAP"
? cPtr(INTEGERCAP ptr, TCPtr)->ToString()
case "SINGLECAP"
? cPtr(SINGLECAP ptr, TCPtr)->ToString()
case "ZSTRINGPTRCAP"
? cPtr(ZSTRINGPTRCAP ptr, TCPtr)->ToString()
end select
end sub
'````````````````````````````````````````````````````````````````````
'define an array of variant
dim as VARIANT ptr arrayOfVariant(any)
'define and assign some variable of different types
dim as INTEGERCAP i
i = 4
dim as SINGLECAP s
s = 0.233
dim as ZSTRINGPTRCAP z
z = @"hello"
'put the pointers of the variable in the array
redim arrayOfVariant(1 to 3)
arrayOfVariant(1) = @i
arrayOfVariant(2) = @s
arrayOfVariant(3) = @z
'now you can get back the type of each variable stored as well as its value
? 1, arrayOfVariant(1)->GetType(), "value=";
arrayOfVariant(1)->CommonString(arrayOfVariant(1))
'!!!ISSUE A!!!
'? arrayOfVariant(1)->CommonString(arrayOfVariant(1)) '' error 17: Syntax error in '? TYPECAP.CommonString( (arrayOfVariant(1)) )
? 2, arrayOfVariant(2)->GetType(), "value=";
arrayOfVariant(2)->CommonString(arrayOfVariant(2))
? 3, arrayOfVariant(3)->GetType(), "value=";
VARIANT.CommonString(arrayOfVariant(3))
'!!!ISSUE B!!! where's my value??
'````````````````````````````````````````````````````````````````````
getKey()
'(eof)