Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Imagenes en un TDBLookUp (https://www.clubdelphi.com/foros/showthread.php?t=42433)

morta71 13-04-2007 20:04:02

Imagenes en un TDBLookUp
 
Hola a todos,

estoy haciendo un programilla con acceso a BD y quisiera mostrar imágenes y texto en un control TDBLookUp, ¿es posible?.:confused:

Estuve buscando por la red y no tuve demasiada suerte o no supe buscar bien.

¿Alguien me puede ayudar?

Gracias

luisgutierrezb 13-04-2007 20:24:30

el jedi dblookupcombo trae el evento on getimage y como parametros de entrada y salida la imagen y el margen del texto

morta71 14-04-2007 19:02:38

He probado el componente que me dices pero no me funciona. El código que pongo es el siguiente:

Código Delphi [-]
  TGraphicField(IBDataSet1.FieldByname('IMAGEN')).Assign(Graphic);

No da error, pero tampoco muestra ninguna imágen (por supuesto existe la imagen en la BD).

Gracias

luisgutierrezb 14-04-2007 21:57:22

el codigo que estas poniendo es para asignarle una imagen a un campo de la base de datos, se requiere lo contrario o al menos asi entendi, en el evento GetImage, seria algo asi como:

Graphic.Assign(TGraphicField(IBDataSet1.FieldByname('IMAGEN')));

morta71 14-04-2007 23:38:49

Gracias por tu respuesta luisgutierrezb, pero en ése caso obtengo un error por "Access Violation at address .....", y sigo sin ver las imágenes.

:confused:

Chris 16-04-2007 21:24:19

No he utilizado ese componente del proyecto Jedi, pero intenta utilizando este código:

Código Delphi [-]
procedure ProcDondeCargalaImagen;
var
imgStream : TStream;
Begin

try
imgStream := Tstream.create;

imgStream := miTabla.CreateBlobStream(mitabla.Fieldbyname('imagen'),bmread);
Graphic.LoadfromStream(imgStream);
imgStream.free;
finally end;

end;

morta71 17-04-2007 00:09:38

Hola D&W he probado tu código y me da el mismo mensaje de Error: "Access Violation at address ..." al ejecutar la línea

Código Delphi [-]
Graphic.LoadfromStream(imgStream);

Chris 17-04-2007 02:28:07

Problema resuelto!!!
 
Implementa el siguiente código

Código Delphi [-]

procedure TForm1.JvDBLookupCombo1GetImage(Sender: TObject;
  IsEmpty: Boolean; var Graphic: TGraphic; var TextMargin: Integer);
var
imgStream : TStream;
imgGraphic : TBitmap;
Begin

TextMargin := 80; //esta propiedad especifica el ancho que se reservará para dibujar la imagen.

try
If Not Table2.Active then Exit;
if Table2.Fieldbyname('Diseno').IsNull then Exit;
imgStream := Tstream.create;
imgStream := Table2.CreateBlobStream(Table2.Fieldbyname('Diseno'),bmread);
imgGraphic := TBitmap.Create;

imgGraphic.LoadFromStream(imgStream);
TextMargin := imgGraphic.Width; //aquí establezco que el ancho sea siempre el ancho de la imagen que vamos a dibujar.

Graphic := imgGraphic;
imgStream.free;
finally end;

end;

para aumentar la altura del lienzo, aumenta la propiedad ItemHeight del control, normalmente trae 13, la puedes aumentar a 48 o más segun tus necesidades. Tampoco no vayas a abusar. También, dependiendo de la altura de las imágenes tienes que disminuir la propiedad DropDownCounts, normalmente trae en ocho, pero tu veras, si la tienes que disminuir hasta que la lista desplegable quepa en la pantalla.

Espero que me entiendas. Ha sido un placer haberte ayudado. Bye.

morta71 17-04-2007 19:22:34

Gracias por tu respuesta D&W, ya me funciona, creo, correctamente.

En tu código veo que creas el Bitmap con imgGraphic := TBitmap.Create; pero no se libera con la sentencia imgGraphic.Free; correspondiente, por lo que tras varias ejecuciones del Form me reportaba un error por "Access Violation".

Si implemento la sentencia imgGraphic.Free; en el cuerpo del procedimiento, obtengo el mismo error "Access Violation", por lo que realicé las siguientes modificaciones:

He definido la variable imgGrapphic como privada y el código queda de la siguiente manera:

Código Delphi [-]
 ...
   private
     { Private declarations }
     imgGraphic : TBitmap;
 ...
 
 procedure TForm1.FormCreate(Sender: TObject);
 begin
   imgGraphic := TBitmap.Create;
 end;
 
 ...
 
 procedure TForm1.edtPaisGetImage(Sender: TObject;
   IsEmpty: Boolean; var Graphic: TGraphic; var TextMargin: Integer);
 var
   imgStream : TStream;
 Begin
 
   if not IsEmpty then
   try
     if not Table2.Active then Exit;
     if Table2.Fieldbyname('Diseno').IsNull then Exit;
     imgStream := Tstream.create;
     imgStream := Table2.CreateBlobStream(Table2.Fieldbyname('Diseno'),bmread);
 
     imgGraphic.LoadFromStream(imgStream);
     TextMargin := imgGraphic.Width + 2; //aquí establezco que el ancho sea siempre el ancho de la imagen que vamos a dibujar (he añadido 2 unidades para dar un poco de separación).
 
     Graphic := imgGraphic;
     imgStream.free;
   finally
   end;
 end;

procedure TForm1.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  imgGraphic.Free;
end;

Muchas gracias D&W por tu colaboración. :):):)

Chris 17-04-2007 19:53:16

Te felicito por tu código. No liveraba la variable imgGraphic porque el parámetro Graphic era un nulo y no puedes crear una variable de tipo TGraphic así por así ya que se trata de una variable astracta. Ojalá que este código sirva para futuras referencias.

Revisa el código, porque tienes un problema en las líneas

Código Delphi [-]
If Not Table2.Active Then Exit;
If Table2.FieldbyName('Diseno').isNull Then Exit;

creo que con ese código puedes terminar con imágenes repetidas, o sea que cuando no haya una imagen, el programa simplemente dibujará la anterior. Si acaso pasa eso (que creo que pasará) mejor libera el Stream y deja que se carga como una imagen nula, en blanco. o opcionalmente, asigna una imagen que indique que no existe grafica.

Fue un placer ayudarte. bye.

roman 17-04-2007 20:03:34

Una pequeña observación:

En el código popuesto, la línea

Código Delphi [-]
imgStream.free;

tendría que ir después del finally:

Código Delphi [-]
     Graphic := imgGraphic;
   finally
     imgStream.free;
   end;

// Saludos

morta71 17-04-2007 20:10:41

Correcta tu observación roman, ya lo tenía corregido, gracias.

Ya me ha pasado lo que comentas D&W y en el código ya he incluido la comprobación chequeando la variable IsEmpty

Código Delphi [-]
if not IsEmpty then
 try
....

Ahí queda para futuras consultas, gracias por vuestros comentarios.


La franja horaria es GMT +2. Ahora son las 03:26:42.

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