Interceptar evento OnPaint do DBGrid
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
Curtidas 0
Respostas
Buosinet
16/02/2005
Utilize o comando OnDrawColumnCell da DBGrid (veja o help, explica legal)
GOSTEI 0
Buosinet
16/02/2005
Desculpe, o EVENTO OnDrawColumnCell
GOSTEI 0
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.
Preciso de um evento que seja disparado menas vezes.
GOSTEI 0
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
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
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
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
16/02/2005
Desculpe... tem um pequeno erro que ocorreu quando copiei o código de para a mensagem... onde estádevia serTestei e funcionou sem problemas com um dbgrid.
SetWindowLong(SeuGrid.Handle, GWL_USERDATA, SetWindowLong(ClientHandle, GWL_WNDPROC, Integer(@ClientWindowProc)));
SetWindowLong(SeuGrid.Handle, GWL_USERDATA, SetWindowLong(SeuGrid.Handle, GWL_WNDPROC, Integer(@ClientWindowProc)));
GOSTEI 0
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
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
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
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]
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
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 ?
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
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.
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
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.
encontrei um bug, para essas versões e ja esta corrigido em breve colocarei disponivel para download.
GOSTEI 0
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?
Alguma solução?
GOSTEI 0
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
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:
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!
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