PDA

Ver la Versión Completa : Crear array de imagenes


blackterfly
06-10-2012, 21:32:15
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:

...
#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:

http://neftali.clubdelphi.com/images/UtilizarTAGs.png

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:

/* 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:

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.