Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
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 17-06-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 28
eduarcol Va por buen camino
pues para eso deberias tener una lista, y hacer algo asi:

Código Delphi [-]
while x in Lista do
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #2  
Antiguo 17-06-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 26
BlueSteel Va por buen camino
Cool

Cita:
Empezado por eduarcol Ver Mensaje
pues para eso deberias tener una lista, y hacer algo asi:


Código Delphi [-]while x in Lista do

si estaba pensando algo parecido.... bueno, los favorecidos los voy metiendo en una tabla temporal.... donde tambien almaceno el numero sorteado.....

así que tendré que ir comparando si el numero esta dentro de los ya favorecidos.... lo que me da lata es que puede demorarse mucho en recorrer la tabla, ya que los registros de la tabla temporal se van insertando según posición de llegada, por lo que tendre que verificar toda la tabla cada vez que salga un numero nuevo.... y debo generar un listado de 300 ganadores....??

bueno, ahora es muy tarde....así que me voy a jugar unas mesitas de billar para relajarme.. y mañana veré como lo realizo...

Salu2
__________________
BlueSteel
Responder Con Cita
  #3  
Antiguo 17-06-2008
Avatar de Black_Ocean
Black_Ocean Black_Ocean is offline
Miembro
 
Registrado: nov 2006
Posts: 128
Poder: 20
Black_Ocean Va por buen camino
Hola,

Para almacenar datos temporales para este caso como el tuyo, lo más cómodo es trabajar con conjuntos. Delphi implementa esto de una manera muy simple, ya que es el mismo concepto que los conjuntos cuando te los enseñan en básica =).

Aquí te pongo un ejemplo de cómo trabajar con conjuntos en Delphi.

Código Delphi [-]
type
  TSelecciones = set of 1..255; // esto se refiere a que el conjunto puede contener números desde el 1 hasta el 255

var
  Seleccionados: TSelecciones;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Seleccionados := [1, 2, 3]; //inicializamos el conjunto con estos 3 numeros cualquieras que los contendrá

  if not (4 in Seleccionados) then //chequeamos si el 4 está contenido en el conjunto, como no está, devuelve falso
    ShowMessage('No está el número en el conjunto :-(');
  
  Seleccionados := Seleccionados + [4]; //Agregamos al conjunto el número 4 (ahora contendrá el 1, 2, 3 y el 4)

  if 4 in Seleccionados then // Ahora como el conjunto aparte de los 3 números iniciales contiene tambien el 4 devolverá verdadero =)
    ShowMessage('Ahora está el número en el conjunto =)');
end;

Saludos y espero que te ayude

Última edición por Black_Ocean fecha: 17-06-2008 a las 01:37:47.
Responder Con Cita
  #4  
Antiguo 17-06-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 25
Caro Va por buen camino
Hola BlueSteel, también podrías utilizar un StringList y su función IndexOf para buscar si algun número ya esta en la lista, mas o menos sería así el codigo.

Código Delphi [-]
 Lista : TStringList;
....
....
var
 Numero, Limite : Integer;
begin
 Randomize;
 Limite := 1300;
 Numero := Random(Limite);
 if Lista.IndexOf(IntToStr(Numero))=-1 then
  Lista.Add(IntToStr(Numero))
 else
  begin
   While (Lista.IndexOf(IntToStr(Numero))<>-1) and (Lista.Countdo
    Numero := Random(Limite);

   if Lista.IndexOf(IntToStr(Numero))=-1 then
    Lista.Add(IntToStr(Numero));
  end;

donde Lista es un StringList, ademas que debes crearlo talvez en el OnCreate de tu formulario.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 03-05-2010 a las 18:26:16.
Responder Con Cita
  #5  
Antiguo 17-06-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 26
BlueSteel Va por buen camino
Cool

Hola Caro

Muchas gracias por tu respuesta...

me da error aquí ??? estará bien esto o le falta algo ???

Cita:
While (Lista.IndexOf(IntToStr(Numero))<>-1) and (Lista.Count
Lo otro es que nunca he usado un StringList, así que desde donde saco el componente (pestaña del delphi 7.. bueno si es que es un componente)... o solo se declara por código...

Salu2
__________________
BlueSteel

Última edición por BlueSteel fecha: 17-06-2008 a las 20:15:55.
Responder Con Cita
  #6  
Antiguo 17-06-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Hola...

Un TStringList no es un componente, es una clase, la cual está declarada en la unidad Classes...

Y recuerda, tienes que decir que error es el que te da, para que te podamos ayudar...

Hasta pareces nuevo...


Saludos...
Responder Con Cita
  #7  
Antiguo 17-06-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 26
BlueSteel Va por buen camino
Cool

Bueno...

al final lo realice de otra forma... sin crear un StringList...

Código Delphi [-]
Procedure TForm1.Sortear;
Var
   Num_Registros : Integer;
   sFin : Boolean;
begin
    sFin := False;
    Num_Registros := ADQ_Select.RecordCount;
    Randomize;

    While sFin = False Do //Ciclo para verificar si el numero ya habia sido seleccionado
    Begin
        sGanador.AsInteger := RandomRange(1,Num_Registros);
    With Premiados Do
    Begin
         If Not Locate('Nro',sGanador.Text,[]) Then  // Aqui verifico que no este dentro de la tabla temporal.. si no esta lo agrego..
            Begin
                 ADQ_Select.Locate('Nro',sGanador.Text,[]);
                 Premiados.Append;
                 Premiados.FieldByName('Nro').AsString       := IntToStr(ADQ_Select['Nro']);
                 Premiados.FieldByName('Rut').AsString       := ADQ_Select['Rut'];
                 Premiados.FieldByName('Nombre').AsString    := Concat(ADQ_Select['Nombres'],' ',ADQ_Select['Apellidos']);
                 Premiados.FieldByName('Contrato').AsInteger := ADQ_Select['Contrato'];
                 Premiados.FieldByName('Abono').AsInteger    := ADQ_Select['Abono'];
                 Premiados.FieldByName('Ubicacion').AsString := ADQ_Select['Ubicacion'];
                 Premiados.Post;
                 sFin := True;
            End;
    End;
    End;
end;

bueno, y el codigo anterior lo llamo así

Código Delphi [-]
procedure TForm1.BitBtn4Click(Sender: TObject);
Var
   i : Integer;
begin
     For i:=1 to 300 Do
     Begin
          Sortear;
     End;
end;


Bueno, el proceso en si se demora alrededor de 2 segundos en seleccionar los 300 numeros de un universo de 1505... así que quede más que satisfecho con el código...

maeyanes
tines toda la razón.. no di el código ni mensaje de error... creo que yo mismo me enviaré a leer la guia de estilo.. y como penitencia realizaré 1000000 de.. debo entregar codigo de error

Código Delphi [-]
For i:=1 to 1000000 Do
  ShowMessage('Debo engregar el error completo, con código y mensaje de error... no volverá a pasar de nuevo');


Salu2
__________________
BlueSteel

Última edición por BlueSteel fecha: 17-06-2008 a las 21:03:11.
Responder Con Cita
  #8  
Antiguo 17-06-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.442
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
Cita:
Empezado por BlueSteel Ver Mensaje
...lo que me da lata es que puede demorarse mucho en recorrer la tabla, ya que los registros de la tabla temporal se van insertando según posición de llegada, por lo que tendre que verificar toda la tabla cada vez que salga un numero nuevo.... y debo generar un listado de 300 ganadores....??
Utiliza un TStringList en memoria ordenado. Las búsquedas son dicotómicas y casi inmediatas.
A medida que vayan saliendo buscas y añades los nuevos.
__________________
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
  #9  
Antiguo 17-06-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 25
Caro Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
...un TStringList en memoria ordenado.....
Una pregunta Neftalí, esto significa que a parte de usar un TStringList y la función IndexOf, debemos también ordenarlo con Lista.Sorted := True, supongo que cada vez que se haya introducido un número a nuestra lista.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #10  
Antiguo 17-06-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.442
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
Cita:
Empezado por Caro Ver Mensaje
Una pregunta Neftalí, esto significa que a parte de usar un TStringList y la función IndexOf, debemos también ordenarlo con Lista.Sorted := True, supongo que cada vez que se haya introducido un número a nuestra lista.
Al crear el stringList lo creas con la propiedad Sorted a True.

Código Delphi [-]
  TS := TStringList.Create();
  TS.Sorted := True;
  TS.Duplicates := dupError;

En tu caso yo aseguraría que no hay duplicados, ya sea con dupError o dupIgnore (mejor el primero).

A partir de ahí puedes utilizar IndexOf o Find para encontrar el elemento que necesites. No necesitas reordenar maualmente cada vez.
Al estar ordenada e insertar elementos ya te los añadirá ordenados. Es un poco más lento al insertar/borrar, pero infinitamente más rápido al buscar.
__________________
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
  #11  
Antiguo 17-06-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 25
Caro Va por buen camino
Me ha quedado claro Neftali, muchas gracias por responderme.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
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
Uso de Random arespremium OOP 5 12-08-2007 21:48:39
Random() altp .NET 3 27-11-2006 11:59:45
random chechu Varios 6 24-11-2005 20:09:45
random edulp Varios 1 24-10-2005 02:17:39
Random!! Alejandro Horns Varios 1 13-12-2004 16:37:39


La franja horaria es GMT +2. Ahora son las 10:33:49.


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