DBGrid가 있는데 가로 스크롤 막대를 사용할 때마다 코드를 실행해야합니다. DBGrid에서 이러한 이벤트를 찾을 수 없습니다. 조언 할 수 있니?델파이의 DBGrid에서 스크롤링 이벤트를 잡는 방법
답변
아마도 도움이 될 것입니다. 일반 TStringGrid의 스크롤 이벤트를 트래핑하는 예제를 보여줍니다. Synchronize the Scrolling of two TStringgrids?
지금은이를 확인할 수 없지만 이벤트가 올바르게 기억되지만 게시되지는 않습니다. TDBGrid에서 파생 된 컨트롤을 만들고 스크롤 막대 이벤트를 게시하십시오.
확인 했는데도 여전히 그런 이벤트를 찾을 수 없습니다. ScrollBars라는 요소가 있지만 이벤트와 관련이 없습니다. –
편집 : 잘못된 대답, 분명히. 가로 스크롤바를 가로 지르지 않습니다.
DBGrid 수준에서 catch하지 마십시오. 부착 된 TDataSet의 BeforeScroll 또는 AfterScroll에서이를 잡습니다. 스크롤 막대, 위쪽 및 아래쪽 화살표 키, 페이지 위로 및 페이지 이동 키 등을 사용하여 DBGrid 내에서 발생합니다.
수직 스크롤은 작동하지만 수평 스크롤은 작동하지 않습니다. 수평 스크롤을 위해 어떻게 불을 냅니 까? –
나는 그것이 OP에 많은 도움이 될 것이라고 생각하지 않는다. 그는 수평 스크롤을 잡아두기를 원합니다. 즉 가시적 인 열이 바뀔 때입니다. –
아, 물론 당신 말이 맞아요. 나는 "수평"을 놓쳤다. 수정 해줘서 고마워. @ Tofig : 나는 당신이 수평 스크롤을 잡을 수 있다고 생각하지 않는다. 최소한 내가 작성한 빠른 테스트 앱은 그렇지 못했다. 왼쪽 및 오른쪽 화살표 키는 OnColEnter 및 OnColExit 이벤트에서 작동하지만 선택한 열은 변경되지 않으므로 스크롤 막대를 통해 트리거되지 않습니다. –
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.
그래, 그게 yozey의 기사가 실제로 제안하는 것입니다. 나는 이미 그러한 구성 요소를 만들었습니다. 이제 문제는 - 삭제하고 다시 만들지 않고 이전 것에서 새 것으로 이전하는 방법입니까? –
감사합니다. 그러한 해킹이 가능하다는 것을 몰랐습니다. –
Tofig, See my Update2. 기존 코드를 변경하지 않아도됩니다. –
이 방법이 효과가 있지만 여기에 한 가지 지식이 부족합니다. 도움을 주시겠습니까? 새 구성 요소 인 TScrDBGrid를 만들었지 만, 이미 선언 된 많은 속성과 이벤트가있는 양식에 DBGrid가 있으므로 이미 삭제하고 새로 만드는 것을 싫어합니다. 이 DBGrid를 새로운 클래스로 "마이그레이션"할 수있는 방법이 있습니까? –
새 구성 요소를 패키지에 설치하고 컴파일러에서 알 수 있도록 해당 패키지를 IDE에 설치할 수 있습니다. 바꿀 DBGrid를 사용하여 장치를 닫으십시오. 그러면 IDE에서 열리지 않습니다. * .DFM 및 PAS 파일의 사본을 만드십시오! * 메모장에서 .DFM 텍스트를 열고 TDBGrid를 새 그리드의 클래스 이름으로 바꿉니다. 일치하는 .PAS 파일의 인터페이스 섹션에서도 같은 작업을 수행하고 * interface * uses 절에 새 장치의 이름을 추가해야합니다. 파일을 저장하고 IDE에서 다시 엽니 다. 네가 일을 올바르게했다면, 모두 괜찮을거야. 그렇지 않은 경우 백업 사본을 복원하십시오. –
마지막 질문 하나. 이 이벤트가 작동하는 동안 스크롤 막대가 작동을 멈췄으므로이 이벤트를 잡는 동안 실제 스크롤 조작을 위해 창을 더 진행하지 못하는 것 같습니다. 어떻게 해결해야합니까? –