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 18-09-2006
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 20
elcigarra Va por buen camino
ordenar un TList

Tengo una clase TObject (miclase) definida con variables de distintos tipos y una lista (TList) de objetos "miclase".
¿Es posible ordenar esa lista de a cuerdo a una solo de esas variables de miclase (de tipo string)?
Responder Con Cita
  #2  
Antiguo 18-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Se me ocurre que derives una nueva clase de "TList" y añadas allí un método para realizar lo que precisas. No sé qué te parecerá...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 18-09-2006
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 20
elcigarra Va por buen camino
Podría, pero pensé que ya lo había. De hecho esperaba que me mencionaras el método "Sort" de la clase pero la verdad es que no entendí como usarlo y la ayuda de delphi no me aclaró mucho y no funciona en mi caso por alguna razón qu edesconozco. Tal vez no sirva para eso.
Responder Con Cita
  #4  
Antiguo 18-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Pues sí, revisando la ayuda (que no se me ocurrió antes, la verdad) se ve que "TList" cuenta con un método "Sort" que puede ayudarte. Hay un ejemplo y todo...
Cita:
The following code sorts the objects in a list in alphabetical order based on their names. It assumes that the list contains only component references.

The CompareNames function performs the comparisons between objects in the list. The list is sorted when the user clicks a button.

Código Delphi [-]
function CompareNames(Item1, Item2: Pointer): Integer;
begin
  Result := CompareText((Item1 as TComponent).Name, (Item2 as TComponent).Name);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  List1.Sort(@CompareText);
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 18-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Para usar el método Sort de TList, necesitas crear una función que devuelva un Integer y reciba como parámetros dos punteros:

Código Delphi [-]
function Compare(Item1: Pointer; Item2: Pointer): Integer;
var
  MiClase1: TMiClase;
  MiClase2: TMiClase;

begin
  MiClase1 := TMiClase(Item1);
  MiClase2 := TMiClase(Item2);
  if MiClase1.Propiedad > MiClase2.Propiedad then
    Result := 1
  else
    if MiClase1.Propiedad = MiClase2.Propiedad then
      Result := 0
    else
      Result := -1
end;


Saludos...
Responder Con Cita
  #6  
Antiguo 18-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
Hay un ejemplo y todo...
Ejemplo que, me parece, no puede compilar. Mejor hacer como Marcos.

// Saludos
Responder Con Cita
  #7  
Antiguo 18-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Y qué culpa tengo yo de que el ejemplo de la ayuda de Delphi tenga una pequeña errata, porque es lo que parece. Ahora, de la ayuda de Delphi este código que sí que compila, o sea, se puede hacer, perfectamente, como se dice en la ayuda.

Código Delphi [-]
unit Unit1;

interface

uses
  Forms, Classes, Controls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject;
     var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    FMiLista: TList;
  end;

var
  Form1: TForm1;

type
  TMiClase = class(TObject)
  private
    FNombreClase: string;
  public
    property NombreClase: string
     read FNombreClase write FNombreClase;
  end;

implementation

{$R *.dfm}

uses
  SysUtils, Dialogs;

function CompararNombres(item1, item2: Pointer): integer;
begin
  Result := CompareText(TMiClase(item1).NombreClase,
             TMiClase(item2).NombreClase);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FMiLista := TList.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FMiLista.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  unaClase, otraClase: TMiClase;
begin
  unaClase := TMiClase.Create;
  unaClase.NombreClase := 'Zaragoza';

  otraClase := TMiClase.Create;
  otraClase.NombreClase := 'Abecedario';

  FMiLista.Add(unaClase);
  FMiLista.Add(otraClase);

  FMiLista.Sort(@CompararNombres);

  for i := 0 to FMiLista.Count-1 do
  begin
    // Mostrará primero Abecedario y luego Zaragoza
    ShowMessage( TMiClase(FMiLista.Items[i]).NombreClase );
  end;
end;

end.

¿No?

La errata parece estar en el puntero a la función que se pasa como parámetro al método "Sort" de "Tlist":

Código Delphi [-]
List1.Sort(@CompareText);

Cuando debería ser:

Código Delphi [-]
List1.Sort(@CompareNames);
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 18-09-2006 a las 21:26:47.
Responder Con Cita
  #8  
Antiguo 18-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El ejemplo de la ayuda no compila porque el operador as no es aplicable.

// Saludos
Responder Con Cita
  #9  
Antiguo 18-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Vale, pero, tampoco compilaría aunque hicieras el "cast" como lo hago yo más arriba: porque el puntero no se pasa a la función correcta, y eso es una errata de la ayuda o me equivoco. Por otro lado todavía no tengo claro por qué el operador "as", como dices, no es aplicable...

Desde luego, si quitamos eso y la posible errata el código que he expuesto compila y funciona como se espera. O me equivoco...
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 18-09-2006 a las 21:49:47.
Responder Con Cita
  #10  
Antiguo 18-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
No aplica el operador as por que Pointer no es una clase, es solo un tipo de datos y este operador es un operador de clases.



Saludos...
Responder Con Cita
  #11  
Antiguo 18-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Después de de la primera respuesta de elcigarra me disponía a hacer un ejemplito, algo sencillo, pero tuve que atender a otro asunto durante un rato. Cuando vuelvo le doy a "Recargar" y me encuentro con todo esto . Así no hay forma de responder, si no te das prisa te pisan la respuesta
Responder Con Cita
  #12  
Antiguo 18-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Bien dicen que "camarón que se duerme..."
Responder Con Cita
  #13  
Antiguo 18-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Maeyanes
No aplica el operador as por que Pointer no es una clase, es solo un tipo de datos y este operador es un operador de clases.
¿Cómo es que se pone en el ejemplo de la ayuda de Delphi, entonces? Aunque, si se piensa en la errata que parece contener... no sería extraño que algo más estuviera también equivocado, incluso cuando se mencione esto:

Cita:
The following code sorts the objects in a list in alphabetical order based on their names. It assumes that the list contains only component references.
Que alguien me lo explique, por favor.

Cita:
Empezado por Domingo
Después de de la primera respuesta de elcigarra me disponía a hacer un ejemplito, algo sencillo, pero tuve que atender a otro asunto durante un rato. Cuando vuelvo le doy a "Recargar" y me encuentro con todo esto . Así no hay forma de responder, si no te das prisa te pisan la respuesta
Sí, pero, cada uno aporta lo suyo, unos más modestamente que otros (hablo por mí). Por ejemplo, al ver que te habías unido al Hilo he pensado, ahí está Seoane con la solución del caso.

Por cierto, voy a ver si me preparo algo para cenar... y ceno... : D
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #14  
Antiguo 18-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por maeyanes
No aplica el operador as por que Pointer no es una clase, es solo un tipo de datos y este operador es un operador de clases.
Así es. Si no entiendo por qué tanto brinco estando el suelo tan parejo.

¿Hay que defender la ayuda de Delphi?

// Saludos
Responder Con Cita
  #15  
Antiguo 18-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Cita:
Empezado por dec
¿Cómo es que se pone en el ejemplo de la ayuda de Delphi, entonces? Aunque, si se piensa en la errata que parece contener... no sería extraño que algo más estuviera también equivocado, incluso cuando se mencione esto:


Que alguien me lo explique, por favor.
Pues la única explicación que encuentro es que el que elaboró este ejemplo no lo compiló para probar que funcionara... jejeje



Saludos...
Responder Con Cita
  #16  
Antiguo 18-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Román
¿Hay que defender la ayuda de Delphi?
¿De qué estamos hablando? No se trata de defender la ayuda de Delphi, ¿cómo se te ha ocurrido algo así? Se trata de que en la ayuda, en este caso, se puede ver una solución "lógica" a lo que nos ocupa. A lo menos a mí me lo parece. Ahora bien, parece que el ejemplo de la ayuda tiene algunos errores... o erratas... o algo... natural, comprensible, humano.

De hecho mi primera respueste fue que se implementase un método de ordenación en una clase derivada de "TList",... porque me parecía lo más lógico del mundo... claro, que, yo no contaba (sabía) que "TList" ya implementa un método "Sort".

Ahora bien, ¿se trata de utilizar el método "Sort", verdad? Pues entonces, puede hacerse siguiendo la ayuda de Delphi aparte y/o a pesar del ejemplo. Lo demuestro arriba, ¿por eso quiero defender la ayuda de Delphi?

Y ahora sí que me voy a cenar... por cierto...
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 18-09-2006 a las 22:02:59.
Responder Con Cita
  #17  
Antiguo 18-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
¿De qué estamos hablando?
Eso a mi me gustaría saber. Tú citaste un ejemplo de Delphi y yo me limité a señalar que es erróneo y que el código de Marcos estaba mejor. Todo lo demás no lo entiendo.

// Saludos
Responder Con Cita
  #18  
Antiguo 18-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Román
Eso a mi me gustaría saber. Tú citaste un ejemplo de Delphi y yo me limité a señalar que es erróneo y que el código de Marcos estaba mejor. Todo lo demás no lo entiendo.
Yo indiqué la ayuda de Delphi en primer lugar, el ejemplo vino luego. Lo que parece ser erróneo es el ejemplo de la ayuda de Delphi, por eso no entiendo cómo lo comparas con el código de Marcos: no son comparables, sencillamente, el del ejemplo no compila, no funciona.

Ahora bien, siguiendo la ayuda... fijándose uno en el ejemplo... y dándose cuenta del posible error en este, todavía cree que hay que aprovechar el método "Sort" de la clase "TList", y así es que todo va bien, es decir, puede utilizarse sin problemas.

Ahora bien, el código de Marcos y el que yo mismo he propuesto (siguiendo la ayuda de Delphi) sí que podrían compararse, a lo menos en cuanto a que ambos consigue el objetivo. ¿Tú con cuál te quedas Román? Y, sobre todo, ¿por qué con uno y no con otro?

Edito: Ahora me doy cuenta de que no había mirado bien código de Marcos... ¡es el mismo que yo he propuesto! ¡es justo eso! Hum... me parece que he metido la pata y no sé bien cómo ni de qué manera, ¿o me equivoco? Decirme que no, por favor.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 18-09-2006 a las 22:32:05.
Responder Con Cita
  #19  
Antiguo 18-09-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Bueno, mi ejemplo es precisamente la función que se le pasa al método Sort, ahora, tal vez me faltó especificar como mandar a llamar al método Sort usando la función creada con anterioridad...

Creo que de ahí un poco la confusión...



Saludos...
Responder Con Cita
  #20  
Antiguo 18-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues tú sabrás de qué hablas. Yo no

// Saludos
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
TList Delphi rose Varios 4 08-05-2006 16:58:30
Uso del Objeto TList aromero OOP 10 21-10-2005 17:30:11
Problemas con TList arantzal .NET 2 09-12-2004 09:14:37
TList y TDBGrid juntos...? Carlos Claveria OOP 2 23-10-2003 16:53:29
TList HERNAN Varios 2 10-10-2003 03:47:59


La franja horaria es GMT +2. Ahora son las 10:13:21.


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