FMX TScrollBar
의 한계를 극복하기 위해 다음과 같은 기능을 향상시킬 수 있습니다 (당신이 제공 한 링크에 부분적으로 영향을 받음).
스크롤 막대를 사용하여 스크롤 할 컨트롤이 현재 스크롤 위치를 저장하는 속성을 가지고 있거나 갖출 수있는 경우에는 single
유형을 사용하거나 정의 할 수 있습니다. 테스트를 위해 방금 양식의 개인 속성으로 정의한 후 sbIncremental
이라고했습니다.
procedure TForm6.ScrollBarChange(Sender: TObject);
var
sb: TScrollBar;
sbOnChange: TNotifyEvent;
begin
sb := (Sender as TScrollBar);
sbIncremental := sbIncremental + sb.Value;
Label1.Text := FloatToStr(sbIncremental); // Use the new value
sbOnChange := sb.OnChange; // Disable OnChange event
sb.OnChange := nil; // -"-
sb.Value := (sb.Min + sb.Max)/2; // Reset position
sb.OnChange := sbOnChange; // Re-enable OnChange event
end;
중심에 스크롤바의 위치를 재설정하려면 :
가 나는
OnChange
이벤트 내 시험에서이처럼 보이는
TScrollBar
Orientation = Vertical
,
SmallChange = 10
,
Max = 100
로 다음
Min = -100
의 속성을 설정 OnChange 이벤트를 일시적으로 비활성화해야합니다.
업데이트 후 의견.
필자의 이해로, 값이 (OnChange 내에서) 0으로 변경 되더라도 스크롤 막대의 시각적 모양이 0 위치로 돌아 가지 않습니다 (최소 = -100 및 최대 = 100으로 제로 위치가 중간에 있음). 화살표 버튼을 클릭 할 때 수행되지만, 손잡이를 끌거나 손잡이의 양쪽을 클릭하는 경우에는 실행되지 않습니다. 시각적 업데이트는 OnChange 이벤트 내에서 이러한 두 가지 경우에 방지되는 것으로 보입니다. 또한 ScrollBar.Repaint를 호출해도 시각적 모양이 업데이트되지 않습니다. OnMouseDown/OnMouseUp 이벤트를 사용할 방법이 없습니다. 그들은 내부적으로 연결된 것처럼 보이지 않습니까?
이렇게하면 다음과 같은 (해킹 된) 해결책이 생깁니다. 타이머를 작은 지연 (예 : 300ms)으로 시작하십시오. 시간 초과가 발생하면 스크롤바는 새로운 값 변경을 수락하고 시각적으로 업데이트 할 준비가됩니다. 타이머는 또한 긍정적 인 효과가 있습니다. 클릭하면 썸 그립이 움직이며 뒤로 움직입니다. 어떤 시간이 없으면 어떤 일이 발생했음을 시각적으로 알 수 없습니다.
onchange를 이벤트 핸들러
잘 작동합니다 타이머
procedure TForm6.ScrollBarChange(Sender: TObject);
begin
// Use the scrollbar value
Label1.Text := FloatToStr((Sender as TScrollBar).Value);
// Enable reset timer
ScrollBarTimer.Enabled := False;
ScrollBarTimer.Enabled := True;
end;
그리고 OnTimer 이벤트
procedure TForm6.ScrollBarTimerTimer(Sender: TObject);
var
sbOnChange: TNotifyEvent;
begin
ScrollBarTimer.Enabled := False;
sbOnChange := ScrollBar.OnChange; // store OnChange event
ScrollBar.OnChange := nil; // disable OnChange event
ScrollBar.Value := (ScrollBar.Min + ScrollBar.Max)/2; // reset position
ScrollBar.OnChange := sbOnChange; // re-enable OnChange event
end;
onchange를 이벤트를 사용.OnScroll과 동일하게 작동합니다. Min 및 Max 속성을 원하는대로 설정할 수 있습니다. –
나는 당신의 질문을 undestand하지 않는 이유는 무엇입니까 * OnChange * 게다가 찾고 있습니다. OnChange는 당신이 사용하기로되어있는 것입니다. 중간으로 재설정하려면'sb.Value : = (sb.max + sb.min)/2;를 설정하십시오. –
나는 당신의 제안을 구현했지만, 충분히 자신을 명확하게 만들지는 않을까 걱정됩니다. 스크롤 막대가 이동 된 후 스크롤 막대를 원래 위치 (가운데)로 다시 이동합니다. [링크] (http://stackoverflow.com/questions/1269799/)이 링크에는 OnScroll (VCL)에 대한 추가 속성이 표시됩니다 그래서 저는 변화가 비슷하지 않다고 생각했습니다. –