2013-01-25 37 views
1

我也遇到TPanel和TAdvPanel(TMS組件)左鍵單擊的問題。如果我設置DragMode = dmAutomatic,則左鍵單擊不起作用。右鍵單擊作品。使用DragMode時,OnClick和MouseDown不起作用= dmAutomatic

procedure TMain_Form.Panel_Item_01MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
if Button = mbLeft then 
    begin 
    { whatever I type here nothing happen, even showmessage wont popup - no effect} 
    end; 
if Button = mbRight then 
    begin 
    { here code works fine } 
    end; 
end; 

對我來說這似乎很簡單,但... ...找不到如何解決這個問題,並通過左鍵單擊調用過程的方式。夥計們,有什麼想法?

+2

當您調試應用程序,什麼是當你單擊鼠標左鍵的參數「按鈕」的價值? – Stephan

+0

林不知道該如何檢查。不知道:( – Cohen

+1

@BotenAnna:在事件處理程序的第一行設置一個斷點,然後運行程序。當你點擊面板時,觸發斷點(除非你的問題實際上是事件沒有在所有),然後你被帶到調試器,在那裏有許多方法來檢查一個變量的值 –

回答

2

猜猜問題現在已解決。

如果將TPanel組件DragMode設置爲dmAutomatic,它似乎無法觸發OnClick事件。但是,當我將相同的TPanel DragMode設置爲dmManual時,它甚至可以運行OnClick。

即使在手動設置Panel_Item_01.DragMode:= dmManual的情況下,OnMouseEnter幫助也無法解決問題。現在它可以識別鼠標左鍵並保存TPanel DragDrop功能。

下面是完整的代碼:

procedure TMain_Form.Panel_Item_01MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
if Button = mbLeft then 
    begin 
    Panel_Item_01.DragMode := dmManual;  
    { ..rest of code.. } 
    end; 
if Button = mbRight then 
    begin 
    Panel_Item_01.DragMode := dmAutomatic; 
    { ..rest of code.. } 
    end; 
end; 

procedure TMain_Form.Panel_Item_01MouseEnter(Sender: TObject); 
begin 
Panel_Item_01.DragMode := dmManual; 
end; 

procedure TMain_Form.Panel_Item_01MouseLeave(Sender: TObject); 
begin 
Panel_Item_01.DragMode := dmAutomatic; 
end; 
+0

我認爲刪除問題是安全的。它沒有什麼價值。 –

+0

如果你這麼說。沒問題,你可以刪除它。 – Cohen

+0

嗯,我不能。你可以。答案與這個問題完全沒有關係,這是目前形式無法回答的問題。 –

0

有一招這個,如果EQ來「檢查」。帶有DragMode = TDragMode.dmAutomatic的TButton。 簡單地檢查代碼OnMouseLeave在和OnMouseEnter在... 之間的時間間隔:

uses DateUtils; 
var Time1:TDateTime; 

procedure TForm4.Button2MouseLeave(Sender: TObject); 
begin 
    Memo1.Lines.Add('OnMouseLeave'); 
    Time1:=Now; 
end; 

procedure TForm4.Button2MouseEnter(Sender: TObject); 
var 
    A:Integer; 
begin 
    A:=MillisecondsBetween(Time1,Now); 
    Memo1.Lines.Add('OnMouseEnter '+IntToStr(A)); 
end; 

然後看到,隨着點擊TButton的時間距離始終是0另一個事件的結果具有較大的時間距離。

我知道,這是解決這個問題的一個不明確的方法,但有時Embarcadero公司讓我抓狂......