?? 在delphi應用程序中拖動控件 (2000年12月26日).txt
字號:
在Delphi應用程序中拖動控件 (2000年12月26日)
本站更新 分類: 作者:徐州 張海峰 推薦: 閱讀次數:455
(http://www.codesky.net)
--------------------------------------------------------------------------------
在應用程序的開發中,常常要將某些控件對象(如標簽)用鼠標選中后進行拖動操作,用以改變控件的位置,
在Delphi中如何實現這一功能呢?筆者想了一個方法:通過在 public 中定義全局變量用以跟蹤 鼠標在移動和
拖動控件時的坐標,然后在拖動結束時將鼠標的坐標值賦給控件的 TOP和LEFT屬性,以達到拖動的目的。
舉例如下:創建一個 Panel,再創建一個Label,通過編程使控件 Lable 可以在 Panel 中被拖放到任意位
置。以下是具體實現過程:
1. 首先做一下準備工作,運行Delphi3.0,進入集成開發環境,在 File 菜單中選擇New Application 。
2. 在Form1中創建對象 Panel1,并在 Panel1 中創建另一對象 Label1。
3. 選中Label1,修改其下列屬性的值:
屬性值:
Caption :標簽移動測試!
Cursor :crHandPoint
DragCursor:crDrag
DragMode :dmAutomatic
4.在程序的開頭部分聲明全局變量 x_panel,y_panel,x_label,y_label,其中,x_panel,y_panel :
鼠標在Panel1上的坐標;x_label,y_label :鼠標在label1上的坐標。
注:這里分別獲取在Panel1和Label1上的坐標是為了更精確地計算出Label1實際的移動距離。
5.在Panel1的OnDragOver 和OnMouseMove 事件中添加如下代碼:
x_panel:=X;
y_panel:=Y;
注:該操作是獲得 mouse 在Panel1上的坐標。
6.在Label1的OnMouseMove 事件中添加如下代碼:
x_Labell:=X;
y_Label1:=Y;
注:該操作是獲得 mouse 在Label1上的坐標。
7.在Label1的OnEndDrag 事件中添加如下代碼:
label1.left :=x_panel-x_label;
label1.top :=y_panel-y_label;
說明:兩者相減是為了求得 label1 實際的移動距離。
8.創建一個對象 Button1 ,并在其 OnClick 事件中添加如下代碼:
close; //用以關閉應用程序。
好了,現在運行程序,測試一下結果。
以下是程序源代碼,在Delphi3.0、Windows95/98中測試通過。
unit test_move;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
x_panel,y_panel,x_label,y_label:integer;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;
procedure FTorm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState;X,Y: Integer);
begin
x_panel:=X;
y_panel:=Y;
end;
procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
x_panel:=X;
y_panel:=Y;
end;
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState;X,Y: Integer);
begin
x_label:=X;
y_label:=Y;
end;
procedure TForm1.Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
label1.left :=x_panel-x_label;
label1.top:=y_panel-y_label;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -