PDA

Ver la Versión Completa : DBCtrlGrid al final un mal invento


Aprendiz
16-12-2004, 11:49:45
Hola a todos de nuevo,

Esto del DBCtrlGrid me está trayendo más problemas que beneficios :(, pero es que no veo otra alternativa para hacer lo que intento.

Trabajo con Dephi 5 e Interbase 6. Tengo una tabla de permisos donde guardo también asociado al permiso una refencia a una tabla de imágenes, guardadas en la base de datos directamente y un texto.

Así para mostrar un menú principal solo tengo que hacer una consulta a la tabla de permisos concesido para un usuario y con un inner join a la tabla de permisos se la imagen y texto que tengo que mostrar en el menú principal.

Ahora bien, para mostrar el menú principal con estas características (imagen y texto al estilo escritorio de Windows), solo se me ha ocurrido utilizar un DBCtrlGrid donde en cada panel tengo un DBImage y un DBLabel. Hasta ahora todo bien, se cargan las imágenes y los textos según los permisos del usuario sin problemas.

La cosa está en que las imágenes tienen un colo de fondo estándar, (el verde creo recordar) y lo que habría que hacer es que este color del Bitmap fuera transparente y dejase ver el color de fondo del DBCtrlGrid, color configurable por los usuarios.

Esto se consigue mediante la utilización de:


DBImage1.Picture.Bitmap.Transparent:=True;
DBImage1.Picture.Bitmap.TransparentColor:=8421376;


Ahora bien, y aquí está el problema, como es un componente replicable solo existe uno en teoría, si aplico las instrucciones anteriores en el OnPaintPanel del DBCtrlGrid solo se me aplica correctamente al seleccionado, que funciona perfectamente eso sí, pero al resto de Paneles, correspondiente a las otras opciones de acceso concedida, no se aplica con lo cual quedán las imágenes con ese desagradable color verde de fondo. Solo cuando las selecciono desaparece el color de fondo.

He estado mirando eventos, procedimientos, forzando el repintado, accediendo a todos los componentes en tiempo de ejecución (lo malo es que solo hay un DBImage en realidad), inicializando el DBImage al principio, y no funciona de ninguna manera.

No se, se os ocurre algo...

Gracias por adelantado.

Saludos.

Héctor Randolph
16-12-2004, 21:33:38
Hola Aprendiz!

Mi sugerencia es la siguiente:

Si el problema es que solamente existe un DBImage, entonces deberías utilizar el Canvas del DBCtrlGrid para dibujar tu imágen directamente sobre él y te olvidas del DBImage.

Es decir:


procedure TForm1.DBCtrlGrid1PaintPanel(DBCtrlGrid: TDBCtrlGrid;
Index: Integer);
var
Stream:TMemoryStream;
Bitmap: TBitmap;
begin
Stream:=TMemoryStream.Create;
Bitmap:=TBitmap.Create;
TBlobField(DBCtrlGrid.DataSource.DataSet.FieldByName('GRAPHIC')).SaveToStream(Stream);
Bitmap.LoadFromStream(Stream);
Bitmap.Transparent:=True;
Bitmap.TransparentColor:=8421376;
DBCtrlGrid.Canvas.Draw(4,4,Bitmap);
Bitmap.Free;
Stream.Free;
end;


Espero que te sea útil.

Un saludo