如何移动Panel(要求:只能上下移动,不能左右移动)急!在线等待 (50分)

  • 主题发起人 主题发起人 laohe
  • 开始时间 开始时间
L

laohe

Unregistered / Unconfirmed
GUEST, unregistred user!
请高手赐教;
 
屏蔽左右方向键不就行了么
 
是在运行中移动吗?如果是的话,响应Tpanel的OnMouseDown, OnMouseMove, OnMouseUp
判断Tpanel的left坐标,假设left=100,如果left>100或left<100,都将附值left=100,
就可以了
 
To cb422:
如果像你所说的那样做,会有很严重的闪烁问题。

 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
bCanMove: boolean;
iOldX: integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Panel1.Top := y;
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bCanMove := True;
iOldX := y;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bCanMove := false;
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bCanMove := false;
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var i: integer;
begin
if bCanMove then
begin
i := Panel1.Top-iOldx+y;
if i<0 then i:=0;
if i>Self.Height- Panel1.Height then i:= Self.Height - Panel1.Height;
Panel1.Caption := 'Old X:='+IntToStr(Panel1.Top)+' New X:='+IntToStr(i);
Panel1.Top := i;
end;
end;

end.
 
呵呵,不好意思,我做反了,只能左右移不能上下移,呵呵,道理一样嘛
 
xiaoywh:

你的方法可以,但TOP不能超过form,我想制作类似3D max的属性条,

不知能否突破这个限制
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
bCanMove: boolean;
iOldy: integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Panel1.Top := y;
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bCanMove := True;
iOldy := y;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
bCanMove := false;
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bCanMove := false;
end;

//将原来的代码加上如下注释即可解决"但TOP不能超过form"问题
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var i: integer;
begin
if bCanMove then
begin
i := Panel1.Top+y-iOldy;
// if i<0 then i:=0; //限制顶
// if i>Self.Height- Panel1.Height then i:= Self.Height - Panel1.Height; //限制底
Panel1.Caption := 'Old Top:='+IntToStr(Panel1.Top)+' New Top:='+IntToStr(i);
Panel1.Top := i;
end;
end;

end.;
 
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DragMove = $F012; { a magic number }
begin
ReleaseCapture;
panel1.perform(WM_SysCommand, SC_DragMove, 0);
end;
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
822
DelphiTeacher的专栏
D
后退
顶部