一个Panel的拖动问题,无论用OnMouseDown下面写 BeginDrag还是设置DragMode =dmAutomatic
都不能解决。Mouse的次序好像是MouseDown ,MouseClick,MouseUp的次序,我在MouseDown的时候
就已经激发了我的OnStartDrage,然后再OnClick也被屏蔽了,有没有什么办法,让Click发生在前面
先激发Click ,如果用按住鼠标在Panel上拖动一定的位置后,然后再激发BeginDrag ?
都不能解决。Mouse的次序好像是MouseDown ,MouseClick,MouseUp的次序,我在MouseDown的时候
就已经激发了我的OnStartDrage,然后再OnClick也被屏蔽了,有没有什么办法,让Click发生在前面
先激发Click ,如果用按住鼠标在Panel上拖动一定的位置后,然后再激发BeginDrag ?
解决方案 »
- 新手向大家请教数据库连接的相关问题
- 我在form1上调用form2,且form2.parent := form1 但是form2显示时是灰现,且不能操作。
- 象电子贺卡那样动态的生成EXE文件,并且可以将图片放入文件中,脱离路径访问独立运行?
- 请问delphi 7.0里 报表打印控件TQuickRep TQRlabel 等等怎么没了,
- new boy!!
- 窗体移动为什么和视频播放冲突?
- 怎么做到定时关机
- 我的浏览器坏了,谁帮帮我?
- 挑战大侠,如何动态给TTreeview添加不同的图标?请给出例子,谢谢!
- 哪里有delphi 5.0 + 下载
- 三方透明PANEL控件的使用(在线求助!急呀!!!)
- 一ACCESS数据库查询问题,请高手指教
在MouseDown事件中置M为真,
在MouseMove事件中,如果M为真,就通过改变Panel的Left与Top来移动
在MouseUp中置M为假.
2.mousedown事件判断鼠标位置,规定在某一个区域内激活停靠或托拽功能否则就是click,或者mousedown了一定时间激活停靠或拖拽否则就是click
3.如果开始停靠或托拽,则在最后onenddrag或onstartdrag事件中再禁止停靠或拖拽。
我手上有个方法是用"钩子"来实现,太过麻烦。
2.mousedown事件判断鼠标位置,规定在某一个区域内激活停靠或托拽功能否则就是click,或者mousedown了一定时间激活停靠或拖拽否则就是click
3.如果开始停靠或托拽,则在最后onenddrag或onstartdrag事件中再禁止停靠或拖拽。
procedure TForm1.Image1Click(Sender: TObject);
begin
memo1.Lines.Add('Click');
end;procedure TForm1.Image1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
memo1.Lines.Add('EndDrag');
image1.DragMode := dmManual;
end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
image1.DragMode := dmAutomatic;
end;Image1是被拖运控件,它的DragMode初始设置为dmManual
当MouseDown时记录鼠标的起始位置,在MouseUp时判断是否鼠标还在原位置。如果在原位置,视为Click事件,否则视为拖动事件,处理代码则全部写在MouseUp事件里。
你上办法终非正道,难道没有一个看上去很好的答案?
本来可以CTRL拖动的,但是.....我这不是想知道解决办法嘛。
>>fbysss(独孤求败) (
OnMouseDown -> OnClick->OnMouseUp
>> zxydelphi(xiaoyu)
不是很明白你的意思,可否详细告知?
注意我问题的第一句话:(一个Panel的拖动问题,无论用OnMouseDown下面写 BeginDrag还是设置DragMode =dmAutomatic都不能解决。)
无关 Click->down->up>
就像Windows那样。您Click的时候是选中一个文件夹,然后你点住文件夹,拖动鼠标,表示你要drag
Delphi 中 DragMode =dmAutomatic 则OnClick失效
如果在OnMouseDown中自己激发BeginDrag(False,-1)的形式,效果依然很差。
不知道你明白没有,如果没有明白,你可以建立一个Application试验一下,看看效果就知道了
btw:我在
procedure TForm1.Button1StartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
//
end;
中处理了 拖动半透明阴影的,所以当我click按钮的时候,拖动阴影就出现了。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1Click(Sender: TObject);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
x1,y1: integer;
flag: integer = 0;
implementation{$R *.dfm}procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//memo1.Lines.Append('MouseDown');
x1:= X;
y1:= Y;
flag:= 1;
end;procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//memo1.Lines.Append('MouseUp');
Panel1.Left := Panel1.Left+X-x1;
Panel1.Top := Panel1.Top+Y-y1;
flag:= 0;
end;procedure TForm1.Panel1Click(Sender: TObject);
begin
memo1.Lines.Append('MouseClick');
end;procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
//memo1.Lines.Append('MouseMove');
if flag=1 then
begin
Panel1.Left := Panel1.Left+X-x1;
Panel1.Top := Panel1.Top+Y-y1;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered:= true;
end;end.
和我的要求相差甚远。 你这是一个Panel跟随鼠标位置。我的拖动阴影是通过继承TDragControlObject来实现了。
我的MainForm上动态创建了N个(数据库内的记录数)Frame,Fame上有数个Panel,
panel实现了拖动,这些都没有问题,Panel的Click没法用了。
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Panel1.Perform(WM_SYSCOMMAND,$f012,0);
end;
这个方法用Delphibbs的离线资料一查大把大把
而且该方法和我问题无关
不晚,问题还没有解决啊
上面的回答很少有看清我的题意的,大多数都是来混分的。
简直够呛
可能我业没有明白楼主的意思,我想可不可以这样,
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Panel1.BeginDrag(false,50); //呵呵,把延迟时间设计的长一些
end;
的确是那样,我 Panel1.BeginDrag(false,100)
都试过了,结果一样的,因为我加了拖动阴影效果的处理代码(和Windows拖动那样,跟随鼠标
有一个半透明的选中图标的阴影),所以出现的情况是 : 在 Panel上Click 立刻可以看到一个大大的阴影(如果仅仅使用Delphi默认的拖动效果就不会出现那样的情况),这是我不想出现的效果。
因为不管你延迟多少秒,最后你还是要调用BeginDrag,还是会激发OnStartDrag,而在StartDrag里面我就会绘制那个拖动阴影。所以出现了这个情况,这个是我不想看到的。不过今天我已经解决了这个问题。谢谢各位关注:我用了一个笨办法解决的 Mouse Down 后 peekMessage ,
然后 GetCursorPos,判断光标的位移量,如果 + - 5,才开始BegingDrag,否则不Drag ,其实DelphiBBS上早有人问过类似的问题,如果你试验一下就能看到效果。
var
StartPoint, CurMouse: TPoint;
TheMessage: TMSG;
xInt, yInt: integer;
begin
if Button <> mbLeft then Exit;
GetCursorPos(StartPoint);
while not peekMessage(theMessage, Handle, WM_LBUTTONUP, WM_LBUTTONUP, PM_NOREMOVE) do
begin
GetCursorPos(curMouse);
xInt := CurMouse.X - StartPoint.X;
yInt := CurMouse.y - StartPoint.y;
if ((xInt > 5) or (xInt < -5)) or ((yInt > 5) or (yInt < -5)) then
begin
RzPnlInfo.BeginDrag(False, -1);
Break;
end else Self.IcoBtn.Click; end;
end;
谢谢你Copy 帮助文档给我,我想按F1查询我还是可以的!
谢谢关注
主要是解决拖动阴影,而非Click!故而,不能直接在OnDrag里面Click