Jump to content
Fórum Script Brasil
  • 0

(Resolvido) DBGrid tranparente


danielrgoes

Question

14 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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.

Edited by Manoel Zancheta
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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.

 

 

Edited by Manoel Zancheta
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...