使用DragMode = dmAutomatic时,OnClick和MouseDown无法正常工作

时间:2013-01-25 06:37:29

标签: delphi

我在左键单击TPanel和TAdvPanel(TMS组件)时遇到问题。如果我设置DragMode = 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 个答案:

答案 0 :(得分:3)

猜猜问题现在解决了。

如果将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;

答案 1 :(得分:1)

这有一个诀窍,以及#34;检查"如果是eq。 TButton使用DragMode = TDragMode.dmAutomatic。 只需检查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有时让我发狂......