Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Creación dinámica de componentes (https://www.clubdelphi.com/foros/showthread.php?t=39335)

david.rguez 17-01-2007 13:37:15

Creación dinámica de componentes
 
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:

Código Delphi [-]

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.
Código Delphi [-]
    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

Cita:

Empezado por david.rguez
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!


La franja horaria es GMT +2. Ahora son las 02:23:20.

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