Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-08-2012
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 sebamawa Ver Mensaje
Para mi habría que pasarle a la función dos punteros como parámetros
No, porque entonces estarías pasando al método Sort el resultado de comparar dos objetos en específico. El parámetro de Sort es una función (no el resultado de una función). Pasar funciones o procedimientos como parámetros se usa desde el pascal estándar.

Necesitaría ver el código exacto que estás usando para ver porqué el compilador te marca ese error.

// Saludos
Responder Con Cita
  #2  
Antiguo 16-08-2012
sebamawa sebamawa is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 18
Poder: 0
sebamawa Va por buen camino
Entiendo roman, es clara tu explicación y mala mi interpretación previa.
Haber si con parte del código se logra detectar el error.

En una unidad (UPersona) declaro un objeto persona de la siguiente forma:

Código:
TPersona = class
   private
     documento: Integer;
     nombre: String;
   public
     (* Constructores *)
     Constructor Create(doc: Integer; nom: String);
     
      (* Selectoras *)
      Function GetDocumento: Integer;
      Function GetNombre: String;

      (* Modificadoras *)
      Procedure SetDocumento(doc: Integer);
      Procedure SetNombre(nom: String);
   end;

implementation
  ...
end.
Luego en un TForm aparecen estos procedimientos asociados a dos botones.
Primero declaro las variables
Código:
var
  Form1: TForm1;
  p: TPersona;
  listaPersonas: TObjectList;
Primer botón:

Código:
procedure TForm1.Button1Click(Sender: TObject);
begin
  p:=TPersona.Create(StrToInt(Edit1.Text),Edit2.Text);
  listaPersonas:=TObjectList.Create(True);

  // Agregamos el objeto persona a la lista
  listaPersonas.Add(p);

  Edit1.Text:='';
  Edit2.Text:='';
end;
La idea es que cada vez que se presiona el botón Button1 se agrege un objeto persona a la lista TObectList, cuyos campos (documento y nombre) se leen desde dos TEdits.

Ahora el segundo botón:
Código:
procedure TForm1.Button2Click(Sender: TObject);
 function OrdenarPorDocumento(a: Pointer;b: Pointer): Integer;
 begin
   if TPersona(a).GetDocumento > TPersona(b).GetDocumento then
     result:=-1
   else
     if TPersona(a).GetDocumento < TPersona(b).GetDocumento then
       result:=1
     else
       result:=0;
 end;

begin
  ListaPersonas.Sort(OrdenarPorDocumento);
end;
La idea es que cuando se apreta el segundo botón (Button2) se ordene la lista.

Desde ya muy agredecido por cualquier comentario.

Saludos.
Responder Con Cita
  #3  
Antiguo 16-08-2012
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
Así, a bote pronto, lo único que se me ocurre es que declares la función OrdenarPorDocumento fuera del evento Button2Click. Es posible que los procedimientos locales no se puedan pasar como parámetros. Nunca lo he intentado.

// Saludos
Responder Con Cita
  #4  
Antiguo 16-08-2012
sebamawa sebamawa is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 18
Poder: 0
sebamawa Va por buen camino
Gracias roman por tu orientación.
Veré si puedo solucionar el problema.
Saludos.
Responder Con Cita
  #5  
Antiguo 16-08-2012
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
Desempolvando los algoritmos de inserción binaria, podemos hacer una rutina que inserte los objetos en orden:

Código Delphi [-]
procedure InsertaOrdenado(Lista: TObjectList; Comparar: TListSortCompare; Item: Pointer);
var
  Primero, Ultimo, Central, Resultado: Integer;

begin
  Primero := 0;
  Ultimo := Lista.Count - 1;

  while Primero <= Ultimo do
  begin
    Central := (Primero + Ultimo) div 2;
    Resultado := Comparar(Item, Lista[Central]);

    if Resultado < 0
      then Ultimo := Central - 1
      else Primero := Central + 1;
  end;

  Lista.Insert(Primero, Item);
end;

Por ejemplo, puedes definir la función comparadora:

Código Delphi [-]
function CompararDocumentos(P1, P2: Pointer): Integer;
begin
  if TPersona(P1).Documento > TPersona(P2).Documento then
    Result := 1
  else if TPersona(P1).Documento = TPersona(P2).Documento then
    Result := 0
  else
    Result := -1;
end;

al momento de insertar:

Código Delphi [-]
P := TPersona.Create(StrToIntDef(txtDocumento.Text, 0),  txtNombre.Text);
InsertaOrdenado(ListaPersonas, CompararDocumentos, P);

// Saludos
Responder Con Cita
  #6  
Antiguo 17-08-2012
sebamawa sebamawa is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 18
Poder: 0
sebamawa Va por buen camino
Excelente roman. Personalmente yo usaba búsqueda e inserción binaria en Pascal estándar con arreglos (listas estáticas), pero no con listas dinámicas (listas enlazadas). El hecho de tener en TObjectList un campo que indiza cada nodo facilita mucho las cosas.

Por otro lado, el inconveniente que tenia con la función comparadora lo solucioné con el llamado
Código:
Lista.Sort(@ComparaClientes);
en lugar de
Código:
Lista.Sort(ComparaClientes);
tomando el llamado de tu ejemplo del principio.

Saludos.
Responder Con Cita
  #7  
Antiguo 17-08-2012
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.473
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Otra opción que a veces utilizo yo y que resulta más rápida de implementar, aunque es posible que no tan eficiente, cuando se requiere algo similar a lo que planteas (objetos + campo de ordenación) es utilizar un TStringList.

Utilizo el campo como String (para definir la ordenación) y los objetos se almacenan en la propiedad Objects.
Sólo se puede utilizar si la conversión del campo se puede hacer a un string y la ordenación de este tipo es la correcta para el resultado esperado.

Código Delphi [-]
var
  TS:TStringList;
  key:String;
begin

  TS := TStringList.Create;
  TS.Sorted := True;
  TS.Duplicates := dupError;   // esto dependiendo de lo que se necesite

  ...

  // Añadir
  key :=   <--  Campo clave para ordenación
  i := TS.AddObject(key, obj)
  ...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 17-08-2012
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 sebamawa Ver Mensaje
Por otro lado, el inconveniente que tenia con la función comparadora lo solucioné con el llamado
Código:
Lista.Sort(@ComparaClientes);
en lugar de
Código:
Lista.Sort(ComparaClientes);
tomando el llamado de tu ejemplo del principio.
¿Qué versión de Delphi usas?

// Saludos
Responder Con Cita
  #9  
Antiguo 17-08-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
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.

Hice unas pruebas y si la función pasada como argumento está fuera del procedimiento/función (que es como la he usado anteriormente) se la puede llamar:
Código Delphi [-]
  Lista.Sort(Compare);

Ahora, enviando como argumento la dirección de la función como menciona sebamawa, y figura en el ejemplo de la ayuda de Delphi:
Código Delphi [-]
  Lista.Sort(@Compare);
la llamada trabaja tanto si la función es anidada como si es externa.


También es muy interesante tu enfoque Neftali

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
adotable ordenado por un campo leorene Conexión con bases de datos 2 13-02-2007 01:00:16
Select ordenado por un campo pero localizado por otro ingel SQL 2 04-01-2006 17:33:23
Imprimir el listado ordenado por un campo ilichhernandez Impresión 3 03-11-2005 19:44:13
DBLookupComboBox ordenado Supermagayin Conexión con bases de datos 2 12-04-2005 00:18:33
Grid ordenado al añadir registro Tomás Varios 0 13-03-2004 14:58:02


La franja horaria es GMT +2. Ahora son las 09:11:58.


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