2016-07-28 5 views
0

Delphi 10 Seattle에서 TScrollBar 이벤트 (OnScroll) 핸들러에 대한 솔루션을 찾지 못했습니다. Panel이나 DBGrid와 같은 내용을 넣을 TScrollBox가 아니기 때문에 그것을 선택했습니다. 그것은 단지 마우스 동작을 감지 할뿐입니다 (마우스 업/다운/사이드 - 투 - 사이드 중 어느 것도 작동하지 않았습니다). 파일 찾기 도구로 사용되어 많은 수의 TeeChart를 강제 업데이트합니다. 스크롤 방향.FMX 용 TScrollBar에 해당하는 OnScroll 이벤트는 무엇입니까?

지금까지 난 단지

의 OnChange 외에 이동 스크롤 막대를 감지하는 효율적인 방법은 무엇입니까 WindowsMessages (WM_HSCROLL)와 VLC.StdCtrls.TScrollBar.OnScroll

구성된 이해할 예를 가로 질러왔다?

ScrollBar를 조작하고 중간에 자체를 재설정하는 데 도움이됩니다. Min = -50 및 Max = 50 (0)을 설정하면 훨씬 좋을 것 같습니다.

+0

onchange를 이벤트를 사용.OnScroll과 동일하게 작동합니다. Min 및 Max 속성을 원하는대로 설정할 수 있습니다. –

+0

나는 당신의 질문을 undestand하지 않는 이유는 무엇입니까 * OnChange * 게다가 찾고 있습니다. OnChange는 당신이 사용하기로되어있는 것입니다. 중간으로 재설정하려면'sb.Value : = (sb.max + sb.min)/2;를 설정하십시오. –

+0

나는 당신의 제안을 구현했지만, 충분히 자신을 명확하게 만들지는 않을까 걱정됩니다. 스크롤 막대가 이동 된 후 스크롤 막대를 원래 위치 (가운데)로 다시 이동합니다. [링크] (http://stackoverflow.com/questions/1269799/)이 링크에는 OnScroll (VCL)에 대한 추가 속성이 표시됩니다 그래서 저는 변화가 비슷하지 않다고 생각했습니다. –

답변

0

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; 
+0

나는 이것이 단지 시험 일 뿐이라고 생각하지만, sbIncrement는 무엇인가? 단지 w/e를 늘리거나 줄이는 영원히 추가/감산 ... 어느 방향으로 스크롤바가 향하고 있는지. 나는 우리가 가지고있는 w/e 영향이 (1) ScrollBar1 및 (2) sb (지역 변수)이기 때문에 스크롤바가 재설정되지 않는다고 생각합니다. 로컬 변수 만 로컬 obj에 영향을 미치지 않도록합니다. 즉, OnChange를 함수 외부로 이동하여 전역 ScrollBar1에 영향을 주어야합니다. –

+0

초기 발신자 : TObject는 전역 ScrollBar1에 대한 복사 또는 포인터입니까? –

+0

로컬'sb'는 실제'ScrollBar'에 대한 참조 일뿐입니다. 이것은'Sender' 매개 변수입니다. 그 목적은'** (Sender as TScrollBar)'를 항상 **, ** 또는 ** (Sender as TScrollBar) do를 사용하도록 ** 작성하는 것을 피하기위한 것입니다. –