Delphi-7 버전에는 Rtti 솔루션이 없습니다.
레코드 안에 포인터 배열로 @ ain의 제안을 구현하지 않으려는 경우 여기 은 variant part in the record
을 사용하여 유사한 작업을 수행 할 것을 제안합니다. 코드에서 명확하게하기 위해 myStruct.AddrX
이름을 자유롭게 사용할 수 있지만 동일한 필드를 처리하려면 myStruct.allAddresses[X-1]
을 사용하십시오.
Type
FreeStruct =
record
intExample : Integer; // not in the variant part
case boolean of // Variant structure where the different parts overlap in memory
true : (Addr1 : Pointer;
Addr2 : Pointer;
Addr3 : Pointer);
false : (allAddresses : array[0..2] of Pointer);
end;
procedure ClearFreeStruct(var AStruct : FreeStruct);
var
i: Integer;
begin
for i := 0 to High(AStruct.allAddresses) do
begin
// Dispose of allocated pointers
end;
end;
더 많은 포인터를 사용하여 구조를 확장 할 수 있지만 변형 필드 앞의 다른 필드도 포함 할 수 있습니다.
명확성을 포기하지 않고 레코드 내에 포인터 배열을 사용할 수 있습니다. enumeration
을 사용하면 각 포인터를 관련 이름으로 지정할 수 있습니다.
예 : myStruct.Addr [peAddr1]
Type
PointerEnum = (peAddr1,peAddr2,peAddr3);
FreeStruct =
record
intExample : Integer;
Addr : array[PointerEnum] of Pointer;
end;
procedure ClearFreeStruct(var AStruct : FreeStruct);
var
pe : PointerEnum;
begin
for pe := Low(PointerEnum) to High(PointerEnum) do
begin
// Dispose(AStruct.Addr[pe]);
end;
end;
왜'배열 [0..N] Pointer' 대신, 예를 들어 사용 하는가? – TLama
왜냐하면 나중에 그 레코드에 더 많은 vars 또는 다른 종류의 vars가있을 수 있기 때문입니다. 또한 처리가 더 쉽기 때문에 구조체가 필요합니다. –
음, 그 배열을 레코드에 넣으십시오. 즉,'type FreeStruct = record Addr : 포인터의 배열 [0..n]; {other fields} end' – ain