2009-11-05 9 views
3

그리드 컨트롤을 작성했으며 마우스 휠에 대한 지원을 추가하려고합니다. DoMouseWheel 가상 메서드를 재정의하는 것만 큼 간단 할 것이라고 생각했지만 문제가 조금 있습니다.한 번에 한 줄씩 스크롤하려면 DoMouseWheel을 어떻게 사용합니까?

제어판에서 한 번에 스크롤 할 줄 수를 설정할 수 있으며 기본값은 3입니다. 그리고 이것은 문서 또는 웹 페이지를 스크롤 할 때 완벽한 의미를 지니지 만 그리드 상에서는 한 번에 한 줄씩 스크롤하는 것이 좋다고 생각합니다. 그러나 Delphi의 휠 지원은 스크롤하는 모든 노치에 대해 DoMouseWheel을 3 번 호출합니다. 즉, 그리드의 각 세 번째 줄 (또는 그 전역 설정이 무엇이든간에)으로 스크롤 할 수 있다는 의미입니다.

마우스 휠을 돌릴 때마다 한 번에 한 줄씩 스크롤하는 방법은 무엇입니까?

업데이트 : 간단히 대답하면 스크롤 후 Result를 True로 설정하면 스크롤이 3 번되지 않고 한 번만 스크롤됩니다.

답변

2

클래스의 코드를 복사하면 DoMouseWheelDown()DoMouseWheelUp()을 모두 무시하고 한 번에 한 줄씩 정확하게 스크롤 할 수 있습니다.

+0

눈에 띄었다 구현에 대한 아무것도 없었다. 그러나 당신의 충고에 따라 다시 한번 살펴 보았습니다. 스크롤 한 후에 단순히 True를 반환하는 것으로 밝혀졌습니다 (상속 된 후 반환 됨).이 함수는 한 번만 함수를 호출했습니다. –

+0

@ 코부스 : 물론, 기능을 재정의하는 경우 상속 된 코드를 호출하는 것이 올바른지 여부를 확인해야합니다. 그래서 VCL 그리드 구현을 복사하는 것이 좋습니다. 올바른 일입니다. 나는 너의 구현을 보지 못했고, 나는 영매가 아니다. – mghie

2

일반적으로 시스템 기본값 및/또는 사용자 기본 설정과 비교하여 싸우는 것은 좋지 않습니다. 이 경우에는 시스템 또는 사용자가 스크롤 시간에 설정하기로 결정한 것을 존중해야 함을 의미합니다.

그렇다면 실제로 멀티 스 롭 효과가 완전히 잘못되어 운전하려는 구성 요소에 오해를 불러 일으킬 수 있다고 생각하면이 문제를 해결할 수있는 방법을 모색 할 수 있습니다. 당신은 어떤 타이머를 설정하려고 시도하고 주어진 시간 (milliseconds의 범위)에서 발생하는 mouseWheel 이벤트 중 하나를 제외하고 모두 무시할 수 있습니다. 한 가지해야 할 일은 프로그램에서 사용자가이 동작을 끌 수 있도록 구성 옵션을 설정하는 것입니다.

+0

+1 사용자의 설정을 존중하라는 알림. – serialhobbyist

+0

사용자는 아마도이 설정을 인식하지 못할 것입니다. 그리고 그가 그것을 알고 있다면 아마 스크롤 휠의 주요 용도가 웹 페이지를 읽는 것과 잘 작동하도록 선택했을 것입니다. 스크롤 막대의 화살표를 클릭하여 위/아래로 스크롤하는 것과 비슷한 휠 롤링이 표시되면 한 번에 한 줄씩 데이터 바인딩 그리드에서 더 이해할 수 있다는 데 동의합니까? 이 경우 –

+0

을 입력하십시오.하지만 항상 사용자가 옵션을 해제해야합니다. –

0

필자의 경우 JVDBGrid 구성 요소를 사용했지만 DbGrid에서도이 기능이 작동한다고 생각합니다. OnMouseWheelDown 및 OnMouseWheelUp 함수를 덮어 쓸 수 있습니다.

예컨대 :

유형 선언 :

type 
    TMyGrid = class(TJvExDBGrid); 

구현

procedure TFExample.JvDBGrid1MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); 
begin 

    Handled := TMyGrid(Sender).DataLink.DataSet.MoveBy(1) <> 0; 

end; 

procedure TFExample.JvDBGrid1MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); 
begin 

    Handled := TMyGrid(Sender).DataLink.DataSet.MoveBy(-1) <> 0; 

end; 
관련 문제