Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Intercambiar posiciones de varias imágenes (https://www.clubdelphi.com/foros/showthread.php?t=88191)

bulc 25-04-2015 17:10:49

Intercambiar posiciones de varias imágenes
 
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.
Código Delphi [-]
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:
Código Delphi [-]
...
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:



Saludos :)

bulc 25-04-2015 20:20:32

Sofisticado y aprovechable
 
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.
Cita:

Empezado por bulc (Mensaje 491710)
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:
Código Delphi [-]
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

Eso es lo que buscaba...
 
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


La franja horaria es GMT +2. Ahora son las 08:59:14.

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