Pressionando um botão

Delphi

08/05/2003

Como faço para que um evento ocorra enquanto um botão é pressionado?
Por exemplo rolar um ScrollBox enquanto um determindado botão é pressionado, seria funcionar como um dos botões deste mesmo ScrollBox.
O problema é que quando utilizo o onMouseDown por exemplo ele fica em loop infinito...

O q posso fazer?

Grato


Thiago Morasi

Thiago Morasi

Curtidas 0

Respostas

Marcelo.c

Marcelo.c

08/05/2003

Para evitar o Loop, acho que você pode preencher o evento OnMouseUp para parar a rolagem.


GOSTEI 0
Thiago Morasi

Thiago Morasi

08/05/2003

Já tentei fazer algo neste sentido, mas não consigo fazer com que haja alguma interação entre estes eventos...

O mais simples seria se tivesse alguma propriedade no botão que indicasse o estado do próprio botão, por exemplo:

evento onMouseDown
begin
while botão.pressionado do
ScrollBox1.HorzScrollBar.Position:= ScrollBox1.HorzScrollBar.Position + 1;
end;

Não sei mais o q fazer...


GOSTEI 0
Okama

Okama

08/05/2003

Pode ser que eu esteja entendendo mal, mas se você colocar esse código no evento OnClick do botão resolveria.


GOSTEI 0
Thiago Morasi

Thiago Morasi

08/05/2003

O problema é que não consigo encontrar alguma propriedade que mostre o estado do botão (botão.pressionado)...


GOSTEI 0
Okama

Okama

08/05/2003

Nesse Caso você pode usar o SpeedButton e altere a Propriedade AllowAllUp como True; GroupIndex = 1;

E Teste a propriedade Down:
If SpeedButton1.Down = True then
<botão pressionado>
else
<Botão não pressionado>


GOSTEI 0
Thiago Morasi

Thiago Morasi

08/05/2003

Ainda não consegui, coloquei o código que eu havia passado, num SpeedButton com as características que vc me passou, porém ele entra em loop infinito se eu coloco este código:

while SpeedButton2.Down = true do
ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position + 1;

E quando coloco este:
if SpeedButton2.Down = true then
ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position + 1;

Tenho que ficar clicando várias vezes no botão para que o ScrollBox vá rolando...

Parece uma coisa simples mas tá me tirando a paciência...


GOSTEI 0
Okama

Okama

08/05/2003

Nesse caso você deve definir um fim para o Loop. Como você quer que o ScrollBox funcione?

Se o botão estiver pressionado o Loop do ScrollBox será executado até encontrar o fim (ou começo) ou seja você não precisa testar se o botão está pressionado e sim verificar o fim do ScrollBox.

Ex: (em qualquer botão)
[b:c2498d3f95]Repeat[/b:c2498d3f95]
ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position + 1;

[b:c2498d3f95]until[/b:c2498d3f95]
ScrollBox1.VertScrollBar.Position >= ScrollBox1.VertScrollBar.Range - ScrollBox1.ClientHeight;


GOSTEI 0
Thiago Morasi

Thiago Morasi

08/05/2003

O que eu gostaria é de simular de forma idêntica um botão de um Scroll, enquanto ele está pressionado ele rola e quando se libera o botão o rolamento para...


GOSTEI 0
Okama

Okama

08/05/2003

Putz, cara pq vc não disse antes? Eu pensei que você queria testar o pressionamento do botão.

Consegui algo de forma idêntica:

Insira um componente timer e defina as propriedades:
Enabled := False;
Interval:= 10;

No evento Ontimer:
procedure TForm1.Timer1Timer(Sender: TObject);
[b:b30e2d8ccf]begin[/b:b30e2d8ccf]
ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position + 1;
[b:b30e2d8ccf]end[/b:b30e2d8ccf];


Em qualquer botão nos Eventos OnMouseDown e OnMouseUP

[b:b30e2d8ccf]procedure[/b:b30e2d8ccf] TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
[b:b30e2d8ccf]begin[/b:b30e2d8ccf]
Timer1.Enabled := true;
[b:b30e2d8ccf]end[/b:b30e2d8ccf];
[b:b30e2d8ccf]
procedure [/b:b30e2d8ccf]TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
[b:b30e2d8ccf]begin[/b:b30e2d8ccf]
Timer1.Enabled := False;
[b:b30e2d8ccf]end[/b:b30e2d8ccf];


Para subir use outro botão com outro Timer e coloque no Evento OnTimer :

procedure TForm1.Timer2Timer(Sender: TObject);
[b:b30e2d8ccf]begin[/b:b30e2d8ccf]
ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position - 1;
[b:b30e2d8ccf]end[/b:b30e2d8ccf];


Desculpe a confusão, hehe :lol:


GOSTEI 0
Thiago Morasi

Thiago Morasi

08/05/2003

Okama, perfeito....

Muito obrigado, já estava louco por causa disso...


GOSTEI 0
Werlon Goulart

Werlon Goulart

08/05/2003

O pacote RX tem um botao com uma caracteristica destas...

Basta marcar no botao RXSpeedButton a opcao AllowTimer para True e qndo vc clicar e segurar o botao clicado o evento onclick se repete...
Tem ate como configurar o tempo entre o primeiro evento e os posteriores.



procedure TForm1.RxSpeedButton1Click(Sender: TObject);
begin
inc(i);
label1.Caption:=inttostr(i);
end;


Um Abraço
Werlon Goulart


GOSTEI 0
POSTAR