如何在运行时移动和调整控件大小(在delphi应用程序中)(move and resize controls at run time (in delphi applications))

下面介绍如何在应用程序运行时使用鼠标拖动和调整控件大小(在Delphi窗体上)。...

下面介绍如何在应用程序运行时使用鼠标拖动和调整控件大小(在Delphi窗体上)。

Man at computer

运行时的表单编辑器

在窗体上放置控件(可视组件)后,可以调整其位置、大小和其他设计时特性。但是,在某些情况下,您必须允许应用程序的用户在运行时重新定位表单控件并更改其大小。

要使用鼠标在窗体上启用运行时用户移动和调整控件大小,需要对三个与鼠标相关的事件进行特殊处理:OnMouseDown、OnMouseMove和OnMouseUp。

理论上,假设您希望用户能够在运行时使用鼠标移动(和调整)按钮控件。首先,处理OnMouseDown事件,使用户能够“抓取”按钮。接下来,OnMouseMove事件应该重新定位(移动、拖动)按钮。最后,OnMouseUp应该完成移动操作。

在实践中拖动和调整窗体控件的大小

首先,在表单上放置几个控件。选中复选框以启用或禁用在运行时移动和调整控件大小。

接下来,定义三个过程(在表单声明的接口部分),它们将处理如上所述的鼠标事件:

type TForm1 = class(TForm) ... procedure ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure ControlMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private inReposition : boolean; oldPos : TPoint;

注:需要两个表单级变量来标记控件是否正在移动(inReposition)和存储控件旧位置(oldPos)。

在窗体的OnLoad事件中,将鼠标事件处理过程分配给相应的事件(对于那些您希望可拖动/可调整大小的控件):

procedure TForm1.FormCreate(Sender: TObject); begin Button1.OnMouseDown := ControlMouseDown; Button1.OnMouseMove := ControlMouseMove; Button1.OnMouseUp := ControlMouseUp; Edit1.OnMouseDown := ControlMouseDown; Edit1.OnMouseMove := ControlMouseMove; Edit1.OnMouseUp := ControlMouseUp; Panel1.OnMouseDown := ControlMouseDown; Panel1.OnMouseMove := ControlMouseMove; Panel1.OnMouseUp := ControlMouseUp; Button2.OnMouseDown := ControlMouseDown; Button2.OnMouseMove := ControlMouseMove; Button2.OnMouseUp := ControlMouseUp; end; (*FormCreate*)

注意:上面的代码启用了Button1、Edit1、Panel1和Button2的运行时重新定位。

最后,这里是神奇的代码:

procedure TForm1.ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (chkPositionRunTime.Checked) AND (Sender is TWinControl) then begin inReposition:=True; SetCapture(TWinControl(Sender).Handle); GetCursorPos(oldPos); end; end; (*ControlMouseDown*)

ControlMouseDown简言之:一旦用户在控件上按下鼠标按钮,如果启用了运行时重新定位(选中复选框chkPositionRunTime),并且接收到鼠标按下的控件甚至是从TWinControl派生的,则标记控件重新定位正在进行(inReposition:=True)并确保为控件捕获了所有鼠标处理,以防止处理默认的“单击”事件。

procedure TForm1.ControlMouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer); const minWidth = 20; minHeight = 20; var newPos: TPoint; frmPoint : TPoint; begin if inReposition then begin with TWinControl(Sender) do begin GetCursorPos(newPos); if ssShift in Shift then begin //resize Screen.Cursor := crSizeNWSE; frmPoint := ScreenToClient(Mouse.CursorPos); if frmPoint.X > minWidth then Width := frmPoint.X; if frmPoint.Y > minHeight then Height := frmPoint.Y; end else //move begin Screen.Cursor := crSize; Left := Left - oldPos.X + newPos.X; Top := Top - oldPos.Y + newPos.Y; oldPos := newPos; end; end; end; end; (*ControlMouseMove*)

ControlMouseMove简而言之:更改屏幕光标以反映操作:如果按下Shift键,则允许控件调整大小,或者只需将控件移动到新位置(鼠标移动的位置)。注意:minWidth和minHeight常量提供了一种大小约束(最小控件宽度和高度)。

松开鼠标按钮后,拖动或调整大小即告结束:

procedure TForm1.ControlMouseUp( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if inReposition then begin Screen.Cursor := crDefault; ReleaseCapture; inReposition := False; end; end; (*ControlMouseUp*)

ControlMouseUp简言之:当用户完成移动(或调整控件大小)后,释放鼠标捕获(以启用默认的单击处理)并标记重新定位已完成。

就这样!下载示例应用程序并自己尝试。

注意:在运行时移动控件的另一种方法是使用Delphi的拖放相关属性和方法(DragMode、OnDragDrop、Dragver、BeginDrag等)。拖放可用于让用户将项目从一个控件(如列表框或树视图)拖到另一个控件中。

如何记住控制位置和大小?​

如果允许用户移动表单控件并调整其大小,则必须确保在关闭表单时以某种方式保存控件位置,并且在创建/加载表单时恢复每个控件的位置。下面介绍如何在INI文件中存储窗体上每个控件的Left、Top、Width和Height属性。

8号手柄怎么样?​

当您允许用户在运行时使用鼠标移动Delphi窗体上的控件并调整其大小以完全模拟设计时环境时,您应该向正在调整大小的控件添加八个大小句柄。

  • 发表于 2021-09-10 20:45
  • 阅读 ( 196 )
  • 分类:IT

你可能感兴趣的文章

在旧版本的windows中,多任务是如何实现的?

... running program to switch out; they wait for the running program to yield control (basically, say “I am done” by telling the OS to run the next program that is waiting). Multi-tasking was cooperative, just like in old versi*** of MacOS (though unlike Multi-tasking DOS 4.x, which sported pre-em...

  • 发布于 2021-04-11 10:09
  • 阅读 ( 177 )

从提示框:即时调整窗口大小,包含鼠标光标,了解电池配置

...e a puzzle to solve. 伟大的解决方案史蒂夫!我们见过简单的应用程序,只需将鼠标贴在主显示器上,但这是我们第一次看到一个应用程序支持配置文件和这么多的变量。很好的发现。 了解电池配置 上周,我们分享了一个关于旋转...

  • 发布于 2021-04-12 23:14
  • 阅读 ( 160 )

安装并了解您的新windows、mac或linux计算机

...比一台新机器更好的了。它没有过载的系统托盘、臃肿的应用程序安装和杂乱无章的文件结构,对吗?不幸的是,情况并非总是如此。很多机器都附带了大量的预装软件,这些软件是你没有要求的,当然也不是你想要的。我们的...

  • 发布于 2021-07-28 01:08
  • 阅读 ( 216 )

理解delphi项目和单元源文件

简而言之,Delphi项目只是组成由Delphi创建的应用程序的文件集合。DPR是用于Delphi项目文件格式的文件扩展名,用于存储与项目相关的所有文件。这包括其他Delphi文件类型,如表单文件(DFM)和单元源文件(.PASs)。 由于Delphi...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 175 )

程序退出时delphi中的内存泄漏通知

...更丰富。 “新”内存管理器最出色的功能之一是允许应用程序注册(和注销)预期内存泄漏,并在程序关闭时报告意外内存泄漏。 使用Delphi创建WIN32应用程序时,必须确保释放动态创建的所有对象(内存)。 当程序无法释...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 168 )

如何构建没有gui的控制台应用程序(build console applications with no gui)

​控制台应用程序是纯32位Windows程序,在没有图形界面的情况下运行。启动控制台应用程序时,Windows会创建一个文本模式控制台窗口,用户可以通过该窗口与应用程序进行交互。这些应用程序通常不需要太多的用户输入。控制...

  • 发布于 2021-09-10 22:34
  • 阅读 ( 251 )

在系统托盘中放置delphi应用程序

...其他图标吗?这个地方叫做Windows系统托盘。您想将Delphi应用程序的图标放在那里吗?您希望该图标设置动画还是反映应用程序的状态? 这对于长时间运行而没有用户交互的程序(通常整天都在电脑上运行的后台任务)非常有...

  • 发布于 2021-09-11 00:20
  • 阅读 ( 180 )

优化delphi程序的内存使用

...,最终降低计算机的速度。 02 2006年 何时在delphi应用程序中创建表单 假设您要设计一个包含主窗体和两个附加(模态)窗体的程序。通常,根据您的Delphi版本,Delphi将把表单插入到项目单元(DPR文件)中,并包含一...

  • 发布于 2021-09-15 03:43
  • 阅读 ( 199 )

如何用delphi显示最顶层的系统模式消息框(display a topmost system modal message box with delphi)

对于桌面(Windows)应用程序,一个消息(对话框)用于提醒应用程序的用户需要采取某些操作、某些操作已完成,或者通常是为了引起用户的注意。 在Delphi中,有几种向用户显示消息的方法。您可以使用RTL中提供的任何现成...

  • 发布于 2021-09-15 03:45
  • 阅读 ( 227 )

从delphi代码执行并运行应用程序和文件

...Delphi编程语言提供了一种跨平台编写、编译、打包和部署应用程序的快速方法。尽管Delphi创建了一个图形用户界面,但您肯定会有很多次希望从Delphi代码中执行程序。假设您有一个使用外部备份实用程序的数据库应用程序。备份...

  • 发布于 2021-09-15 03:48
  • 阅读 ( 142 )
影子剪不断
影子剪不断

0 篇文章

相关推荐