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

Mover barra de rolagem de varios grids simultaneamente


etspaz

Pergunta

Bom dia,

Eu tenho varios grids numa tela e preciso fazer com que ao mover a barra de rolagem da direita para esquerda e vice versa de um grid, todos grids tenham o mesmo movimento.

Não se trata de definir o master source, pois alguns grids estão ligados ao mesmo datasource, quando se move de registros eles acompanham.

Mas no caso, não estou me referindo a navegar pelos registros.

Tem alguma propriedade do grid que controla a barra de rolagem, para eu tipo forçar todos terem a mesma posição quando rolar a barra de algum?

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0
Tem alguma propriedade do grid que controla a barra de rolagem, para eu tipo forçar todos terem a mesma posição quando rolar a barra de algum?

Quando voce rolar uma barra as outras acompanharão

{ Página para cima }

SendMessage(DBgrid1.Handle, WM_VSCROLL, SB_PAGEUP, 0);

SendMessage(DBgrid2.Handle, WM_VSCROLL, SB_PAGEUP, 0);

SendMessage(DBgrid3.Handle, WM_VSCROLL, SB_PAGEUP, 0);

{ Página para baixo }

SendMessage(DBgrid1.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);

SendMessage(DBgrid2.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);

SendMessage(DBgrid2.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);

{ Linha para baixo }

SendMessage(DBgrid1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);

SendMessage(DBgrid2.Handle, WM_VSCROLL, SB_LINEDOWN, 0);

SendMessage(DBgrid3.Handle, WM_VSCROLL, SB_LINEDOWN, 0);

{ Linha para cima }

SendMessage(DBgrid1.Handle, WM_VSCROLL, SB_LINEUP, 0);

SendMessage(DBgrid2.Handle, WM_VSCROLL, SB_LINEUP, 0);

SendMessage(DBgrid3.Handle, WM_VSCROLL, SB_LINEUP, 0);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

beleza Jhonas,

Eu coloquei o codigo e percebi que realmente acompanha, porém, ainda não achei o evento certo para acionar estes metodos quando eu clicar na barra de rolagem.

Estou testando cada evento.

Se você puder me dizer qual evento eu ganho um tempo.

Valeu pela ajuda!

Link para o comentário
Compartilhar em outros sites

  • 0
Estou testando cada evento.

Se você puder me dizer qual evento eu ganho um tempo.

Voce ganha tempo e não aprende o porque as coisas:

Alguns eventos não são vinculados tão claramente a ocorrências externas.

Por exemplo, uma barra de rolagem tem um evento OnChange, que é disparado por diversos tipos de ocorrências

incluindo pressionamento de teclas, cliques de mouse e mudanças em outros controles.

Ao definir seus eventos, voce precisa certificar-se de que todas as ocorrências chamam os eventos apropriados.

Então creio que voce já percebeu que não existe um evento aparente de manipulação da barra de rolagem, então voce terá que criar esse evento para ser usado no dbgrid.

Caso não saiba como criar um evento novo para um componente ( no caso o dbgrid ) então voce terá que apelar para uma gambiarra que tambem funciona

var
  Form1: TForm1;
  posicao : integer = 0;

implementation

{$R *.DFM}

procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
   posicao := ScrollPos;
   if ScrollBar1.Position < posicao then
      begin
         SendMessage(DBgrid1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
         SendMessage(DBgrid2.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
      end
   else
      begin
         SendMessage(DBgrid1.Handle, WM_VSCROLL, SB_LINEUP, 0);
         SendMessage(DBgrid2.Handle, WM_VSCROLL, SB_LINEUP, 0);
      end;
end;

Veja se consegue entender o que fiz neste exemplo

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Jhonas,

Realmente não consegui entender corretamente.

ScrollBar1.Position > tenho que declarar como?

Confesso que a pressa me atrapalhou um pouco no entendimento, porém, tem hora que você tem que fazer algo funcionar rápido, depois estuda os conceitos.

Te agradeço pela atenção e gostaria se pudesse me explicar um pouco o código.

Demorei pra responder porque desviei os trabalhos por uns dias.

Link para o comentário
Compartilhar em outros sites

  • 0
Realmente não consegui entender corretamente.

ScrollBar1.Position > tenho que declarar como?

O componente ScrollBar está na paleta Standard

coloque o componente junto com o dbgrid ... mude a propriedade Kind = sbVertical

arraste o componente e coloque-o em cima da barra de rolagem do dbgrid ... ela é que será a sua nova barra de rolagem dos dbgrids

coloque o código no evento OnScrioll do ScrollBar1 ( como eu disse é uma gambiarra que funciona )

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Eu segui as instruções, coloquei o scrollbar, deixei o Kind como sbHorizontal, pois preciso mover na horizontal.

NO evento onScroll, coloquei o codigo.

Mas só movimenta na vertical e ainda volta para a posição.

if ScrollBar2.Position < posicao then
      begin
         SendMessage(dbgFacPerf.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
      end
   else
      begin
         SendMessage(dbgFacPerf.Handle, WM_VSCROLL, SB_LINEUP, 0);
      end;

testei com SB_LINELEFT/SB_LINEDOWN; SB_LINERIGHT/SB_LINELEFT ; SB_PAGEUP/SB_PAGEDOWN E SEMPRE DA NA MESMA, SÓ MOVIMENTA NA VERTICAL.

O QUE PODE ESTAR ERRADO, É O PARAMETRO QUE ESTOU USANDO?

ANDEI PESQUISANDO E DESCOBRI QUE ESTOU TRATANDO AS MENSAGENS ENVIADAS AO WINDOWS, CORRETO?

INCLUSIVE DESCOBRI COMO TIRAR A BARRA DE ROLAGEM, SÓ POR CURIOSIDADE.

ME DESCULPE PELA IGNORANCIA, MAS É UMA BESTEIRINHA E EU NÃO TO CONSEGIUNDO FAZER. OS CARAS QUEREM MOVER SÓ UMA BARRA DE ROLAGEM...

Link para o comentário
Compartilhar em outros sites

  • 0
O QUE PODE ESTAR ERRADO, É O PARAMETRO QUE ESTOU USANDO?

ANDEI PESQUISANDO E DESCOBRI QUE ESTOU TRATANDO AS MENSAGENS ENVIADAS AO WINDOWS, CORRETO?

INCLUSIVE DESCOBRI COMO TIRAR A BARRA DE ROLAGEM, SÓ POR CURIOSIDADE.

ME DESCULPE PELA IGNORANCIA, MAS É UMA BESTEIRINHA E EU NÃO TO CONSEGIUNDO FAZER. OS CARAS QUEREM MOVER SÓ UMA BARRA DE ROLAGEM...

OBS: Não use texto em caixa alta ( Não digite tudo maiusculo ... certo ? siga as regras do forum

exemplo de barra de rolagem horizontal

procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
   posicao := ScrollPos;

   Label1.Caption := inttostr(posicao);
   Label2.Caption := inttostr(ScrollBar1.Position);

   if ScrollBar1.Position < posicao then
      begin
         SendMessage(DBgrid1.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
         SendMessage(DBgrid2.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
      end
   else
      begin
         SendMessage(DBgrid1.Handle, WM_HSCROLL, SB_LINELEFT, 0);
         SendMessage(DBgrid2.Handle, WM_HSCROLL, SB_LINELEFT, 0);
      end;

end;

Voce deverá limitar o numero de rolagem do ScrollBar para não extrapolar a barra do dbgrid

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde,

Consegui fazer funcionar do jeito com o seu exemplo, porém, foi só em um form de teste.

O que estava me atreapalhando era que eu não posicionava o scrollbar corretamente sobre a barra de rolagem do grid.

fiz isto, alias, é muito chato, você tente tenta... até ele ficar.

Mas o problema é que este teste eu fiz num form com dois dbgrids direto no form, align = alnone;

Já nos grids que realmente preciso fazer isto, estão dentro de uma celula de um gridpanel e align = alclient, pois o form fica maximizado quando executa e tem uma função para tratar o controle de resolução de monitor em relação ao aplicativo.

então, não consigo colocar um scrollbar no dbgrid, só se deixar seu align = alnone ou custom, mas aí, fica tudo desconfigurado.

Não quero ser muito chato, nem parecer preguiçoso, mas sei que pode-se criar um metodo para os controles, mas não sei como. Tem algum exemplo que possa ser postado?

Link para o comentário
Compartilhar em outros sites

  • 0
Citar
Não quero ser muito chato, nem parecer preguiçoso, mas sei que pode-se criar um metodo para os controles, mas não sei como. Tem algum exemplo que possa ser postado?

Se voce conseguir entender .... outra maneira seria voce criar um componente derivado do TDBgrid com as funcionalidades que voce precisa

Neste exemplo está sendo removida a barra de rolagem vertical e horizontal do TDBgrid

 
unit ExtentedDBGrid; 

interface 

uses 
  Windows, Messages, SysUtils, Classes, DBGrids, Math, Controls; 

type 
  TExtendedColumn = class(TColumn) 
  private 
    { Private declarations } 
    FTag: Integer; 
  protected 
    { Protected declarations } 
  published 
    { Published declarations } 
    property Tag: Integer read FTag write FTag; 
  end; 

  TExtendedDBGrid = class(TDBGrid) 
  private 
    { Private declarations } 
    FVerticalBar  : Boolean; 
    FHorizontalBar: Boolean; 

    procedure SetVerticalBar(AValue: Boolean); 
    procedure SetHorizontalBar(AValue: Boolean); 
    procedure WMNCCalcSize(var msg: TMessage); message WM_NCCALCSIZE; 
  protected 
    { Protected declarations } 
    function CreateColumns: TDBGridColumns; override; 
  public 
    { Public declarations } 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
  published 
    { Published declarations } 
    property VerticalBar: Boolean read FVerticalBar write SetVerticalBar default True; 
    property HorizontalBar: Boolean read FHorizontalBar write SetHorizontalBar default False; 
  end; 

procedure Register; 

implementation 

uses Grids; 

procedure Register; 
begin 
  RegisterComponents('Own Components', [TExtendedDBGrid]); 
end; 

{ TExtentedDBGrid } 

constructor TExtendedDBGrid.Create(AOwner: TComponent); 
begin 
  inherited Create(AOwner); 
  FVerticalBar   := True; 
  FHorizontalBar := False; 
end; 

function TExtendedDBGrid.CreateColumns: TDBGridColumns; 
begin 
  Result := TDBGridColumns.Create(Self,TExtendedColumn); 
end; 

destructor TExtendedDBGrid.Destroy; 
begin 
  inherited Destroy; 
end; 

procedure TExtendedDBGrid.SetHorizontalBar(AValue: Boolean); 
begin 
  FHorizontalBar := AValue; 
  RecreateWnd; 
end; 

procedure TExtendedDBGrid.SetVerticalBar(AValue: Boolean); 
begin 
  FVerticalBar := AValue; 
  RecreateWnd; 
end; 

procedure TExtendedDBGrid.WMNCCalcSize(var msg: TMessage); 
var 
  style: Integer; 
begin 
  style := getWindowLong( handle, GWL_STYLE ); 
  if (style and WS_HSCROLL) <> 0 then 
    if not FHorizontalBar then 
      SetWindowLong( handle, GWL_STYLE, style and not WS_HSCROLL ); 
  if (style and WS_VSCROLL) <> 0 then 
    if not FVerticalBar then 
      SetWindowLong( handle, GWL_STYLE, style and not WS_VSCROLL ); 
  inherited; 
end; 

end.

abraço

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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...