Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Crear array de imagenes (https://www.clubdelphi.com/foros/showthread.php?t=81068)

blackterfly 06-10-2012 21:32:15

Crear array de imagenes
 
Hola.

Mi pregunta es ¿ Cómo hago un array de imagenes en builder c++ ?

Estoy buscando por internet pero me estoy volviendo loco. He probado muchas de las cosas, pero la mayoría son de objective C, powerbuilder, c#,en fin... Me rindo, necesito ayuda humana. Para no terminar con un código pésimo en mi proyecto y por simplificar me es necesario declarar una serie de imagenes, pero que esten dentro de un array, puesto que necesitaría acceder a ellas de manera serial, así como aplicarles los mismos métodos, o eventos de componentes como clicks,... Estoy usando el componente TImage para manipular las imagenes de mi programa.

Muchas gracias por leer.

ecfisa 06-10-2012 22:46:58

Hola blackterfly.

Creo que es mas versátil usar TObjectList en lugar de un arreglo.

Te pongo un ejemplo simple de como podes hacerlo, agrega un TImage y un TButton al form:
Código:

...
#include <jpeg.hpp>
...

TObjectList *ObjLst;
int NroImg = 0;  //imágenes cargadas

/* Cargar imágenes en ObjectList */
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TSearchRec sr;
AnsiString path = "C:\\Users\\User\\Pictures\\";  // Ruta a una carpeta con imágenes .jpg
  randomize();
  Image1->Stretch;  // sólo si deseas ajustar la imágen
  ObjLst = new TObjectList;
  if (FindFirst(path + "*.JPG", faArchive, sr) == 0)
    do {
      TImage *Img = new TImage(this);
      Img->Picture->LoadFromFile(path +sr.Name);
      ObjLst->Add(Img);
      NroImg++;
    } while (FindNext(sr) == 0);
}

/* Mostrar imágenes cargadas (índice aleatorio) */
void __fastcall TForm1::btnShowImagesClick(TObject *Sender) {
  Image1->Picture = ((TImage*)ObjLst->Items[random(NroImg)])->Picture;
}

/* Liberar memoria al finalizar */
void __fastcall TForm1::FormDestroy(TObject *Sender) {
  ObjLst->Clear();
  delete ObjLst;
}

Saludos.:)

blackterfly 07-10-2012 17:06:48

Hola.

Muchas gracias por contestar. Me voy a poner enseguida a ver que tal es la solución que me das.

Gracias.

blackterfly 07-10-2012 22:49:18

Tenía que haber respondido antes pero es que he tenido unos problemas de conexión de
internet acojonantes... bueno, cosas de los domingos.

Bueno, he probado usando el array de objetos que me recomiendas, y si es verdad que
da mucho juego pues tiene unas opciones muy variadas y muy utiles, pero resulta que el
código que he transpolado a mi programa me da un error que no pillo.

De esta forma todo funciona perfecto, de hecho será la que voy a utilizar.

AnsiString archivo="a"; // Esto es porque la serie de imagenes se llamaran a,aa,aaa,aaaa,etc...
for ( int x=0; x<5; x++)
{
TImage *Img = new TImage(this);
Img->Picture->LoadFromFile(archivo+".jpg");
ObjLst->Add(Img);
numero++;
archivo = archivo + "a";
}

Pero necesito entenderlo todo, y cuando estaba cambiando las cosas empece a hacer
lo siguiente:

TImage *Img = new TImage(this);
Img->Picture->LoadFromFile("a.jpg");
ObjLst->Add(Img);
TImage *Img = new TImage(this);
Img->Picture->LoadFromFile("aa.jpg");
ObjLst->Add(Img);

ERROR: Doble declaración de Img. ¿ No debo declararla cada vez al igual que en el bucle ?

Casimiro Notevi 07-10-2012 23:17:44

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

ecfisa 08-10-2012 01:51:19

Hola blackterfly.

Es que en el código anterior cometí una equivocación, la declaración tendría que haber estato fuera del ciclo:
Código:

/* Cargar imágenes en ObjectList */
void __fastcall TForm1::FormCreate(TObject *Sender) {
TSearchRec sr;
TImage *Img; // <- Aqui
  randomize();
  Image1->Stretch;  // sólo si deseas ajustar la imágen
  ObjLst = new TObjectList;
  if (FindFirst(path + "*.JPG", faArchive, sr) == 0)
    do {
      Img = new TImage(this);
      Img->Picture->LoadFromFile(path +sr.Name);
      ObjLst->Add(Img);
      NroImg++;
    } while (FindNext(sr) == 0);
}

Por lo que tu código debería ser:
Código:

TImage *Img = new TImage(this);
  Img->Picture->LoadFromFile(path +"a.jpg");
  ObjLst->Add(Img);
  Img = new TImage(this);
  Img->Picture->LoadFromFile(path +"aa.jpg");
  ObjLst->Add(Img);

Saludos.


La franja horaria es GMT +2. Ahora son las 02:38:31.

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