FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
imágenes aleatorias
Hola
He leído varios hilos sobre números aleatorios, pero no he encontrado nada sobre imágenes aleatorias. En trucomanía tampoco. En un form, dando a un botón como podría generar imágenes aleatorias de entre 50 por ejemplo. Tengo 50 imágenes y quiero que al dar a un botón me salgan aleatoriamente 5 de ellas. Lo tengo que me salgan números pero ahora necesito que en vez de los números me salgan imágenes de entre 50. Gracias |
#2
|
||||
|
||||
Teniendo esas 50 imágenes, simplemente las tienes que tener indexadas de 1..50 y averiguando un número en este rango (RandomRange) tienes tu imagen aleatoria!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
||||
|
||||
Saludos
Como dice Federico, tienes 50 imagenes, por tanto son cuantitativos. Puedes referenciar cada imagen con un numero (del 1..50) y realizar el procedimiento de buscar numeros aleatorios(No he visto el Truco). Si con procedimiento salieron el 5,10,48,39,40; buscas las imagenes correspondientes a esos numeros.
__________________
Van Troi De León (Not) Guía, Code vB:=Delphi-SQL, ¿Cómo? Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto! |
#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 |
#5
|
|||
|
|||
con todas las imagenes dentro de un directorio, puedes utilizar findfirst y findnext para añadir el path de las mismas a una stringlist y con los numeros que te da la funcion que ya tienes puedes acceder al path de estas y cargar las imagenes en timages por ejemplo.
Algo asi: Código:
mitimage1.picture.loadfromfile(mistringlist[Ristra.PillaNumero]) |
#6
|
|||
|
|||
Se puede cambiar la posición de la imágen que aparece?
Lo tengo gracias.
Pero hay alguna forma de que cuando le diga que si sale el dos, sale la imágen dos, es decir Image2.Visible := True pero decirle donde tiene que aparecer la imágen ? Que no salga donde la tengo en el form en visible := false, si no diciéndola que sea visible en las coordenadas 152, 408 del form? Gracias |
#7
|
||||
|
||||
Teniendo la función Random(n) que te genera un número aleatorio de 0 a n, y sabiendo que las coordenadas de los controles son valores numéricos.... ¿No se te ocurre una combinación de estas dos cosas?
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
|
|
|