delphi 如何手动让控件移动
delphi 怎么手动让控件移动
自动挡的容易 只要让 form 的 Docksize 改为 True 再把 控件的 Dragkind 改成 dock DragMode 改成 dmAutomatic 就可以自动移动了,可是 一不小心把浮动的控件关闭了 就不见了 怎么调出来?
每次浮动的时候都有自动生成的临时小窗口作控件的临时 hostdocksize 有没有什么办法 不让这个小窗口出现呢?
手动档的时候 我处理了 button 的 mousedown 要是 Button 为 mbleft 的时候就 发送 begindrag (False)
还在form 的 dragover 判断要是 Tbutton 的话就 accept := True ; 为什么控件动不起来。 是不是要在dragdrop 里设置他的位移?可是 我dragover 都允许他 移动 放下了啊
大家帮我看看 怎么让手动移动的
------解决方案--------------------
要在MouseMove中写事件,定义位置的时候要用与父控件的相对位置
------解决方案--------------------
Procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
ReleaseCapture;
BitBtn1.perform(WM_SysCommand, $F012, 0);
End;
------解决方案--------------------
mousedown
mousemove
mouseup
三个事件里都需要写代码
计算鼠标位置,然后设置组件的left和top
自动挡的容易 只要让 form 的 Docksize 改为 True 再把 控件的 Dragkind 改成 dock DragMode 改成 dmAutomatic 就可以自动移动了,可是 一不小心把浮动的控件关闭了 就不见了 怎么调出来?
每次浮动的时候都有自动生成的临时小窗口作控件的临时 hostdocksize 有没有什么办法 不让这个小窗口出现呢?
手动档的时候 我处理了 button 的 mousedown 要是 Button 为 mbleft 的时候就 发送 begindrag (False)
还在form 的 dragover 判断要是 Tbutton 的话就 accept := True ; 为什么控件动不起来。 是不是要在dragdrop 里设置他的位移?可是 我dragover 都允许他 移动 放下了啊
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure FormDragDrop(Sender, Source: TObject; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DockSite := True; // 初始化 form1 让他接受控件移动
// 改 button1 控件为手动档
Button1.DragKind := dkDrag;
Button1.DragMode := dmManual;
end;
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbleft then
Button1.BeginDrag(False); //要是左键拖动的话 就移动
end;
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if Source is TButton then
begin
Accept := True; // 要是 拖动的类型是 TButton 的话就允许
end; // 我这里允许了 还需要用 enddrag 吗
end;
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
// 这里是不是要处理移动? 还是他自己会动
//这样他才动,可是我认为应该不用自己来设置吧
//dragover 的 accept 都允许了 他就会进这里来啊
// if Source is TButton then
// begin
// Button1.Left := x;
// Button1.Top := y;
// end;
end;
end.
大家帮我看看 怎么让手动移动的
------解决方案--------------------
要在MouseMove中写事件,定义位置的时候要用与父控件的相对位置
------解决方案--------------------
Procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
ReleaseCapture;
BitBtn1.perform(WM_SysCommand, $F012, 0);
End;
------解决方案--------------------
mousedown
mousemove
mouseup
三个事件里都需要写代码
计算鼠标位置,然后设置组件的left和top