Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-03-2011
Avatar de masedano
masedano masedano is offline
Registrado
 
Registrado: jun 2007
Posts: 9
Poder: 0
masedano Va por buen camino
Implementar una propiedad de tipo TStringList

Estimados

Tengo la necesidad de agregar una propiedad a un componente.
Dicha propiedad quiero que esté publicada cuando se use dicho componente.
Esta propiedad será llamada Texto (por ejemplo).
Quiero que sea de tipo TStringList.
El problema está en que esta propiedad, al momento de leerla o escribirla no accede a un objeto privado del componente sino a otra fuente de datos (un archivo, por ejemplo u otra fuente de datos).
Entonces, con estos parámetros les pego un código a modo de ejemplo:

Código Delphi [-]
unit UnEjemplo;

type
  TCustomObj = class(TWinControl)
  protected
    function GetTexto: TStringList;
    procedure SetTexto(const AValue: TStringList);
  public
    property Texto: TStringList read GetTexto write SetTexto;
  end;

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

implementation

function TCustomObj.GetTexto: TStringList;
begin
  Result := TStringList.Create;
  Result.Text := UnaFuncionQueDevuelveUnString;
end;

procedure TCustomObj.SetTexto(const AValue: TStringList);
begin
  UnaFuncionQueActualizaUnString(AValue.Text);
end;


Las dudas son:
La función GetTexto crea todas las veces un objeto de tipo TStringList.
¿Esto no es algo malo?
¿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?

Desde yá muchas gracias por su tiempo
Saludos

Última edición por masedano fecha: 25-03-2011 a las 03:36:25.
Responder Con Cita
  #2  
Antiguo 25-03-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola masedano.

Creo que podrías usar una variable privada de tipo TStringList cuya creación tenga lugar en el constructor y su liberación en el destructor.
De ese modo la vida de la variable comienza con la instancia del objeto, se utiliza durante la existencia del mismo y se libera cuando es destruido.
El método SetTexto debería guardar los valores en la variable privada y el método GetTexto obtenerlos de ella.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 25-03-2011
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
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
  #4  
Antiguo 25-03-2011
Avatar de masedano
masedano masedano is offline
Registrado
 
Registrado: jun 2007
Posts: 9
Poder: 0
masedano Va por buen camino
ecfisa y LoPiTaL

Muchas gracias por vuestras respuestas.
Con ellas veré que puedo resolver.
Si tengo novedades les cuento.

Saludos
Responder Con Cita
  #5  
Antiguo 26-03-2011
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Ui!
Perdón ecfisa, no vi tu respuesta. Básicamente lo que he comentado es lo mismo que pusiste tú.

Un saludo,
LoPiTaL
Responder Con Cita
  #6  
Antiguo 28-03-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por LoPiTaL Ver Mensaje
Ui!
Perdón ecfisa, no vi tu respuesta. Básicamente lo que he comentado es lo mismo que pusiste tú.

Un saludo,
LoPiTaL
Hola LoPiTaL.

No tenés por que disculparte, todo lo contrario . Seguramente ha ayudado mucho a masedano el código que aportaste y que además está muy bién explicado.


Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 28-03-2011 a las 22:16:45.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Propiedad del tipo TComponentClass basti OOP 2 16-03-2007 09:06:29
Implementar una nueva opción para la propiedad "FormStyle" JM75 OOP 3 15-02-2007 15:53:44
Propiedad tipo TFileName Kreyser OOP 3 20-10-2005 18:44:54
Propiedad tipo Objeto buildero_d OOP 16 09-09-2005 00:01:55
Propiedad de tipo TShortCut eMax OOP 8 11-06-2003 22:47:01


La franja horaria es GMT +2. Ahora son las 07:32:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi