danielrgoes Posted July 21, 2011 Report Share Posted July 21, 2011 E ai Pessoal Parece uma pergunta meio batida mais encontrei varia dicas aki na internt e nehuma funcionou eu tenho um panel com uma imagem cobrindo td ele e um DBGrid encimaeu quero deixar o DBGrid transparente para que aproveite a imagem como fundo Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted July 21, 2011 Report Share Posted July 21, 2011 acho que voce já viu essa dicaunit 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 Quote Link to comment Share on other sites More sharing options...
0 danielrgoes Posted July 21, 2011 Author Report Share Posted July 21, 2011 Jhonaseu já tinha feito isso porem fiz novamente e não deu certocoloquei o codigo nos eventos descritos e o DBGrid não fica transparente Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted July 21, 2011 Report Share Posted July 21, 2011 mas o código esta corretohttp://delphitutorial.info/how-to-make-tra...ent-dbgrid.htmlabraço Quote Link to comment Share on other sites More sharing options...
0 danielrgoes Posted July 21, 2011 Author Report Share Posted July 21, 2011 Jhonas o que esta acontecendo é que não entra no evento DBGrid1DrawDataCellcomo funciona isso quando entra no evento? Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted July 21, 2011 Report Share Posted July 21, 2011 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á erroobs: acabei de testar aqui... está funcionandounit 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çoabraço Quote Link to comment Share on other sites More sharing options...
0 Manoel Zancheta Posted August 7, 2015 Report Share Posted August 7, 2015 Eu sei que o post é antigo, mas eu preciso da mesmo coisa a que este post se refere e tenho o mesmo problema de NÃO gerar o evento Draw Cell do Grid. Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted August 7, 2015 Report Share Posted August 7, 2015 verifique se não é bug do seu delphio código funciona no delphi 3, 5 e 7 sem problemasabraço Quote Link to comment Share on other sites More sharing options...
0 Manoel Zancheta Posted August 7, 2015 Report Share Posted August 7, 2015 (edited) 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 August 7, 2015 by Manoel Zancheta Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted August 7, 2015 Report Share Posted August 7, 2015 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 = Clientdepois coloque um DBgrid, no form, mas que fique menor que a imagemcoloque 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 fundoabraço Quote Link to comment Share on other sites More sharing options...
0 Manoel Zancheta Posted August 10, 2015 Report Share Posted August 10, 2015 Não funcionou....Não dispara o evento DBGrid1DrawDataCell. Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted August 10, 2015 Report Share Posted August 10, 2015 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 delphino meu delphi (7) funciona normalabraço Quote Link to comment Share on other sites More sharing options...
0 Manoel Zancheta Posted August 10, 2015 Report Share Posted August 10, 2015 (edited) 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 August 10, 2015 by Manoel Zancheta Quote Link to comment Share on other sites More sharing options...
0 Jhonas Posted August 10, 2015 Report Share Posted August 10, 2015 amigo, se quiser o meu conselho, não deixe o dbgrid transparente .... pode ser bonito para voce, mas para um cliente ( Usuario ) é extremamente ruim visualmente ( cansa a visão ) abraço Quote Link to comment Share on other sites More sharing options...
0 Manoel Zancheta Posted August 11, 2015 Report Share Posted August 11, 2015 (edited) Estava apenas testando para ver, pois surgiu aqui a possibilidade de deixar uma marca d´agua de fundo, seria uma imagem bem suave. Edited August 11, 2015 by Manoel Zancheta Quote Link to comment Share on other sites More sharing options...
Question
danielrgoes
E ai Pessoal
Parece uma pergunta meio batida
mais encontrei varia dicas aki na internt e nehuma funcionou
eu tenho um panel com uma imagem cobrindo td ele e um DBGrid encima
eu quero deixar o DBGrid transparente para que aproveite a imagem como fundo
Link to comment
Share on other sites
14 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.