[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

## 9.247 SetType

### Synopsis

    procedure SetType (var SomeObject; VMT: PObjectType);

### Description

The procedure ``SetType'` explicitly assigns a value to the implicit VMT field of an object. This is normally done implicitly when a constructor is called.

You can use this to write a polymorphic I/O routine which reads an object from a file. In this case, you cannot reasonably use ``New'` to allocate the storage, but you ``GetMem'` it and initialize the object manually using ``SetType'` before calling the constructor explicitly.

The only values you should assign to an object via ``SetType'` are actual VMT pointers that were obtained via ``TypeOf'`. In particular, declaring a record like the one shown in the description of ``PObjectType'` and assigning a pointer to it to an object via ``SetType'` will usually not work because the virtual method pointers are missing.

Since ``SetType'` is a dangerous feature, it yields a warning unless ``{$X+}'` is given.

### Conforming to

``SetType'` is a GNU extension.

### Example

    program SetTypeDemo;

    type
      BasePtr = ^BaseObj;

      BaseObj = object
        constructor Load;
      end;

      ChildObj = object (BaseObj)
        constructor Load;
      end;

    constructor BaseObj.Load;
    begin
    end;

    constructor ChildObj.Load;
    begin
    end;

    {$X+}

    { This is somewhat fragmentary code. }
    function GetObject (var InputFile: File) = Result: BasePtr;
    const
      VMTTable: array [1 .. 2] of PObjectType =
        (TypeOf (BaseObj), TypeOf (ChildObj));
    var
      Size: Cardinal;
      TypeID: Integer;
      VMT: PObjectType;
    begin
      { Read the size of the object from some file and store it in `Size'. }
      BlockRead (InputFile, Size, SizeOf (Size));

      { Allocate memory for the object. }
      GetMem (Result, Size);

      { Read some ID from some file. }
      BlockRead (InputFile, TypeID, SizeOf (TypeID));

      { Look up the `VMT' from some table. }
      { Range checking wouldn't be a bad idea here ... }
      VMT := VMTTable[TypeID];

      SetType (Result^, VMT);

      { Now the object is ready, and the constructor can be called. }
      { Look up the correct constructor from some table and call it. }
    end;

    begin
    end.

### See also

section 9.195 PObjectType, section 9.286 TypeOf, section 8.8 Object-Orientated Programming.

[ < ] | [ > ] |  | [ << ] | [ Up ] | [ >> ] |  |  |  |  | [Top] | [Contents] | [Index] | [ ? ]

This document was generated by Frank Heckenbach on May, 10 2002 using texi2html