Holas, tengo la siguiente duda, he creado un record con la siguiente estructura:
Código Delphi
[-]
type
TClaveValor = record
private
FClave:string;
FValueDefault:Variant;
FValue:Variant;
FTipo:TEnumTypeData;
procedure SetClave(const Value:string);
procedure SetValueDefault(const Value:variant);
procedure SetValue(const Value:variant);
procedure SetTipo(const Value:TEnumTypeData);
public
property Clave: string read FClave write SetClave;
property ValueDefault: Variant read FValueDefault write SetValueDefault;
property Value:Variant read FValue write SetValue;
property Tipo: TEnumTypeData read FTipo write SetTipo;
end;
A su vez he creado un tipo que apunta a dicho record:
Código Delphi
[-]type PClaveValor = ^TClaveValor;
Estas estructuras las utilizo para crear elementos en otra clase:
Código Delphi
[-]
type ArrayPClaveValor = array of PClaveValor;
type
TParamRegWin = class
private
FParams:ArrayPClaveValor;
function getParam(const Index: Integer): PClaveValor;
procedure setParam(const Index: Integer; const Value: PClaveValor);
function getCount:Integer;
....
public
constructor Create;
destructor Destroy; override;
procedure AddParam(const AClave:string; const AValueDefault:Variant;AValue:Variant; const ATipo:TEnumTypeData);
....
public
property Param[const Index: Integer]:PClaveValor read getParam write setParam;
property Params:ArrayPClaveValor read FParams write FParams;
property Count:Integer read getCount;
end;
El problema se suscita al crear un nuevo elemento, el cual lo realizo en el procedure AddParam:
Código Delphi
[-]
procedure TParamRegWin.AddParam(const AClave:string; const AValueDefault:Variant;AValue:Variant; const ATipo:TEnumTypeData);
var vElementos:integer; vPParam:PClaveValor;
begin
vElementos:=Length(FParams);
Setlength(FParams,vElementos+1);
New(vPParam);
vPParam.Clave:=AClave;
vPParam.ValueDefault:=AValueDefault;
vPParam.Value:=AValue;
vPParam.Tipo:=ATipo;
FParams[vElementos]:=vPParam;
end;
Como veran utilizo el comando NEW para asignar la memoria al nuevo objeto, el cual cumple su función, pero antes de llegar a utilizar New utilice:
Código Delphi
[-]vPParam:=System.AllocMem(SizeOf(TClaveData));
Pero su utilización hacia que se borrara parte del contenido de variables que no participaban dentro del procedure, también probé:
Código Delphi
[-]GetMen(vPParam,SizeOf(TClaveData));
Pero también tuve problemas, en la asignación de los valores al puntero.
Mi pregunta es AllocMem y GetMen hacen asignación de memoria disponible o asignan memoria de la que primero encuentran, ya que de acuerdo a las pruebas realizadas, ambos métodos interfieren con la memoria utilizada por otras variables o componentes asignados con anterioridad....Y por ultimo que diferencia existe entre estos dos métodos y el comando NEW...
Saludos....