PDA

Ver la Versión Completa : Intercambiar posiciones de varias imágenes


bulc
25-04-2015, 17:10:49
Hola ahí. Estoy haciendo un algoritmo para intercambiar al azar posiciones de imágenes. Ya sé hacerlo pero me gustaría automatizarlo para cualquier número o posición de ellas. Lo consigo a medias.
El caso es que dándole vueltas he llegado a la conclusión que necesito saber cómo obtener los datos de un TStringList o de un TMemo de forma progresiva para pasarlos a un Array.
Lo que tengo, de momento, es ésto y lo que quiero es sacar los datos. A ver qué atajos podéis ver... Y muchas gracias.

procedure TForm1.Button1Click(Sender: TObject);
Const
ImgLeftPos_A : Array[1..8] of Integer = ( 34, 74, 114, 154, 184, 192, 204, 544);
Type
aTSL = TStrings;
Var
SL : aTSL;
I, N, nAzar : Integer; // N es el nº de posiciones Left.
sAzar : String;
ImgLeftAzar_A : Array of Integer;
begin
N:= 8;
SetLength(ImgLeftAzar_A, 8);
SL := TStringList.Create;
Memo1.Clear;
SL := TStringList.Create;
repeat
nAzar := RandomFrom( ImgLeftPos_A ) ;
sAzar := IntToStr( nAzar ) ;
if SL.IndexOf(sAzar) = -1 then
begin
SL.Add( sAzar ) ;
Memo1.Lines.Add( sAzar ) ;
end;
until Memo1.Lines.Count = N ;
SL.Free;
end;

ecfisa
25-04-2015, 18:46:21
Hola bulc.

A ver si lo que buscas es algo como este ejemplo:

...
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Image5: TImage;
Image6: TImage;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FImgArray: array of TImage;
procedure MergeImages();
public
end;
var
Form1: TForm1;

implementation

procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
Randomize;
for i:= 0 to ComponentCount-1 do
if Components[i].ClassType = TImage then
begin
SetLength(FImgArray, Length(FImgArray)+1);
FImgArray[i] := TImage(Components[i]);
end;
end;

procedure TForm1.MergeImages();
var
i, a, b: Integer;
aux: TPoint;
begin
for i:= Low(FImgArray) to High(FImgArray) shr 1 do
begin
a:= Random(High(FImgArray)+1);
b:= Random(High(FImgArray)+1);
aux:= Point(FImgArray[a].Left, FImgArray[a].Top);
FImgArray[a].Left:= FImgArray[b].Left;
FImgArray[a].Top := FImgArray[b].Top;
FImgArray[b].Left:= aux.X;
FImgArray[b].Top := aux.Y;
end;
end;

procedure TForm1.btnMergeClick(Sender: TObject);
begin
MergeImages()
end;
...


Muestra:

http://s17.postimg.org/v42m1hucv/bulc.gif

Saludos :)

bulc
25-04-2015, 20:20:32
Hola ecfisa.
Claro que me sirve. No es lo que quería, pero lo aprovecharé. Lo que si quiero aprender es a extraer los datos de un TMemo o un StringList y pasarlos a un Array. He visto que el TMemo tiene una prop. Count y las lìneas responden con Line[0], osea que ya lo veo. ¿Se puede hacer algo parecido con un StringList. Quiero decir recorrerlo y extraer sus datos... en un Array?
Mucha gracias por tu trabajo.
bulc

ecfisa
25-04-2015, 20:45:04
Hola bulc.
Lo que si quiero aprender es a extraer los datos de un TMemo o un StringList y pasarlos a un Array.
...

A yo pensé que el problema se trataba de intercambiar las imágenes.

Un ejemplo:

implementation

type
TArrayString = array of string;

// unas líneas al memo
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
ListBox1.Clear;
for i := 1 to 10 do
Memo1.Lines.Add( Format('Linea %d', [i]) );
end;

// Strings -> array of string
procedure StringsToArrayStrings(const Str: TStrings; var ArrayStr: TArrayString);
var
i: Integer;
begin
SetLength( ArrayStr, Str.Count );
for i:= 0 to Str.Count-1 do
ArrayStr[i] := Str[i];
end;

// array of string -> Strings
procedure ArrayStringsToStrings(const ArrayStr: TArrayString; Str: TStrings);
var
i: Integer;
begin
for i:= Low( ArrayStr ) to High( ArrayStr ) do
Str.Add( ArrayStr[i] );
end;

// llamada ej.
procedure TForm1.Button1Click(Sender: TObject);
var
v: TArrayString;
begin
StringsToArrayStrings( Memo1.Lines, v );
ArrayStringsToStrings( v, ListBox1.Items );
end;


Saludos :)

bulc
25-04-2015, 23:20:05
Muchas gracias. No estabas errado. Ambas respuestas me interesan, pero especialmente la última.
Muy bien, como siempre. No sé qué haría sin tu ayuda... me despido y hasta otra.
bulc