Ver Mensaje Individual
  #4  
Antiguo 27-07-2005
gontxalo gontxalo is offline
Miembro
 
Registrado: may 2005
Posts: 99
Reputación: 20
gontxalo Va por buen camino
Esto es lo que tengo puesto

Este es el truco. En una unit:

unit UTalea;
{Radikal, Q3 para Trucomania.}
interface
uses Windows,SysUtils;
type
{Array de booleanos de longitud variable}
TArrayBool = array[0..0] of boolean;
PArrayBool = ^TArrayBool;
{Clase para manejar numeros aleatorios}
TAlea = class
Maximo : integer; //Valor maximo de los numeros obtenidos
Lista : PArrayBool;
FaltanDeSacar : integer;
constructor Create(Rango:integer);
destructor Destroy; override;
procedure Reset; //Resetea la lista de numeros
function PillaNumero:integer; //Devuelve un numero aletorio sin repeticion
end;

implementation

constructor TAlea.Create(Rango:integer);
begin
{
Si los números a extraer no pueden ser repetidos
hemos de crear un array para almacenar cual ha salido y cual no
Como el array ha de ser variable, usamos el GetMem y
los punteros para que sirva tambien para versiones
anteriores a Delphi 4, que no incorporan los arrays
de longitud variable...
}
inherited Create;
Maximo:=Rango;
FaltanDeSacar:=Rango;
{Reservamos memoria para el array de longitud variable}
GetMem(Lista, 1+Maximo * SizeOf(Boolean));
ZeroMemory(Lista,1+Maximo * SizeOf(Boolean));
end;
destructor TAlea.Destroy;
begin
if Assigned(Lista) then FreeMem(Lista, 1+Maximo * SizeOf(Boolean));
inherited Destroy;
end;
function TAlea.PillaNumero:integer;
var
Numero: integer;
begin
if FaltanDeSacar=0 then raise exception.create( 'Error. No se pude sacar otro numero sin repetir'+#13+#10+
'Error. No more numbers are available');
{Buscamos un número que no haya salido ya}
Randomize;
repeat Numero:=Random(Maximo) until NOT Lista^[Numero];
{Lo apuntamos en la lista de numeros ya usados}
Lista^[Numero]:=TRUE;
{Decrementamos la cantidad de numeros que faltan por salir}
Dec(FaltanDeSacar);
Result:=Numero;
end;
procedure TAlea.Reset;
begin
ZeroMemory(Lista,1+Maximo * SizeOf(Boolean));
FaltanDeSacar:=Maximo;
end;
end.

LLuego en u form con un botón:

procedure TForm11.Button1Click(Sender: TObject);
var
Ristra : TAlea;
n : integer;
begin
Memo1.Lines.Clear;
Memo2.Lines.Clear;
Memo3.Lines.Clear;
Memo4.Lines.Clear;
Memo5.Lines.Clear;
Memo6.Lines.Clear;
Ristra:=TAlea.Create(50);
{Sacamos x numero sin repetir}
for n:=1 to 1 do begin
memo1.lines.Add( IntToStr(Ristra.PillaNumero) );
Form11.Memo1.visible:= true
end;
for n:=1 to 1 do begin
memo2.lines.Add( IntToStr(Ristra.PillaNumero) );
end;
for n:=1 to 1 do begin
memo3.lines.Add( IntToStr(Ristra.PillaNumero) );
end;
for n:=1 to 1 do begin
memo4.lines.Add( IntToStr(Ristra.PillaNumero) );
end;
for n:=1 to 1 do begin
memo5.lines.Add( IntToStr(Ristra.PillaNumero) );
end;
for n:=1 to 1 do begin
memo6.lines.Add( IntToStr(Ristra.PillaNumero) );
end;
Ristra.Free
end;


Así se generan los números aleatorios, pero si en vez de los números necesito que saqlgan las imágenes, entonces como le puedo decir que si es el número uno el que sale corresponde a la imágen 1 y si sale el dos corresponde a la imágen 2 .........

Gracias
Responder Con Cita