![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#4
|
|||
|
|||
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 |
|
|
![]() |
|