Pressionando um botão
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
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
Curtidas 0
Respostas
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
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...
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
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
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
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>
E Teste a propriedade Down:
If SpeedButton1.Down = True then
<botão pressionado>
else
<Botão não pressionado>
GOSTEI 0
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...
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
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;
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
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
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:
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
08/05/2003
Okama, perfeito....
Muito obrigado, já estava louco por causa disso...
Muito obrigado, já estava louco por causa disso...
GOSTEI 0
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
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