Como detectar que o mouse é indiferente e botão ainda pressionado?
-
22-08-2019 - |
Pergunta
Em Delphi, eu adicionei um componente da barra de rolagem (orientada vertical) para o lado direito do meu formulário.
Eu adicionei um evento de barra de rolagem OnChange para que eu possa alterar a vista da forma e da posição do polegar barra de rolagem quando o usuário clica no botão UpArrow ou DownArrow com o mouse, e isso funciona bem.
Mas o evento OnChange só parece se desencadeou quando o botão do mouse é pressionado inicialmente na seta.
Eu observo todos os controles de barra de rolagem repetir o comando e continuar a rolagem enquanto os restos do mouse pressionado sobre a seta, e eu gostaria de implementar esse comportamento.
Assim como eu posso facilmente detectar se o usuário não se moveu o mouse e continua a pressionar o botão do mouse, enquanto os restos do mouse sobre a seta?
Conclusão. De alguma forma, algo na barra de rolagem no meu projeto foi corrompido. Depois eu apaguei o ScrollBar, e acrescentou que, novamente, o problema desapareceu.
Este é um daqueles complicados que me levou muito tempo para resolver. Obrigado pela ajuda. Estou fechando esta questão.
Solução
Use o OnScroll evento.
O código a seguir adiciona 'xxx' com um memorando enquanto o mouse é pressionado sobre o botão de seta de rolagem. Testado com Delphi 6.
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
begin
Memo1.Lines.Add( 'xxx' );
end;
Outras dicas
A maneira usual de alça auto-repetição é permitir que um TTimer e verificar na OnTimer () manipulador de eventos se as necessidades de ação a ser executada novamente, e para desactivar o temporizador se não. Se você precisa de código de exemplo, eu me lembro que o SynEdit controle usou uma técnica semelhante para deslocamento automático no arrasto e operações de cair.
Se um componente não encapsular o comportamento que você está procurando e você não pode facilmente simular o comportamento com os métodos disponíveis você deve realmente subclasse o componente mais próximo que faz a maioria do que você precisa e adicionar os comportamentos que estão faltando.
Eu sei que algum trabalho extra está envolvido, mas é realmente o melhor caminho a percorrer. Agora com Delphi, eu me lembro que componentes subclasse necessário um pouco de trabalho extra, assim como para poder ser utilizado a partir do IDE para o projeto forma, talvez isso mudou desde a versão 7.