PDA

Ver la Versión Completa : Creación dinámica de componentes


david.rguez
17-01-2007, 13:37:15
Hola a todos/as:

Estamos intentando que un formulario extraiga una serie de información de una base de datos referente a imágenes y las muestre en dicho formulario. No podemos saber, en tiempo de diseño, cuántos elementos van a ser.

En diversos posts de este foro he encontrado gente explicando cómo se hace. He probado a seguir esos pasos, pero no me funciona bien.

Este es mi código:



tadepo.Open;
i:= 0;
imagenB:= TBitmap.Create;

while tadepo.Eof = false do
begin
tadepo.Next;
// Recuperamos los datos
imagen:= tadepoimagen.Value;
porcentaje:= tadepoporcentaje.Value;
x:= tadepox.Value;
y:= tadepoy.Value;

imagenB.LoadFromFile(ExtractFilePath(Application.ExeName) + 'imagenes\' + Trim(imagen));

imag:= TImage.Create(Self);
imag.Name:= 'deposito'+IntToStr(i);
imag.Parent:= Self;
imag.Width:= 150;
imag.Height:= 150;
imag.Picture.Bitmap:= imagenB;
imag.Top:= y;
imag.Left:= x;
imag.Visible:= true;
imag.Stretch:= true;

i:= i+1;
end;




El problema es que únicamente me aparece el último elemento detectado; es decir, se carga los anteriores al sobreescribir. Pensando con lógica, eso parece el comportamiento correcto pues se utiliza la misma variable; pero son tantos los posts que decían que de esta manera funcionaba que lo probé.

¿Alguien sabría decirme qué error cometo?

Gracias.

delphi.com.ar
17-01-2007, 14:03:11
Yo suprimiría algunas cosillas de mas, y evitaría que todas las imágenes se creen en la misma posición, sino solo verás la última creada.

tadepo.Open;
i:= 0;
while tadepo.Eof = false do
begin
tadepo.Next;
// Recuperamos los datos

with TImage.Create(Self) do
begin
Parent:= Self;
Width:= 150;
Height:= 150;
Picture.LoadFromFile('...');
Top := y;
Left:= x + (tadepo.RecNo * 10);
Visible:= true;
Stretch:= true;
end;
end;


Saludos!

david.rguez
17-01-2007, 14:19:20
Lo de la superosición ya lo he tenido en cuenta, pero esa información proviene de los datos del cliente.

Por otra parte, la prueba que he hecho es con dos imágenes de 150x150; una en (1,1) y otra en (200,200), con lo que no es problema de la superposición.

delphi.com.ar
17-01-2007, 14:27:02
Lo de la superosición ya lo he tenido en cuenta, pero esa información proviene de los datos del cliente.
¿Y el valor de tadepox y tadepoy cambia en cada iteración?... porque tienes todo dentro del mismo ciclo.

david.rguez
17-01-2007, 14:36:17
Ya averigué lo que ocurría. Resulta que puse el Next del ADOTable al principio de la interación, con lo que comenzaba en el segundo registro y se saltaba el primero.

Es que estoy acostumbrado a programar en Java, y ahí los resultados de consultas contra una base de datos tienen dos registros extra en blanco, uno al prinicpio y otro al final; con lo que hay que hacer un "next()" antes de comenzar a leer.

Pd: Sí, cambiar cambia en cada iteración, el problema era el que he comentado arriba. Gracias de todos modos :)

delphi.com.ar
17-01-2007, 14:58:56
Que mal de mi parte, yo di por supuesto que no querías el primer registro :p

Saludos!