Ver Mensaje Individual
  #26  
Antiguo 02-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
Quizás estemos usando el TObjectList cuando no deberíamos usarlo.

Me explico: TObjectList está pensado para guardar una lista de objetos, su principal cualidad (por decirlo así) es encontrar los objetos por su posición (índice) o bien por su dirección (puntero de TObjects), si no necesitamos estas características, quizás no deberíamos usar esta clase.

Tenemos una lista de Edits creados en tiempo de ejecución y cuando el usuario teclea debemos localizarlo, ¿para qué complicarnos la vida añadiendo un nombre único a cada TEdit y después usar ese nombre para encontrarlo? Si tenemos el objeto Sender ya podemos encontrar por ese puntero (haciendo uso de TObjectList.IndexOf) el Tedit en cuestión dentro de nuestra lista (no creo que vayamos a tener 10.000 TEdits creados en un Form ). Usar FindComponent será más costoso que el TobjectList.IndexOf, precisamente porque habrá más controles creados en el form, y su búsqueda tardará más.

Otra pega que le veo al StringList, es precisamente tener un único identificador para localizar el objeto, ¿qué ocurre si quiero localizar un Objeto por alguna propiedad que lleva dentro dicho objeto?, pues tenemos la misma desventaja que al usar TObjectList, tenemos que hacer un bucle, recorriendo todos los objetos que tiene el StringList y buscando la dichosa propiedad.

Yo al menos, jamás he derivado de TStrings o TStringList para obtener funcionalidades extras, sin embargo, si lo he hecho de TObjectList para tratar mis propios objetos sin tener que aplicar moldeo de tipos en mi programa principal. Para mí, ya es muy clarificador el código resultante y si le veo utilidad hacerlo.

El método Sort de un TObjectList es también muy útil, ya que creando varias funciones de ordenamiento permite realizar auténticas virguerías con los objetos creados.

Aquí un ejemplo práctico:
TFolders es un TObjectList, cada elemento vuelve a ser un TObjectList (TFolder) , por último, cada elemento de este último TObjectList es un TObject a secas (TPathElement), que tendrá una serie de propiedades inherentes a cada archivo, como:
- ruta relativa de una dada
- ruta absoluta
- tamaño del archivo
- etc.

Código Delphi [-]
{------------------------------------------------------------------------------
  TFolders son las carpetas  que se van a crear

  Es una lista que contiene una lista dual

  TFolders
     |--------- TFolder
     |             |------- Archivos encontrados (TPathElement)
     |             |------- Archivos encontrados (TPathElement)
     |             |------- Archivos encontrados (TPathElement)
     |
     |--------- TFolder
                   |------- Archivos encontrados (TPathElement)
                   |------- Archivos encontrados (TPathElement)

-------------------------------------------------------------------------------}

// posibilidades de ordenación:
{ Por el nombre de archivo (scaption)
   por el tamaño de carpeta (sValue)
   sin ordenación (sNone)
}
  TSort = (sCaption, sValue,sNone);
   
  TFolder = class(TDualList)
    public
     function Size :Int64; // suma el tamaño de todos los archivos que contiene
  end;

  TFolders = class(TObjectList)
    private
      function GetItem(Index: Integer): TFolder;
      procedure SetItem(Index: Integer; const Value: TFolder);
    public
      function Add(AObject: TFolder): Integer;
      procedure Sort(const SortBy:TSort;const Order:TSortOrder);overload;
      procedure Sort(funcion:TListSortCompare);overload;

      property Items[Index: Integer]: TFolder read GetItem write SetItem; default;
  end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 02-03-2007 a las 19:53:07.
Responder Con Cita