PDA

Ver la Versión Completa : Imagenes en un TDBLookUp


morta71
13-04-2007, 20:04:02
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:


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:


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


Graphic.LoadfromStream(imgStream);

Chris
17-04-2007, 02:28:07
Implementa el siguiente código



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:


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


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


imgStream.free;


tendría que ir después del finally:


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


if not IsEmpty then
try
....


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