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 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
  #2  
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
  #3  
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
  #4  
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
  #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

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
  #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...

Con un TStringList podría quedar más o menos así:

Código Delphi [-]
function Sortear: TStringList;
const
  NoGanadores = 300;
  NoParticipantes: 1505;

var
  I: Integer;
  Ganador: Integer;

begin
  Randomize;
  Result := TStringList.Create;
  Result.Sort := True;
  for I := 1 to NoGanadores do
  begin
    Ganador := RandomRange(1, NoParticipantes);
    if Result.Count = 0 then
      Result.Add(IntToStr(Ganador))
    else
    begin
      while Result.IndexOf(IntToStr(Ganador)) <> -1 do
        Ganador := RandomRange(1, NoParticipantes);
      Result.Add(IntToStr(Ganador))
    end
  end
end;

// Para usar la función:

var
  ListaGanadores: TStringList;

begin
  ListaGanadores := Sorteo;
  // Usas la lista
  ListaGanadores.Free
end;


Saludos...
Responder Con Cita
  #7  
Antiguo 18-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, yo sigo pensando que deberías hacerlo con StringList, no es dificil manejarlo.

Un StringList es una clase que hereda de TString, llegando a ser una lista de cadenas que la tienes en memoria. como dice Neftali las búsquedas son casi inmediatas, de verdad te ayudara mucho en otras cosas que quieras hacer, incluyendo esta.

Sobre el error en la linea que marcas le faltaba un parentesis al final, se me ha ido.

Primero debes definir una variable de tipo TStringList y despues crearla como cualquier instancia de clase con:

Código Delphi [-]
 StringList : TStringList
......
 StringList := TStringList.Create;

Despues puedes utilizar todas las funciones y procedimientos de la clase TString como Add, Delete, IndexOf, Exchage..... Si te fijas en el componente ListBox, existe una propiedad Items, que es un TString, y seguro que sabes manejar dicha propidad adicionando items, borrando, etc, un TStringList lo manejas de la misma manera ya que también hereda de TString, la diferencia es que no es un componente sino solo una clase.

Ahora sobre mi ejemplo quedaría así, seleccionando los 300 ganadores.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
 Numero, i, j, Limite : Integer;
 Lista : TStringList;
begin
 Lista := TStringList.Create;
 Lista.Sorted := True;

 Randomize;
 Limite := 1500;
 for j:=0 to 300 do
  begin
   Numero := RandomRange(0, Limite);
   if Lista.IndexOf(IntToStr(Numero))=-1 then
    Lista.Add(IntToStr(Numero))
   else
    begin
     While (Lista.IndexOf(IntToStr(Numero))<>-1) and (Lista.Countdo
      Numero := RandomRange(0, Limite);

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

 showmessage('Se ha terminado de encontrar a los ganadores');

 for i :=0 to Lista.Count-1 do //Recorremos la lista
  showmessage(Lista[i]);
end;

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: 18-06-2008 a las 03:10:29.
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 01:09:59.


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