2009-04-14 37 views
3

我有一個小按鈕,我想添加到Delphi TDBGrid組件的左上角(在標題/標題單元格中)。我能夠輕鬆地放置按鈕,但現在不處理點擊事件。我猜這個事件正在被電網捕獲。任何方式我可以強制這個特定的事件去按鈕,而不是?注意我仍然需要網格來處理其標題按鈕的點擊事件,就像它當前所做的那樣。如何捕獲以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; 

**更新:**我發現我能夠使用按鈕的MouseDown事件似乎工作正常,但我不能使用單擊事件。

procedure TForm38.Button1MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    if (Button = mbLeft) then 
     TButton(Sender).Click; 
end; 
+0

是否按鈕壓低當鼠標點擊它? – 2009-04-14 16:21:11

+0

當然可以。但點擊事件不會消失。您可以使用調試DCU對其進行測試。在TCustomButton.Click上放置一個斷點,你會發現程序永遠不會被調用。 – 2009-04-14 16:36:12

回答

1

我不知道它爲什麼是吃點擊消息。您實際上通過MouseUp事件處理程序模擬了單擊事件。

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; 

如果你測試一個正常的按鈕,你會發現點擊事件不會發生,直到你釋放鼠標。模擬點擊按鈕會產生奇怪的行爲。

1

哇,這是一個棘手的問題。 TDBGrid沒有通用的「OnClick」事件處理程序,並且按鈕的位置很難僞造它。我能想到的唯一的事情就是創建你自己的組件。這並不像起初聽起來那麼困難。從TDBGrid下降並覆蓋MouseUp方法。看看TCustomDBGrid.MouseUp的實現方式。我沒有測試過這一點,但你也許可以嘗試這樣的事:if語句,它可測試

(cell.x >= FIndicatorOffset) 

和火災關閉點擊事件,有它火TitleClick(無)或東西之後,如果cell.x < FIndicatorOffset。然後將一個事件處理程序添加到調用Button1.Click的網格的OnTitleClick事件中,如果Column = nil。 (是的,是一種黑客,但我想不出一個更簡單的方法來做到這一點,如果我是你,我會把這個報告給QC作爲bug。)

0

下面是一個乾淨的解決方案,用Delphi 1和德爾福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;