Ver Mensaje Individual
  #1  
Antiguo 06-05-2015
doctorhd doctorhd is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 48
Reputación: 0
doctorhd Va por buen camino
Asignar memoria

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;{Puntero a TClaveValor}
Estas estructuras las utilizo para crear elementos en otra clase:
Código Delphi [-]
type ArrayPClaveValor = array of PClaveValor;{array de punteros a 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);{Dimencionamos el tamaño de la lista de campos}
    New(vPParam);
    vPParam.Clave:=AClave;
    vPParam.ValueDefault:=AValueDefault;
    vPParam.Value:=AValue;
    vPParam.Tipo:=ATipo;
    FParams[vElementos]:=vPParam;
  end;{procedure}
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....
Responder Con Cita