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
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
  #2  
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
  #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
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
  #4  
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
  #5  
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.475
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
  #6  
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 Neftali Ver Mensaje
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.
En realidad, yo casi siempre termino usando un TStringList precisamente por lo que dices. Es de lo más común que un objeto tenga un identificador natural de tipo cadena, además de que el TStringList también permite la ordenación personalizada con el método CustomSort. Desafortunadamente, la inserción ordenada sólo es posible para la ordenación regular. Claro que, ya bien visto, la rutina que puse para el TObjectList puede adaptarse para el TStringList.

En otro tenor de cosas, no sé si el compañero sebamawa ha considerado el uso de una bse de datos. A veces se enreda uno implementando estructuras de datos para guardar información que perfectamente podría manejarse con una base.

// Saludos
Responder Con Cita
  #7  
Antiguo 17-08-2012
sebamawa sebamawa is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 18
Poder: 0
sebamawa Va por buen camino
Estimados amigos, agradezco de sobremanera la ayuda y las sugerencias proporcionadas por parte de ustedes.

Respecto a
Cita:
En otro tenor de cosas, no sé si el compañero sebamawa ha considerado el uso de una bse de datos. A veces se enreda uno implementando estructuras de datos para guardar información que perfectamente podría manejarse con una base.
les comento que como menciono al principio de este hilo me estoy iniciando en Delphi, mi base previa es Pascal estándar. Por eso foros como este son de mucha ayuda para mi. Y respecto a la utilización de base de datos, todavía no llego a tanto jeje. Tal vez sea algo relativamente sencillo de implementar, pero por ahora estoy tratando de migrar algunas estructuras de Pascal estándar a Delphi, aunque tal vez no sea la mejor idea a veces según me da a entender roman.

Ya que estoy en este tema, me podrán recomendar un buen manual de Delphi donde pueda estudiar. Si estuviera su versión digital para descarga sería fantástico.

Gracias y saludos.
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 21:49:56.


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