program Project1;
{$modeswitch TypeHelpers}
uses
Classes;
type
TPIntArray = array of PInteger;
TCompArray = array of TComponent;
{ TPIntArrayHelper }
TPIntArrayHelper = type helper for TPIntArray
procedure Assign(AValue: Integer);
end;
procedure AssignVal(Ar: TPIntArray; Value: Integer);
var
I: PInteger;
begin
for I in Ar do
I^ := Value;
end;
function AllTagEqual(Ar: TCompArray; AVal: Integer): Boolean;
var
C: TComponent;
begin
for C in Ar do
if C.Tag <> AVal then
Exit(False);
Result := True;
end;
var
a,b,c: Integer;
c1,c2,c3: TComponent;
cm: TComponent;
{ TPIntArrayHelper }
procedure TPIntArrayHelper.Assign(AValue: Integer);
var
I: PInteger;
begin
for I in Self do
I^ := AValue;
end;
begin
AssignVal([@a, @b, @c], 10);
writeln(a, ' ', b, ' ', c);
TPIntArray([@a, @b, @c]).Assign(20);
writeln(a, ' ', b, ' ', c);
c1 := TComponent.Create(nil);
c1.Tag := 1;
c2 := TComponent.Create(nil);
c2.Tag := 2;
c3 := TComponent.Create(nil);
c3.Tag := 3;
for cm in [c1, c2, c3] do
case cm.Tag of
1: writeln('1');
2: WriteLn('2');
3: WriteLn('3');
end;
WriteLn(AllTagEqual([c1, c2, c3], 10));
for cm in [c1, c2, c3] do
cm.Free;
readln;
end.