Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   imágenes aleatorias (https://www.clubdelphi.com/foros/showthread.php?t=23690)

gontxalo 25-07-2005 20:10:02

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

delphi.com.ar 25-07-2005 20:17:03

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!

vtdeleon 26-07-2005 00:35:41

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.

gontxalo 27-07-2005 12:18:25

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

kalisto 28-07-2005 20:22:35

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])

gontxalo 30-07-2005 09:17:41

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

delphi.com.ar 01-08-2005 15:04:00

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?


La franja horaria es GMT +2. Ahora son las 22:27:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi