Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-04-2007
Avatar de morta71
morta71 morta71 is offline
Miembro
 
Registrado: may 2006
Ubicación: Girona - España
Posts: 30
Poder: 0
morta71 Va por buen camino
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?.

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

¿Alguien me puede ayudar?

Gracias
Responder Con Cita
  #2  
Antiguo 13-04-2007
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
el jedi dblookupcombo trae el evento on getimage y como parametros de entrada y salida la imagen y el margen del texto
Responder Con Cita
  #3  
Antiguo 14-04-2007
Avatar de morta71
morta71 morta71 is offline
Miembro
 
Registrado: may 2006
Ubicación: Girona - España
Posts: 30
Poder: 0
morta71 Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 14-04-2007
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
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')));
Responder Con Cita
  #5  
Antiguo 14-04-2007
Avatar de morta71
morta71 morta71 is offline
Miembro
 
Registrado: may 2006
Ubicación: Girona - España
Posts: 30
Poder: 0
morta71 Va por buen camino
Gracias por tu respuesta luisgutierrezb, pero en ése caso obtengo un error por "Access Violation at address .....", y sigo sin ver las imágenes.

Responder Con Cita
  #6  
Antiguo 16-04-2007
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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;
Responder Con Cita
  #7  
Antiguo 17-04-2007
Avatar de morta71
morta71 morta71 is offline
Miembro
 
Registrado: may 2006
Ubicación: Girona - España
Posts: 30
Poder: 0
morta71 Va por buen camino
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);
Responder Con Cita
  #8  
Antiguo 17-04-2007
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #9  
Antiguo 17-04-2007
Avatar de morta71
morta71 morta71 is offline
Miembro
 
Registrado: may 2006
Ubicación: Girona - España
Posts: 30
Poder: 0
morta71 Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 17-04-2007
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #11  
Antiguo 17-04-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #12  
Antiguo 17-04-2007
Avatar de morta71
morta71 morta71 is offline
Miembro
 
Registrado: may 2006
Ubicación: Girona - España
Posts: 30
Poder: 0
morta71 Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 18:52:44.


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
Copyright 1996-2007 Club Delphi