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 12-11-2008
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
TStringList es una clase TObject, la variable no contiene la clase en sí, sino su referencia. Esto quiere decir que es un puntero a la dirección de memoria en la que se contiene ese objeto.

En esa función lo que haces es devolver el puntero a una dirección de memoria que contiene el objeto que tu has destruido en la misma función, por ello te salta el error. En todo caso, si deseas seguir con esa sintaxis debería ser así el código:
Código Delphi [-]
function TForm1.GetStrings:TStrings;
var
  miLista: TStrings;
begin
  miLista := TStringList.Create;
  miLista.Add('uno');
  miLista.Add('dos');
  Result := miLista;
{  FreeAndNil(MiLista); // Esta linea da un error EAccessViolation}
end;
procedure TForm1.Button1Click(Sender: TObject);
var MiLista: TStrings;
begin
 MiLista:= GetStrings;  
 memo1.Lines.Assign(MiLista);
 FreeAndNil(MiLista);
 {Ahora ya has liberado el objeto creado en la función anterior}
end;
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #2  
Antiguo 12-11-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por DarkMan Ver Mensaje
{Ahora ya has liberado el objeto creado en la función anterior}
El problema de esto es que no tiene sentido crear un objeto en una función y liberarlo en otra. Por que? Porque en este caso una función es totalmente dependiente de la otra. Entonces para que separarlas?

Saludos.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #3  
Antiguo 12-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Desde mi punto de vista, no es buena idea que una rutina interna cree un objeto y que después sea el usuario del módulo el que deba destruirlo. Si ha de hacerse así, hay que documentarlo muy bien.

Lo que yo haría:
Código Delphi [-]
function TForm1.SetStringsTo(var milista:TStrings);
begin
  if not Assigned(milista) then
     raise Exception.Create('proc TForm1.GetStrings:Se necesita una lista  creada');
  miLista.Add('uno');
  miLista.Add('dos');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetStringsTo(memo1.lines);  
end;

Hay que guardar la semántica en delphi, dicho de otra forma, si veo este código dentro de 1 año:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var MiLista: TStrings;
begin
 MiLista:= GetStrings;  
 memo1.Lines.Assign(MiLista);
 FreeAndNil(MiLista);
 {Ahora ya has liberado el objeto creado en la función anterior}
end;
Lo primero que digo es: " MiLista no ha sido creado", ahora tengo que buscar la implementación de GetStrings y ver si dentro se llama a Milista.Create.

Lo correcto según mi opinión es:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var MiLista: TStrings;
begin
 MiLista:= TStringList.Create;
 GetStrings(Milista);
 FreeAndNil(MiLista);
end;
dentro de esa rutina queda claro que has creado un TStringList y lo estás liberando, no hay dudas. Ten en cuenta que TStrings es una clase con descendientes, por tanto milista puede ser un TstringList, TMemoStrings, TComboboxStrings, etc., todos ellos son compatibles porque heredan de TStrings, pero no son iguales. En ese código, dejas claro que se trata de un TStringList.

Por cierto, el nombre de la rutina, "GetStrings", me parece ambiguo, (ya sé que es sólo un ejemplo, pero en fin, a ver si me explico...) si dentro de GetStrings estoy añadiendo elementos a la variable "MiLista" yo le cambiaría el nombre, por algo así como "AddItemsTo(Milista)".

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
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
Buenas prácticas de programación elcigarra OOP 18 07-11-2008 17:05:27
Siete prácticas para un óptimo y rápido desarrollo de software poliburro Noticias 5 30-07-2008 16:48:55
buenas maneras... BlueSteel Humor 23 13-06-2008 08:11:21
Buenas Noticias faustoffp Noticias 0 04-09-2006 06:33:06
Ayuda Practicas En Delphi MARIAM23 Varios 1 22-07-2006 01:19:34


La franja horaria es GMT +2. Ahora son las 21:14:55.


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