Вот пример на паскале, более близком к КП.

type
PButton = ^TButton;
TButton = record
PosX  : integer;
PosY  : integer;
SizeX : integer;
SizeY : integer;
Name  : string;
ReDraw: boolean;
Next  : PButton;
end;

type
PCheckbox = ^TCheckbox;
TCheckbox = record
PosX  : integer;
PosY  : integer;
SizeX : integer;
SizeY : integer;
Value : bool;
ReDraw: boolean;
Next  : PCheckbox;
end;

var
Table: PButton;


function Create(Name: string; PosX, PosY, SizeX, SizeY: integer): PButton;
var
P: PButton;
begin
New(P);
P^.PosX  := PosX;
P^.PosY  := PosY;
P^.SizeX := SizeX;
P^.SizeY := SizeY;
P^.Name  := Name;
P^.ReDraw:= true;

P^.Next  := Table;
Table    := P;

Result   := P;
end;

Как объединить в расширенную запись 2 записи?

> -- Илья Ермаков писал(а):
> Чтобы не сували некорректные типы в список, можно при создании списка указывать имя типа (как строковый параметр), а процедуры Add, Insert и т.п. будут проверять через Meta.Item.Is - что объект имеет этот тип.

Я не понял насчёт Meta.Item.Is. Моя идея заключается в том, что бы не возвращать указатель, а возвратить id. Тогда будет нельзя обратиться к полям записи.

Пример

function Create(Name: string; PosX, PosY, SizeX, SizeY: integer): integer;
var
P: PButton;
begin
New(P);
inc(Count); \\ по умолчанию count = -1
P^.Id      := Count;
P^.PosX  := PosX;
P^.PosY  := PosY;
P^.SizeX := SizeX;
P^.SizeY := SizeY;
P^.Name  := Name;
P^.ReDraw:= true;

P^.Next  := Table;
Table    := P;

Result   := P^Id;
end;

Как обращаться к записи.

function FindId(Id: integer): Pbutton;
var
P: PButton;
begin
P := Table;
while (P <> NIL) and (P^.Id <> Id) do
begin
P := P^.Next;
end;

Result := p;
end;

function GetPosX(Id: integer)
var
P: PButton;
begin
P := FindId(Id);
Assert(P <> NIL);

Result := P^.PosX;
end;

> -- Илья Ермаков писал(а):
> Ах, да, в Обероне-2 нет ANYPTR.Тогда потребуется базовый Object.

Как создать базовый объект в оберон 2. Как в object pascale?