Barra de rolagem sicronizado em dois memos
Tenho dois memos e preciso fazer um rotina onde quando rolar a barra do primeiro memo role a do segundo memo tambem, de preferencia que não apareça a barra no segundo memo. Se alguem souber de um componente tipo spliter para ser usado agradeceria.
Muito Obrigado a Todos
Claudio D´Pinho
Muito Obrigado a Todos
Claudio D´Pinho
Dpinho
Curtidas 0
Respostas
Micheus
15/06/2006
E se vc transferir os eventos relevantes da barra de scroll do Memo1 para o Memo2. Interceptando as mensagem (eventos) enviadas para o procedimento de janela do Memo1 e transferindo-os ao Memo2.
Veja se com esse fragmento vc tem um ponto de partida para chegar até o que vc quer:
O curioso é que com a propriedade [i:c3896d1de3]Memo2.ScrollBars=ssNone[/i:c3896d1de3] o scroll ocorre normalmente na vertical. Entretanto, na horizontal, se a linha for mais extensa que a largura do memo2 haverá quebra do texto (independente da propriedade WantReturns), então para que isso não ocorra, [i:c3896d1de3]Memo2.ScrollBars[/i:c3896d1de3] deve ser setado para [i:c3896d1de3]ssHorizontal [/i:c3896d1de3]e na execução do programa a chamada a [i:c3896d1de3]ShowScrollBar[/i:c3896d1de3] esconde a barra horizontal sem que ocorra o problema citado.
Só não está sendo tratado o evento WheelMouse (form que contém o memo) - apesar de o memo1 rolar, seus eventos de scroll não ocorrem (???). Usando SetScrollPos (API) ou ScrollBy (método) sobre o memo2 não surte efeito. :cry:
Veja se com esse fragmento vc tem um ponto de partida para chegar até o que vc quer:
... Form1 = class(TForm) ... private SavedScrollProc :TWndMethod; procedure ScrollWndProc(var Message: TMessage); ... end; ... procedure TForm1.ScrollWndProc(var Message: TMessage); begin case Message.Msg of WM_HSCROLL, // ver help API - Scroll Bar Reference WM_VSCROLL, SBM_SETRANGE, SBM_SETRANGEREDRAW, SBM_SETPOS : Memo2.Dispatch(Message); // transfere mensagens para memo2 end; SavedScrollProc(Message); // chama o WindowProc padrão do memo1 end; procedure TForm1.FormCreate(Sender: TObject); begin if not Assigned(SavedScrollProc) then begin SavedScrollProc := Memo1.WindowProc; // salva WindowProc do memo1 Memo1.WindowProc := ScrollWndProc; // atribui novo procedimento // para que o scroll horizontal se reflita no segundo memo ShowScrollBar(Memo2.handle, SB_HORZ, False); end; end; ...
O curioso é que com a propriedade [i:c3896d1de3]Memo2.ScrollBars=ssNone[/i:c3896d1de3] o scroll ocorre normalmente na vertical. Entretanto, na horizontal, se a linha for mais extensa que a largura do memo2 haverá quebra do texto (independente da propriedade WantReturns), então para que isso não ocorra, [i:c3896d1de3]Memo2.ScrollBars[/i:c3896d1de3] deve ser setado para [i:c3896d1de3]ssHorizontal [/i:c3896d1de3]e na execução do programa a chamada a [i:c3896d1de3]ShowScrollBar[/i:c3896d1de3] esconde a barra horizontal sem que ocorra o problema citado.
Só não está sendo tratado o evento WheelMouse (form que contém o memo) - apesar de o memo1 rolar, seus eventos de scroll não ocorrem (???). Usando SetScrollPos (API) ou ScrollBy (método) sobre o memo2 não surte efeito. :cry:
GOSTEI 0
Dpinho
15/06/2006
Muito Obrigado pela ajuda, foi otimo... utilizei o codigo e resolvir um grupo de Tres memos, mas meu form tem 12 memos sendo que tenho que sicronizar de três em Três, se alguem puder me ajudar de um forma que não precise repetir o codigo seria bom.
Agradeço
Claudio D´Pinho
Agradeço
Claudio D´Pinho
GOSTEI 0