Ver Mensaje Individual
  #3  
Antiguo 25-03-2011
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Reputación: 18
LoPiTaL Va por buen camino
Hola masedano,

Me parece que no estás enfocando bien el problema. Verás: tú quieres acceder a una serie de strings, contenidos estos en un archivo. Por tanto, necesitarás una propiedad que contenga strings y alguna variable en la que indiques el archivo. Yo lo haría así:
Código Delphi [-]
unit UnEjemplo;
type  TCustomObj = class(TWinControl)  
protected    
  FStringList: TStringList;    
  FOpenedFile: boolean;    
  function GetTexto(Index: integer): string;    
  procedure SetTexto(Index: integer; const AValue: string);  
public    
  property Texto[Index: integer]: string read GetTexto write SetTexto;  

  Constructor Create;  
  Destructor Destroy; override;  
end;  

TObj = class(TCustomObj)  
published    
  property Texto;  
end;

implementation

contructor Create;
begin  
  FStringList:=TStringList.Create;
end;

Destructor Destroy;
begin  
  FStringList.Free;
end

function TCustomObj.GetTexto(Index: integer): string;
begin  
  if (not FOpenedFile)  
  begin    
    {Puedes usar aquí una llamada a algún TOpenDialog, creándolo
      y destruyéndolo}    
      FStringList.LoadFromFile(AlgunArchivo);  
  end;  
  Result:= FStringList[Index];
end;

procedure TCustomObj.SetTexto(Index: integer; const AValue: string);
begin  
  if (FOpenedFile)
    FStringList[Index]:=AValue;

//No recomiendo guardar a archivo cada vez que se modifique algo,
//sino hacerlo o con una llamada explícita a alguna función que sea tipo "Guarda!"
//o al destruir el objeto, y hacerlo siempre mediante FStringList.SaveToFile(nombreArchivo)
end;

Cita:
La función GetTexto crea todas las veces un objeto de tipo TStringList.
¿Esto no es algo malo?
Generalmente sí. En lugar de crearlo cada vez, leer del archivo cada vez, etc... debería hacerlo sólo la primera vez. Crearlo / destruirlo en el constructor / destructor de la clase, y leerlo, o bien en el constructor si el archivo ya es conocido, o bien la primera vez que intentas leer usando una variable (FOpenedFile) como te he mostrado.

Cita:
¿Al estar generándose un objeto cada vez que se ejecuta la función no se está consumiendo mas memoria?
¿Cuando se destruye este objeto?
A la primera pregunta sí, debido a la segunda pregunta: nunca destruyes el objeto, por tanto, nunca liberas memoria y cada vez consumes más. El problema de crear el objeto dentro de una función y retornarlo a la función que la llama es que es un riesgo potencial de Memory Leaks, ya que estás dejando la tarea de destruirlo a todas las funciones que hagan una llamada a tu función.
Y si encima la llamada es del estilo: miStr:=X.Texto[2], entonces pasa totalmente desapercibida dicha creación, ya que en la función que llama a GetTexto (a través de X.Texto) no tienes ningún TStringList que puedas destruir, sino tienes una simple string.

Espero haberte ayudado.
Un saludo,
LoPiTaL

Última edición por LoPiTaL fecha: 25-03-2011 a las 08:51:39.
Responder Con Cita