부모로서 tdbgrid를 가진 버튼의 클릭 이벤트를 어떻게 잡으려고합니까?

StackOverflow https://stackoverflow.com/questions/748190

  •  09-09-2019
  •  | 
  •  

문제

Delphi TDBGrid 구성 요소 (헤더/제목 셀)의 왼쪽 상단에 추가하고 싶은 작은 버튼이 있습니다. 버튼을 쉽게 배치 할 수 있지만 이제 클릭 이벤트가 처리되지 않습니다. 나는 이벤트가 그리드에 잡히고 있다고 생각합니다. 이 특정 이벤트가 버튼으로 이동하도록 강요 할 수있는 방법은 무엇입니까? 참고 나는 현재와 같이 제목 버튼의 클릭 이벤트를 처리하려면 그리드가 필요합니다.

procedure TForm38.FormCreate(Sender: TObject);
begin
   button1.Parent := grid;
   button1.Top := 0;
   button1.Left := 0;
   button1.Width := 12;
   button1.Height := 18;
   button1.OnClick := Button1Click;
end;

** 업데이트 : ** 내가 잘 작동하는 것처럼 보이는 버튼의 마우스 own 이벤트를 사용할 수 있었지만 클릭 이벤트를 사용할 수 없었습니다.

procedure TForm38.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if ( Button = mbLeft ) then
      TButton(Sender).Click;
end;
도움이 되었습니까?

해결책

왜 클릭 메시지를 먹는지 잘 모르겠습니다. 실제로 마우스 업 이벤트 핸들러를 통해 클릭 이벤트를 시뮬레이션합니다.

procedure TForm38.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ctrl: TButton;
begin
  ctrl := Sender as TButton;
  if (x > 0) and (x < ctrl.Width) and (y > 0) and (y < ctrl.Height)  then
    ctrl.Click;
end;

일반 버튼을 테스트하면 마우스를 해제 할 때까지 클릭 이벤트가 발생하지 않음을 알 수 있습니다. 버튼 다운 클릭을 시뮬레이션하면 홀수 동작이 발생합니다.

다른 팁

와우, 이것은 힘든 일입니다. TDBGRID에는 일반적인 "OnClick"이벤트 핸들러가 없으며 버튼의 위치로 인해 가짜가 어려워집니다. 내가 생각할 수있는 유일한 것은 자신의 구성 요소를 만드는 것입니다. 처음에는 들릴만큼 어렵지 않습니다. tdbgrid에서 내려와 마우스 업 방법을 무시하십시오. tcustomdbgrid.mouseup이 구현되는 방식을 살펴보십시오. 나는 이것을 테스트하지 않았지만 아마도 다음과 같은 것을 시도 할 수있을 것입니다.

(cell.x >= FIndicatorOffset)

클릭 이벤트를 발사하고 TitleClick (NIL) 또는 셀 <findicatorOffset이면 무언가를 발사하십시오. 그런 다음 이벤트 핸들러를 Grid의 OntitleClick 이벤트에 첨부하여 button1을 호출하십시오. column = nil을 클릭하십시오. (예, 일종의 해킹이지만 더 쉬운 방법을 생각할 수는 없습니다. 내가 당신이라면 이것을 QC에 버그로보고 할 것입니다.)

다음은 Delphi 1과 Delphi 2007에서 성공적으로 시도한 깨끗한 솔루션입니다.

procedure TForm38.FormCreate(Sender: TObject);
begin
   button1.Parent := grid;
   button1.Top := 0;
   button1.Left := 0;
   button1.Width := 12;
   button1.Height := 18;
   button1.OnClick := Button1Click;

   // only add this line
   button1.ControlStyle := button1.ControlStyle + [csClickEvents];

end;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top