在Delphi中创下一项记录

时间:2013-02-04 14:53:25

标签: delphi delphi-7

我有一条记录,其中包含一些我想要释放的指针。

type 
 FreeStruct = record
 Addr1 : Pointer;
 Addr2 : Pointer;
 Addr3 : Pointer;
 // ....
end;

所以我想做点什么:

var
 MyStruct : FreeStruct:
begin
 //MyStruct.Addr1 := ...;
 for i := 0 to NumberOfFieldsInRecord do begin
  VirtualFree (ValueOfFieldNumberOfMyStruct[I],0, MEM_RELEASE);
 end;
end;

我听说像RTII这样的东西,但我不知道如何正确使用它与记录和Delphi 7。

2 个答案:

答案 0 :(得分:2)

据我所知,没有方法支持记录字段迭代。 但是,您可以在较低级别上使用记录结构(请查看此处:http://www.delphigroups.info/2/18/295611.html

也许您最好重新构建代码,这样就不需要记录指针存储。

答案 1 :(得分:1)

您的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;