Interceptar evento OnPaint do DBGrid

Delphi

16/02/2005

O componente DBGrid não tem o evento OnPaint acessível. Como faço para executar algum comando sempre que o evento OnPaint do DBGrid for disparado?


Raserafim

Raserafim

Curtidas 0

Respostas

Buosinet

Buosinet

16/02/2005

Utilize o comando OnDrawColumnCell da DBGrid (veja o help, explica legal)


GOSTEI 0
Buosinet

Buosinet

16/02/2005

Desculpe, o EVENTO OnDrawColumnCell


GOSTEI 0
Raserafim

Raserafim

16/02/2005

esse evento não dá certo pois ele é idparado para cada célula. o comando que preciso utilizar não pode ser disparado tantas vezes assim.
Preciso de um evento que seja disparado menas vezes.


GOSTEI 0
Massuda

Massuda

16/02/2005

Preciso de um evento que seja disparado menas vezes.
O que exatamente você está querendo fazer? Dependendo do que for, pode ser que usar os eventos do datasource do grid seja mais viável do que tentar interceptar o evento OnPaint.


GOSTEI 0
Raserafim

Raserafim

16/02/2005

o principal motivo é que um colega aqui do fórum (gabriel) me forneceu o comando para ocultar as barras de rolagem. Coloquei este evento no OnPaint do form. Ao abrir o form o DBGrid fica sem as barras, mas ao selecionar algum registro as barras voltam. Tentei colocar no evento OnDrawColumnCell, mas este evento é disparado muitas vezes e quando a brra de rolagem aparece as células são desenhadas novamente o que causa um loop.


GOSTEI 0
Massuda

Massuda

16/02/2005

o principal motivo é ... para ocultar as barras de rolagem.
Algum tempo atrás o colega Microbios apresentou um [url=http://forum.clubedelphi.net/viewtopic.php?t=58157]código para eliminar as barras de rolagem de uma janela MDIForm[/url]... entretanto, o código dele serve (teoricamente) para qualquer componente derivado de TWinControl. Assim, acho que este código serviria no seu caso (não testei):)...
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  // ...

implementation

// ...

function ClientWindowProc(wnd: HWND; Msg: Cardinal; wparam, lparam: Integer): Integer; stdcall;
var
  f: Pointer;
begin
  f := Pointer(GetWindowLong(wnd, GWL_USERDATA));

  case Msg of
    WM_NCCALCSIZE: begin
        if (GetWindowLong(wnd, GWL_STYLE) and (WS_HSCROLL or WS_VSCROLL)) <> 0 then
          SetWindowLong(wnd, GWL_STYLE, GetWindowLong(wnd, GWL_STYLE) and not (WS_HSCROLL or WS_VSCROLL));
      end;
  end;

  Result := CallWindowProc(f, wnd, Msg, wparam, lparam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Troque SeuGrid pelo nome do seu dbgrid
  if SeuGrid.Handle <> 0 then begin
    if (not (GetWindowLong(SeuGrid.Handle, GWL_USERDATA) <> 0)) then begin
      SetWindowLong(SeuGrid.Handle, GWL_USERDATA, SetWindowLong(ClientHandle, GWL_WNDPROC, Integer(@ClientWindowProc)));
    end;
  end;

  // ...
end;

// ...



GOSTEI 0
Raserafim

Raserafim

16/02/2005

massuda, tentei utilizar este código mas dá um erro no final da chamada que está no create. o erro diz que uma variável é requerida.


GOSTEI 0
Massuda

Massuda

16/02/2005

Desculpe... tem um pequeno erro que ocorreu quando copiei o código de para a mensagem... onde está
SetWindowLong(SeuGrid.Handle, GWL_USERDATA, SetWindowLong(ClientHandle, GWL_WNDPROC, Integer(@ClientWindowProc)));
devia ser
SetWindowLong(SeuGrid.Handle, GWL_USERDATA, SetWindowLong(SeuGrid.Handle, GWL_WNDPROC, Integer(@ClientWindowProc)));
Testei e funcionou sem problemas com um dbgrid.


GOSTEI 0
Raserafim

Raserafim

16/02/2005

massuda, testei mas ainda não deu certo.
se não for pedir muito, faz um projeto com o form, um dbgrid e o código, e envia pro meu e-mail raserafiminfo@bol.com.br


GOSTEI 0
Sistemald

Sistemald

16/02/2005

Amigo use o seguinte código no enventro [b:a4a1cb6731]OnDrawDataCell[/b:a4a1cb6731]

ShowScrollBar(dbgrid1.Handle,SB_HORZ,False);
ShowScrollBar(dbgrid1.Handle,SB_Vert,False);



GOSTEI 0
Sistemald

Sistemald

16/02/2005

Você também pode utilizar o TDonatoDbGrid

Possui as funções:
* Zebra
* Autosave(salvar as posições e tamanho da coluna)
* Boolean(Mostra os campos booleanos com uma figura pré definida)
* Mostrar/Esconder barra de rolagem

Veja o tópico:
[url]http://forum.clubedelphi.net/viewtopic.php?p=188031#188031[/url]

ou Faça o download direto:
[url]http://www.donato.inf.br/desenvolvedor/TDonatodbgrid.zip [/url]


GOSTEI 0
Edukobra

Edukobra

16/02/2005

A parte do componente que esconde as barras não funcionou comigo.

Alguém sabe como eu faço para que se o dado estiver posicionado do lado direito, ao passar por ele, que ele não va para a esquerda ?


GOSTEI 0
Raserafim

Raserafim

16/02/2005

valeu Massuda, agora deu certo.
aliás já poderia ter dado certo antes, mas o problema era o seguinte, que já fica de aviso pra quem vai utilizar o código.

o código da função tem que estar antes do código do evento create.


GOSTEI 0
Sistemald

Sistemald

16/02/2005

Não funcionou porque vc usa delphi 6 ou 7,

encontrei um bug, para essas versões e ja esta corrigido em breve colocarei disponivel para download.


GOSTEI 0
Raserafim

Raserafim

16/02/2005

massuda, o código não funciona caso o form não seja criado dinamicamente pelo delphi, ou seja, quando eu crio o form no momento em que ele vai ser exibido o código não funciona.
Alguma solução?


GOSTEI 0
Massuda

Massuda

16/02/2005

o código não funciona caso o form não seja criado dinamicamente pelo delphi...
Humm... Testei aqui e não tive problemas.

Na dúvida, segue novamente o código, lembrando que o código foi apresentado pelo colega Microbios num tópico sobre como [url=http://forum.clubedelphi.net/viewtopic.php?t=58157]eliminar as barras de rolagem de uma janela[/url]... incluindo uma pequena correção feita da outra vez:
type 
  TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
  // ... 

implementation 

// ... 

function ClientWindowProc(wnd: HWND; Msg: Cardinal; wparam, lparam: Integer): Integer; stdcall; 
var 
  f: Pointer; 
begin 
  f := Pointer(GetWindowLong(wnd, GWL_USERDATA)); 

  case Msg of 
    WM_NCCALCSIZE: begin 
        if (GetWindowLong(wnd, GWL_STYLE) and (WS_HSCROLL or WS_VSCROLL)) <> 0 then 
          SetWindowLong(wnd, GWL_STYLE,
            GetWindowLong(wnd, GWL_STYLE) and not (WS_HSCROLL or WS_VSCROLL)); 
      end; 
  end; 

  Result := CallWindowProc(f, wnd, Msg, wparam, lparam); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  // Troque SeuGrid pelo nome do seu dbgrid 
  if (not (GetWindowLong(SeuGrid.Handle, GWL_USERDATA) <> 0)) then begin 
    SetWindowLong(SeuGrid.Handle, GWL_USERDATA,
      SetWindowLong(SeuGrid.Handle, GWL_WNDPROC, Integer(@ClientWindowProc))); 
  end; 

  // ... 
end;



GOSTEI 0
Raserafim

Raserafim

16/02/2005

massuda, coloquei este código que vc citou anteriormente (apenas para desencargo de consciência), e continuou da mesma forma. Quando comento a linha que faz o delphi criar o form automatiamente, e portanto, crio o form no momento em que vou executar, as barras continuam.
Nas duas cintaxes:
  Form1 := TForm1.Create(self);
  Application.CreateForm(TForm1, Form1);

basta eu deixar o delphi criar automaticamente que as barras desaparecem.

obs: Ao invés de uma DBGrid estou usando uma DBCtrlGrid, mas deveria funcionar em qualquer componente!


GOSTEI 0
POSTAR