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
FStringList.LoadFromFile(AlgunArchivo);
end;
Result:= FStringList[Index];
end;
procedure TCustomObj.SetTexto(Index: integer; const AValue: string);
begin
if (FOpenedFile)
FStringList[Index]:=AValue;
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