Programación General > Delphi

 Matriz De Imágenes

(1/3) > >>

Danielo:
Hola a todos...

Necesito mostrar varias imágenes en un formulario, por ejemplo:

    [imagen01.bmp]  [imagen02.bmp]  [imagen03.bmp]  [imagen04.bmp]

    [imagen05.bmp]  [imagen06.bmp]  [imagen07.bmp]  [imagen08.bmp]

    [imagen09.bmp]  [imagen10.bmp]  [imagen11.bmp]  [imagen12.bmp]

quisiera saber (en caso de que sea posible) como se puede hacer utilizando una matriz de imágenes (array de 2 dimensiones) en tiempo de ejecución.

Intenté con algo como esto:

myArray: array[0..2,0..3] of TImage;

... pero si bien funciona, no se como hacer para mostrar las imágenes en el formulario con los TImage.

Salu2...
   Danielo.

PD: Estoy utilizando el Lazarus, por si a alguien le interesa hace unos días apareció una nueva versión: la 0.9.12  ;)

Amilius:
Bueno hace tiempo que doy la misma respuesta y sigue siendo válida.  :lol:

No uses un Timage para tus bitmaps, usa un Tbitmap. Creas los tbitmaps, los cargas con los bmp, o asignas jpeg. (no olvides de destruirlos!!!)

Luego colocas en tu formulario un Tpaintbox y en su evento OnPaint pintas los bitmaps en la posicion que quieras. Incluso puedes revisar si realmente necesitas pintarlos todos o solo algunos dependiendo de la zona de clip.

Supongo que lazarus seguira la misma idea respecto a Tbitmap, TCanvas y TPaintbox

En si el Tbitmap sirve literalmente como pedazo de memoria para tener almacenado tu bitmap. Mejor si le asignas el tipo DIB (Device independet bitmap, osea en memoria RAM y no en video en caso que quieras trabajar sobre la imagen)

El Tpaintbox no tiene memoria asignada de ningun tipo, sólo sirve para saber en que posicion de la memoria de video tiene que poner nuestros bitmaps y responde a eventos como onPaint que ocurre cuando otra ventana se puso encima de la nuestra y luego se necesita repintar nuestra ventana.

El Tcanvas es el que tiene la capacidad de pintar (graficos de todo tipo, texto, bitmaps, etc.) en memoria de video(en este caso el Tpaintbox) o en RAM (un bitmap DIB)

Enko:
No se si en lazarus está el componente pero tambien es bueno para eso  el TDrawGrid.
Es una gradilla en la cual  hay que dibujar usando directamente la propiedad TCanvas.

Como parametro se recibe la recta de la celda que se va a dibujar y las  coordenadas de la celda.
El siguiente codigo dibujaria un bitmap en la primera celda del Grid.


--- Código: Text --- procedure TfrmEditor.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);begin   if (aCol=0) and (aRow=0) DrawGrid1.Canvas.StretchDraw(Rect, Bitmap);end;  

Danielo:
Saludos Amilius y Enko...

Para fijar ideas creo que lo mejor sera que explique (brevemente) lo que quiero hacer:

Se trata del juego Mastermind, como ya sabrán el objetivo es adivinar una secuencia de fichas de colores, que en este caso el programa se encargará de generar.

El problema que tengo es con la representación de las fichas, o sea elegir una estrategia para poder manipularlas de una forma no muy complicada.
Por eso lo que se me ocurrió fue una matriz de imágenes de esta forma:

Primeramente coloco en el formulario varios TImage, más precisamente 12 filas x 5 columnas. Esto tiene como ventaja, que de ser necesario puedo utilizar la propiedad de dobleClick sobre la TImage, para por ejemplo borrar una ficha de color, para poder cambiarla por otra.

Luego declaro un array:

mat:array[0..11,0..4] of TImage;

La desventaja que le encuentro a esto es que tendría que cargar la matriz manualmente, o sea:

mat[0,0]:=Image1;
mat[0,1]:=Image2;
mat[0,2]:=Image3;
...

Bueno, suponiendo que haya alguna mejor manera de hacer lo anterior, lo
que faltaría es cargar los archivos de imágen en la matriz mat y eso lo
encuentro bastante sencillo, utilizando un ImageList (Seguramente en Delphi
también existe, no lo se).

Entonces, una vez cargado el ImageList con las imágenes de las fichas, habría que hacer:

ImageList1.Draw(mat[fil,col].Canvas,1,1,indice_imagen);

donde fil y col, son las coordenadas (fila y columna) donde se quiere asignar
la ficha (imágen) cuyo indice en el imageList es indice_imagen.


Ahora paso a responder sobre las alternativas que me han dado:



Para Amilius:

Por lo que he visto, te puedo decir que en Lazarus existe tanto el TBitmap como el TPaintbox, sin embargo el TBItmap no soporta algunos métodos de Delphi, basicamente los relacionados con las Apis de windows, como por ejemplo el método ScanLine que según parece requiere la GDI32.dll. De todas formas no creo que el ScanLine sea necesario en este caso, por si te interesa en este link hay más información:

http://wiki.lazarus.freepascal.org/index.p...g_with_Graphics

Volviendo al TBitmap que me sugieres, no me queda muy claro la forma de utilizarlo. En lugar de utilizar una matriz de TImages me sugieres utilizar una matriz de Tbitmaps?

esto es:

mat:array[0..11,0..4] of TBitmap;

luego creo cada celda de la matriz:

mat[fil,col]:=TBitmap.create;

Luego me dices que coloque un Tpaintbox en el formulario y en la propiedad OnPaint pinte los bitmas en la posición que quiera (¿?), esto último no tengo idea de como hay que hacerlo. Además no entiendo como con un solo Tpaintbox puedo mostrar todas las imágenes bmp.


Para Enko:

Sobre el TDrawGrid, al menos con ese nombre no parece estar en Lazarus. Lo más perecido parece ser TDbGrid que está en la ficha Data Controls y tengo mis dudas de que sea lo mismo porque cuando coloco ese componente en el formulario queda algo parecido a una tabla en excel.

Enko:

--- Citar ---Para Enko:

Sobre el TDrawGrid, al menos con ese nombre no parece estar en Lazarus. Lo más perecido parece ser TDbGrid que está en la ficha Data Controls y tengo mis dudas de que sea lo mismo porque cuando coloco ese componente en el formulario queda algo parecido a una tabla en excel.

--- Fin de la cita ---
Tonces no está.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa