2009-11-12 7 views

답변

4

아마도 도움이 될 것입니다. 일반 TStringGrid의 스크롤 이벤트를 트래핑하는 예제를 보여줍니다. Synchronize the Scrolling of two TStringgrids?

+0

이 방법이 효과가 있지만 여기에 한 가지 지식이 부족합니다. 도움을 주시겠습니까? 새 구성 요소 인 TScrDBGrid를 만들었지 만, 이미 선언 된 많은 속성과 이벤트가있는 양식에 DBGrid가 있으므로 이미 삭제하고 새로 만드는 것을 싫어합니다. 이 DBGrid를 새로운 클래스로 "마이그레이션"할 수있는 방법이 있습니까? –

+1

새 구성 요소를 패키지에 설치하고 컴파일러에서 알 수 있도록 해당 패키지를 IDE에 설치할 수 있습니다. 바꿀 DBGrid를 사용하여 장치를 닫으십시오. 그러면 IDE에서 열리지 않습니다. * .DFM 및 PAS 파일의 사본을 만드십시오! * 메모장에서 .DFM 텍스트를 열고 TDBGrid를 새 그리드의 클래스 이름으로 바꿉니다. 일치하는 .PAS 파일의 인터페이스 섹션에서도 같은 작업을 수행하고 * interface * uses 절에 새 장치의 이름을 추가해야합니다. 파일을 저장하고 IDE에서 다시 엽니 다. 네가 일을 올바르게했다면, 모두 괜찮을거야. 그렇지 않은 경우 백업 사본을 복원하십시오. –

+0

마지막 질문 하나. 이 이벤트가 작동하는 동안 스크롤 막대가 작동을 멈췄으므로이 이벤트를 잡는 동안 실제 스크롤 조작을 위해 창을 더 진행하지 못하는 것 같습니다. 어떻게 해결해야합니까? –

0

지금은이를 확인할 수 없지만 이벤트가 올바르게 기억되지만 게시되지는 않습니다. TDBGrid에서 파생 된 컨트롤을 만들고 스크롤 막대 이벤트를 게시하십시오.

+0

확인 했는데도 여전히 그런 이벤트를 찾을 수 없습니다. ScrollBars라는 요소가 있지만 이벤트와 관련이 없습니다. –

0

편집 : 잘못된 대답, 분명히. 가로 스크롤바를 가로 지르지 않습니다.

DBGrid 수준에서 catch하지 마십시오. 부착 된 TDataSet의 BeforeScroll 또는 AfterScroll에서이를 잡습니다. 스크롤 막대, 위쪽 및 아래쪽 화살표 키, 페이지 위로 및 페이지 이동 키 등을 사용하여 DBGrid 내에서 발생합니다.

+0

수직 스크롤은 작동하지만 수평 스크롤은 작동하지 않습니다. 수평 스크롤을 위해 어떻게 불을 냅니 까? –

+0

나는 그것이 OP에 많은 도움이 될 것이라고 생각하지 않는다. 그는 수평 스크롤을 잡아두기를 원합니다. 즉 가시적 인 열이 바뀔 때입니다. –

+0

아, 물론 당신 말이 맞아요. 나는 "수평"을 놓쳤다. 수정 해줘서 고마워. @ Tofig : 나는 당신이 수평 스크롤을 잡을 수 있다고 생각하지 않는다. 최소한 내가 작성한 빠른 테스트 앱은 그렇지 못했다. 왼쪽 및 오른쪽 화살표 키는 OnColEnter 및 OnColExit 이벤트에서 작동하지만 선택한 열은 변경되지 않으므로 스크롤 막대를 통해 트리거되지 않습니다. –

4

TCustomGrid에는 WMHScroll 프로 시저가 있지만 비공개입니다. DBGrid에서는 사용할 수 없습니다.
당신은 자신을 TDBGrid의 자손을 작성하고 자신의

procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL; 

을하거나 일부 심각하게 나쁜 해킹을 ...

업데이트 할 것 : 트릭을/당신의 코드를 몰래 해킹 ...

[...] 
    uses 
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
     Dialogs, DB, ADODB, Grids, DBGrids; 

    type 
     // Hack to redeclare your TDBGrid here whitout the the form designer going mad 
     TDBGrid = class(DBGrids.TDBGrid) 
     procedure WMHScroll(var Msg: TWMHScroll); message WM_HSCROLL; 
     end; 

     TForm8 = class(TForm) 
     DBGrid1: TDBGrid; 
     DataSource1: TDataSource; 
     ADODataSet1: TADODataSet; 
     ADOConnection1: TADOConnection; 
     private 
     { Private declarations } 
     public 
     { Public declarations } 
     end; 

    var 
     Form8: TForm8; 

    implementation 

    {$R *.dfm} 

    { TDBGrid } 

    procedure TDBGrid.WMHScroll(var Msg: TWMHScroll); 
    begin 
     case Msg.ScrollCode of 
     SB_ENDSCROLL: OutputDebugString('SB_ENDSCROLL') ; 
     SB_LEFT:OutputDebugString('SB_LEFT'); 
     SB_RIGHT:OutputDebugString('SB_RIGHT'); 
     SB_LINELEFT:OutputDebugString('SB_LINELEFT'); 
     SB_LINERIGHT:OutputDebugString('SB_LINERIGHT'); 
     SB_PAGELEFT:OutputDebugString('SB_PAGELEFT'); 
     SB_PAGERIGHT:OutputDebugString('SB_PAGERIGHT'); 
     SB_THUMBPOSITION:OutputDebugString('SB_THUMBPOSITION'); 
     end; 
     inherited; // to keep the expected behavior 
    end; 
[...] 

갱신 2 : 별도의 장치 (권장), 만 t을 넣어 확실하게 당신의 특별한을 TDBGrid 코드를 이동할 수 있습니다 양식의 사용 조항에있는 단위 이름 AFTER DBGrids.

+0

그래, 그게 yozey의 기사가 실제로 제안하는 것입니다. 나는 이미 그러한 구성 요소를 만들었습니다. 이제 문제는 - 삭제하고 다시 만들지 않고 이전 것에서 새 것으로 이전하는 방법입니까? –

+0

감사합니다. 그러한 해킹이 가능하다는 것을 몰랐습니다. –

+0

Tofig, See my Update2. 기존 코드를 변경하지 않아도됩니다. –