How to set a type as a variable?

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

How to set a type as a variable?

vfclists .

I did this kind of thing some time ago, but have forgotten the details.

Let us say you have something like TBaseType(Variable).Method, you want to let TBaseType be a variable so you can have some code like this.

procedure (value:someType)
var
  variableType: TClass; //not quite sure here
  variableType := TypeOf(value);

then further on you execute something like

variableType(Variable).Method, rather than TBaseType(Variable).Method because you can't hard code TBaseType because can't tell what it will be at runtime. I remember doing something like that with Delphi of old, probably Delphi 3 or Delphi 7

Can someone help me with this, with some use cases as well?

Thanks

--
Frank Church

=======================
http://devblog.brahmancreations.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: How to set a type as a variable?

Anthony Walter-3
Like so:

procedure Test;
var
  SomeType: TClass;
  SomeObject: TObject;
begin
  SomeType := TStringList;
  SomeObject := SomeType.Create;
  (SomeObject as TStrings).Add('Hello World');
  ShowMessage((SomeObject as TStrings)[0]);
  SomeObject.Free;
end;

On Mon, Aug 23, 2010 at 7:05 PM, Frank Church <[hidden email]> wrote:

I did this kind of thing some time ago, but have forgotten the details.

Let us say you have something like TBaseType(Variable).Method, you want to let TBaseType be a variable so you can have some code like this.

procedure (value:someType)
var
  variableType: TClass; //not quite sure here
  variableType := TypeOf(value);

then further on you execute something like

variableType(Variable).Method, rather than TBaseType(Variable).Method because you can't hard code TBaseType because can't tell what it will be at runtime. I remember doing something like that with Delphi of old, probably Delphi 3 or Delphi 7

Can someone help me with this, with some use cases as well?

Thanks

--
Frank Church

=======================
http://devblog.brahmancreations.com

_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: How to set a type as a variable?

leledumbo
Administrator
It can be implemented with RTTI or variants perhaps.

Anthony Walter-3 wrote
Like so:

procedure Test;
var
  SomeType: TClass;
  SomeObject: TObject;
begin
  SomeType := TStringList;
  SomeObject := SomeType.Create;
  (SomeObject as TStrings).Add('Hello World');
  ShowMessage((SomeObject as TStrings)[0]);
  SomeObject.Free;
end;

On Mon, Aug 23, 2010 at 7:05 PM, Frank Church <vfclists@gmail.com> wrote:

>
> I did this kind of thing some time ago, but have forgotten the details.
>
> Let us say you have something like TBaseType(Variable).Method, you want to
> let TBaseType be a variable so you can have some code like this.
>
> procedure (value:someType)
> var
>   variableType: TClass; //not quite sure here
>   variableType := TypeOf(value);
>
> then further on you execute something like
>
> variableType(Variable).Method, rather than TBaseType(Variable).Method
> because you can't hard code TBaseType because can't tell what it will be at
> runtime. I remember doing something like that with Delphi of old, probably
> Delphi 3 or Delphi 7
>
> Can someone help me with this, with some use cases as well?
>
> Thanks
>
> --
> Frank Church
>
> =======================
> http://devblog.brahmancreations.com
>
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: How to set a type as a variable?

Felipe Monteiro de Carvalho
In reply to this post by vfclists .
No, if all your types are classes descending from the same root you
can do it is like this:

type
  TBaseType = class;
    procedure somemethod();
  end;

  TExtendedType = class(TBaseType);

  TBaseTypeClass = class of TBaseType;

procedure (value: TBaseType; type_: TBaseTypeClass)
begin
  value := type_.Create();
  value.somemethod();
end;

And you can call your procedure as:

proc(somevar, TExtendedType);

For other types you need to use generics.

--
Felipe Monteiro de Carvalho
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Reply | Threaded
Open this post in threaded view
|

Re: How to set a type as a variable?

Marco van de Voort
In reply to this post by vfclists .
In our previous episode, Frank Church said:

> I did this kind of thing some time ago, but have forgotten the details.
>
> Let us say you have something like TBaseType(Variable).Method, you want to
> let TBaseType be a variable so you can have some code like this.
>
> procedure (value:someType)
> var
>   variableType: TClass; //not quite sure here
>   variableType := TypeOf(value);
>
> then further on you execute something like
>
> variableType(Variable).Method, rather than TBaseType(Variable).Method
> because you can't hard code TBaseType because can't tell what it will be at
> runtime. I remember doing something like that with Delphi of old, probably
> Delphi 3 or Delphi 7
>
> Can someone help me with this, with some use cases as well?

There is typeinfo in Delphi/fpc, but that is for RTTI, and quite different

The above is a bit strange in Pascals with unit system, since it potentially
creates a var of a type that might not be in the scope.

So I think it is not even possible to implement this in a straight way.
_______________________________________________
fpc-pascal maillist  -  [hidden email]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal