Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) DBGrid tranparente


danielrgoes

Pergunta

14 respostass a esta questão

Posts Recomendados

  • 0

acho que voce já viu essa dica

unit fTransparentGrid;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
        Forms, Dialogs, Db, Grids, DBGrids, ADODB, ExtCtrls;

type
  TForm1 = class(TForm)
    ADOTable1: TADOTable;  // ignorar se você não estiver usando componente ADO para acessar a tabela
    DataSource1: TDataSource;
    Image1: TImage;
    Panel1: TPanel;
    DBGrid1: TDBGrid;
    procedure DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
      Field: TField; State: TGridDrawState);
    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject;   const Rect: TRect;
  Field: TField; State: TGridDrawState);
var
  Text: string;
  Rct: TRect;
begin
  Text := Field.AsString;
  Rct:= Rect;
  DBGrid1.Canvas.Brush.Color := clWhite;
  DBGrid1.Canvas.FillRect (Rct);
  BitBlt(DBGrid1.Canvas.handle,
         Rct.left,
         Rct.top,
         Rct.right - Rct.left,
         Rct.bottom - Rct.top,
         Image1.Canvas.Handle,
         Rct.left + DBGrid1.Left + Panel1.Left,
         Rct.Top + DBGrid1.Top + Panel1.Top,
         SRCCOPY);

  SetBkModE(DBGrid1.Canvas.Handle, TRANSPARENT);
  inc(Rct.Top ,2);
  inc(Rct.Left ,2);
  DBGrid1.Canvas.Font.Color := clBlack;
  DrawtextEx(DBGrid1.Canvas.Handle,
             PChar(Text),
             Length(Text),
             Rct,
             DT_WORDBREAK,
             nil);

end;

procedure TForm1.Panel1MouseDown(Sender: TObject;   Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Panel1.Perform(WM_SYSCOMMAND, $F012, SC_MOVE);
  Application.ProcessMessages;

  BitBlt(GetDc(Panel1.Handle),
         0,
         0,
         Panel1.Width,
         Panel1.Height,
         Image1.Canvas.Handle  ,
         Panel1.Left, Panel1.Top,
         SRCAND);

  DBGrid1.refresh;
end;


end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

O código funciona perfeitamente ... o evento OnDrawDataCell funciona como um loop infinito ... ele é acionado assim que o form é ativado, e fica sendo executado, até que o form seja desativado ou fechado.

vale lembrar que a figura deverá ser do tipo bmp ( obs: a figura deverá ter o tamanho do dbgrid, para que o mesmo seja preenchido totalmente )... outro tipo causará erro

obs: acabei de testar aqui... está funcionando

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, Grids, DBGrids, jpeg, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    DBGrid1: TDBGrid;
    Query1: TQuery;
    DataSource1: TDataSource;
    procedure DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
      Field: TField; State: TGridDrawState);
    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject;   const Rect: TRect;
  Field: TField; State: TGridDrawState);
var
  Text: string;
  Rct: TRect;
begin
  Text := Field.AsString;
  Rct:= Rect;
  DBGrid1.Canvas.Brush.Color := clWhite;
  DBGrid1.Canvas.FillRect (Rct);
  BitBlt(DBGrid1.Canvas.handle,
         Rct.left,
         Rct.top,
         Rct.right - Rct.left,
         Rct.bottom - Rct.top,
         Image1.Canvas.Handle,
         Rct.left + DBGrid1.Left + Panel1.Left,
         Rct.Top + DBGrid1.Top + Panel1.Top,
         SRCCOPY);

  SetBkModE(DBGrid1.Canvas.Handle, TRANSPARENT);
  inc(Rct.Top ,2);
  inc(Rct.Left ,2);
  DBGrid1.Canvas.Font.Color := clBlack;
  DrawtextEx(DBGrid1.Canvas.Handle,
             PChar(Text),
             Length(Text),
             Rct,
             DT_WORDBREAK,
             nil);

end;

procedure TForm1.Panel1MouseDown(Sender: TObject;   Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Panel1.Perform(WM_SYSCOMMAND, $F012, SC_MOVE);
  Application.ProcessMessages;

  BitBlt(GetDc(Panel1.Handle),
         0,
         0,
         Panel1.Width,
         Panel1.Height,
         Image1.Canvas.Handle  ,
         Panel1.Left, Panel1.Top,
         SRCAND);

  DBGrid1.refresh;
end;

end.

abraço

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

olá Jhonas.

Existe alguma regra na disposição dos componentes? Eu coloquei tanto a imagem como o grid dentro de um panel, é isso?

 

ps - eu não acredito ser problema do Delphi pois tenho outros formulários em que este evento do DBGrid é disparado normalmente.

Editado por Manoel Zancheta
Link para o comentário
Compartilhar em outros sites

  • 0

Existe alguma regra na disposição dos componentes? Eu coloquei tanto a imagem como o grid dentro de um panel, é isso?

sim, mas voce não precisa necessariamente usar o Panel 

como exemplo simples, faça isso:  coloque em um form um componente TImage e deixe o Align = Client

depois coloque um DBgrid, no form, mas que fique menor que a imagem

coloque uma imagem no TImage e faça o código abaixo:

  • procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  •   Field: TField; State: TGridDrawState);
  • var
  •   Text: string;
  •   Rct: TRect;
  • begin
  •   Text := Field.AsString;
  •   Rct:= Rect;
  •   DBGrid1.Canvas.Brush.Color := clWhite;
  •   DBGrid1.Canvas.FillRect (Rct);
  •   BitBlt(DBGrid1.Canvas.handle,
  •          Rct.left,
  •          Rct.top,
  •          Rct.right - Rct.left,
  •          Rct.bottom - Rct.top,
  •          Image1.Canvas.Handle,
  •          Rct.left + DBGrid1.Left + Form1.Left,
  •          Rct.Top + DBGrid1.Top + Form1.Top,
  •          SRCCOPY);
  •   SetBkModE(DBGrid1.Canvas.Handle, TRANSPARENT);
  •   inc(Rct.Top ,2);
  •   inc(Rct.Left ,2);
  •   DBGrid1.Canvas.Font.Color := clBlack;
  •   DrawtextEx(DBGrid1.Canvas.Handle,
  •              PChar(Text),
  •              Length(Text),
  •              Rct,
  •              DT_WORDBREAK,
  •              nil);
  • end;
  •  

O Dbgrid vai ficar transparente e mostrar a imagem ao fundo

abraço

 

Link para o comentário
Compartilhar em outros sites

  • 0

voce observou isso ?

  •  Rct.left + DBGrid1.Left + Form1.Left,    // tem que ser o nome do form que voce esta usando 
  •  Rct.Top + DBGrid1.Top + Form1.Top,

 para ter certeza se o evento DBGrid1DrawDataCell está sendo executado, coloque um break point no código ...

e se ainda assim não funcionar, então voce terá que descobrir o que está acontecendo com o seu delphi

no meu delphi (7) funciona normal

abraço

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

ahh, descobri.

 

é que eu tinha colocado o dbgrid sem "ligar" nada nele, então não tinha nenhum field nele.

 

se bem que assim, o grid só fica transparente onde estão os registros, a área sem registro não fica transparente.

 

 

Editado por Manoel Zancheta
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...