控制Delphi的窗口显示位置

Delphi如何支持控件与窗口自适应【摆脱Anchor设定】 如何摆脱Anchor属性做到真正的控件自适应窗口 实现语言:Delphi 理论可以实现语言:C#、VB、易语言等一系列可视化GUI编程的语言。 阅读详情

      在使用Delphi进行工作时,也许需要将多个独立的窗口放在一个主窗口中,但有不打算使用多文档界面(MDI),那么下面介绍的方法可能对你会有所启发。直接控制窗口的产生过程,并指定它的容器对象即Parent属性或ParentWindow 属性。

  使用容器。这个容器是指可以容纳目标窗口的控制元件(WindowsControl),它可以是窗口、面板、页面控制等VCL对象。一个窗口在类别注册后将调用API函数CreateWindow,函数调用时需要传递一个WndParent即父窗口的句柄。Delphi 已将该函数封装在TcustomForm对象的CreateParams过程里面了。原函数的参数也封装在一个TCreateparams的记录类型里面。在IDE里,我们重载它,然后在容器控制的单元中调用即可。假设要将Form2和Form3放在Form1的Panel1中,可以这样做:

Form2单元接口部分

type
TForm2=Class(TForm)
pubic
procedureLoaded;override;
procedureCreateParams
(varParams:TParams);override;
end;

  实现部分

procedureTForm2.Loaded;
begin
inheritedLoaded;
Visible:=Flase;
Position:=poDefault;
BorderIcons:=[];
BorderStyle:=bsNone;
//注意此时的窗口边界样式和图标,
改变这两个值,看看有无其它变化。
HandNeeded;//如果窗口不存在,就生成它。
SetBouds(0,0,Width,Height);
//不改变窗口原来的大小。
end;
procedureTForm2.CreateParams
(varParams:TCreateParams);
begin
inheritedCreateParams(Params);
Params.WndParent:=(OwnerasTForm).Handle;
//指定父窗口的句柄。
Params.Style:=WS_CHILDorWS_CLIPSIBLINGS;
//注意窗口的样式。
params.X:=0;
params.Y:=0;
end;

Form3单元类似于Form2单元。注意理解Loaded方法的重载,以及和Create方法的区别,先后顺序的不同。
假设Form1单元的客户区上面是控制面板Panel1,下方有两个按扭分别控制Form2和Form3的显示。单元如下:

Form1接口部分

type
TForm1=Class(TForm)
Panel1:TPanel;
Form2Button:TButton;
Form3Button:TButton;
procedureFormCreate(Sender:TObject);
procedureFormShow(Sender:TObject);
procedureFormResize(Sender:TObject);
procedureForm2ButtonOnClick(Sender:  ject);
procedureForm3ButtonOnClick(Sender:TObject);
end;

Form1实现部分

//需要引用Form2和Form3单元。

procedureTForm1.FormCreate(Sender:TObject);
begin
Form2:=TForm2.Create(Self);//实际生成窗口。
Form3:=TForm3.Create(Self);
Form2.Show;
Form3.Show;
end;
procedureFormShow(Sender:TObject);
begin
Form2.BringToFront;//将该窗口放置在最上面。
end;
procedureFormResize(Sender:TObject);
begin
MoveWindow(Form2.Handle,Panel1.Left,Panel1.Top,
Panel1.ClientWidth,Panel1.ClientHeight,True);
//跟随着面板的大小和位置。
MoveWindow(Form3.Handle,Panel1.Left,Panel1.Top,
Panel1.ClientWidth,Panel1.ClientHeight,True);
end;
procedureForm2ButtonOnClick(Sender:TObject);
begin
Form2.BringToFront;
end;
procedureForm3ButtonOnClick(Sender:TObject);
begin
Form2.BringToFront;
end;


  这样,Form2和Form3由Form1控制生成,而成为Form1 的两个子窗口。为了达到目标,还应该从项目窗口选项(Project|Options|Forms)中将两个子窗口从自动生成(Auto_Create)列表中移到有效窗口(AvailableForms)列表中。Form1 单元中的关键代码是Form*:=TForm*.Create(Self);


  也许,这种方法有些累赘,那么直接访问TControl 对象的Parent属性或许来得更加简单。同上面一样生成三个窗口,而且将Form2和Form3设定为有效窗口。在按扭的事件句柄中控制Form2和Form3的显示,而且可以不计较Form2和Form3 的边界样式。

procedureTForm1.Button1Click(Sender:TObject);
begin
ifForm2=nilthen
//判断窗口是否已经存在,如果不存在则重新生成它。
begin
Form2:=TForm2.Create(Self);
Form2.Parent:=Panel1;
end;
Form2.WindowState:=wsMaximized;
Form2.Show;
Form2.BringToFront;
end;
procedureTForm1.Button2Click(Sender:TObject);
begin
ifForm3=nilthen
begin
Form3:=TForm3.Create(Self);
Form3.Parent:=Panel1;
end;
Form3.WindowState:=wsMaximized;
Form3.Show;
Form3.BringToFront;
end;


  和前面的方法相比,使用Parent属性来控制子窗口确实容易得多。Delphi还提供了功能强大的镜框方法Dock来镶嵌或抠出子元件如工具条、工具窗等,但需要对这些对象有更加深入的了解。(注:Dock的本意是船坞,但是结合它的具体操作和表现,我认为翻译成镜框可以更好地理解和领会有关操作的意思)
 

 

Delphi窗口分割并动态调节其大小,Splitter使用技巧 1,把窗口分成左右两部分,并且在运行中可以动态调节其相对大小,做法如下:    1.在一个空白的Form中加入Panel1,Align设为alLeft。(也可根据实际情况设为alRight,alBottom或alTop)。    2.在Form1的空白处加入一个Splitter,可以看到它自动处于紧贴Panel1的位置,它的Align属性的缺省值也是alLeft。如果Panel1的Align为al... 阅读详情

相关推荐

delphi 获取有输入焦点的活动窗口信息

dituirenwu的博客 1073

delphi Control ‘‘ has no parent window

delphi Control '' has no parent window

qqww155的专栏 1131

深入理解Windows窗口管理函数

本文将深入探讨Windows API中用于窗口位置控制和状态管理的函数,包括如何恢复最小化窗口、设置窗口显示状态、以及调整窗口的大小和位置。通过实际的Delphi代码示例,我们将了解这些函数的具体用法及其效果。

weixin_31641077的博客 455

delphi中Form窗口显示(缩小、放大、关闭)

点击你想要的设置的Form窗口,打开窗口的属性栏,进行设置

ProGram_Java521的博客 2177

Delphi7中实现悬浮窗口(半透明+拖拽)的实战课程

悬浮窗口是始终位于其他窗口之上的独立界面元素。它允许用户在保持主应用界面不变的情况下,获得额外的信息或进行特定的操作。Delphi是一种由Borland公司开发的集成开发环境,主要采用Object Pascal语言进行软件开发。它从早期的Turbo Pascal和Borland Pascal进化而来,具有一套完整的应用程序框架,名为Visual Component Library(VCL),用于简化图形界面应用程序的开发。除了使用标准的VCL组件,Delphi还允许开发者创建自定义组件。

weixin_42146230的博客 1024

Delphi动态设置窗口在屏幕的位置

摘要:Delphi源码,界面编程,窗口位置 Delphi动态设置窗口在屏幕的位置,你可以在文本框中输入需要显示窗口的左边距、右边距(像素值),不能大于你的屏幕分辨率值,然后窗体就会按照你的设计自动回到指定地方。 运行环境:Windows/Delphi7

Delphi窗体显示位置设置

Win10 MSSQL2014 Delphi XE 10.1 Update初学Delphi,想要打开主窗体时显示在左下角位置,网上没搜到想要的资料,通过摸-索后发现是这样用的,给一样的初学者提供参考: 将窗体的P-osition属性设置为【poDesigned】,然后将拖动右下角的方框来调整位置...

习ぃ践无界う 1283

Delphi实现的QQ窗口抖动

调用windows API接口,用Delphi7实现QQ窗口的抖动 。

将Word嵌入Delphi中

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://bigpower.blog.51cto.com/209892/90287 unit Main;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo

iseekcode的专栏 869

LC滤波器设计实战:从理论计算到PCB布局的完整指南

滤波器是信号处理与电路设计中的基础组件,用于从复杂信号中提取特定频率分量或抑制干扰噪声。其核心原理基于电感(L)和电容(C)等无源元件的频率选择特性,通过特定的网络拓扑实现幅频与相频特性的塑造。在工程实践中,LC滤波器因其结构简单、可靠性高、成本可控,成为射频、模拟及电源电路中的关键技术手段。其设计价值在于将理论网络综合转化为可量产、高性能的硬件解决方案,广泛应用于通信系统、音频处理、电源净化和传感器信号调理等场景。本文聚焦于LC滤波器的工程设计全流程,深入剖析了巴特沃斯、切比雪夫等经典类型的选型权衡,并重

weixin_34194829的博客 273

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

2025数学建模美赛C题完整建模思路——奥运会奖牌榜的模型

Yilu264的博客 1万+

用Delphi 控制窗体的大小

在我们使用的软件中,有些窗口在极大化时只占屏幕的一小部分,那么它是如何实现的呢!请看下面的例子:    1、在FORM私有声明部分加上如下一行程序:    procedure WMGetMaxInfo( var Message:TWMGetMinMaxInfo);message WM_GETMinMAXINFO;    2、在声明部分加上如下几行程序:    procedure TForm

被遗忘的遐想空间 1127

攻防实战之Confluence后利用

这边管理员密码是密文加密在数据库中,解不开,因此解决的思路是将管理员用户密码修改为已知明文密码的密文(这边不能直接在数据库中添加字段,关系型数据库在单表中添加一条字段可能会出现问题),登录上后台以后,添加用户并加入管理员组,最后将管理员密码还原。Confluence的后利用主要问题在于在Linux中搭建时,默认是Confluence用户权限,如下图所示,而confluence在linux中是没有写权限的,这也就是为什么有些人发现可以执行命令但是shell写不进去。至此admin的密码被改为了123123。

weixin_39251927的博客 2716

[delphi]窗口最大化时怎么才能不要把任务栏盖住

====================================================== 注:本文源代码点此下载 ====================================================== [delphi]窗口最大化时怎么才能不要把任务栏盖住 方法一: 设置要 全屏的窗体的align 属性为 alclient ,此法最快。 方法

javazhuanzai的专栏 550

遗传算法详解 附python代码实现

遗传算法 遗传算法是用于解决最优化问题的一种搜索算法。从名字来看,遗传算法借用了生物学里达尔文的进化理论:”适者生存,不适者淘汰“,将该理论以算法的形式表现出来就是遗传算法的过程。 问题引入 上面提到遗传算法是用来解决最优化问题的,下面我将以求二元函数: def F(x, y): return 3*(1-x)**2*np.exp(-(x**2)-(y+1)**2)- 10*(x/5 - x**3......

ha_ha_ha233的博客 22万+

MATLAB实战:手把手教你实现Gardner环路位同步(附完整代码)

本文通过MATLAB实战,详细讲解了Gardner环路位同步算法的原理与实现。内容涵盖插值滤波器、定时误差检测、环路滤波器与数控振荡器等核心模块,并提供完整代码和调试技巧,帮助读者掌握数字通信中关键的符号定时同步技术。

weixin_29048775的博客 175

Delphi中开发使用多显示器的应用程序

top=0,其它显示器的left和top是相对于主显示器的,如主显示器的分辨率为1366×768,另外一个显示器为1440×900,那么这个显示器的left=1366,如果连接多个显示器,那么其中有一个为主显示器,其left=0,所以通过设定mainform的left、top、width、height来让程序在指定显示器上面显示。// 写入ini文件,在程序启动时直接在上次设定的显示器显示。这个方法通过指定显示器号,让程序在指定的显示器上面运行。...

fangyuan621的专栏 1311

金融机构和贷款产品数据抓取:使用Python爬虫技术获取金融机构的贷款产品信息与条件

本文介绍了如何使用Python爬虫技术抓取金融机构的贷款产品信息,包括静态网页抓取和动态网页抓取两种方法。通过requestsSelenium等工具,我们能够轻松抓取银行和消费金融平台上的贷款信息,并存储和分析数据。随着技术的发展,我们还可以扩展爬虫功能,抓取更多的金融机构网站,或者结合自然语言处理技术对贷款产品的评论进行情感分析,为用户提供更多维度的贷款决策支持。

2201_76125261的博客 1733

如何实现窗体跟随另一个程序一起显示,一起隐藏!!

如何实现窗体跟随另一个程序一起显示,一起隐藏!! Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061120120925193.html 编写一个窗口,启动计算器,计算器最小化,则该窗口也最小化,计算器显示,则窗口也显示(在计算器旁),...     就是说,计算器的窗口处于什么状态,该窗口...

weixin_33701251的博客 310

Wsl/InstallDistro/Service/RegisterDistro/CreateVm/HCS/E_INVALIDARG

摘要:安装WSL2时遇到E_INVALIDARG错误(多核CPU问题),可通过创建.wslconfig配置文件解决。配置内容包括:渐进式内存回收、自动代理、模拟虚拟系统调用、限制内存为4GB和处理器核心数为4。需确保已启用虚拟机平台和Linux子系统功能。 (98字)

猿小白的博客 1047

帆软报表导出各种格式之后台导出

我们前面介绍了帆软报表在界面上的导出是通过类似的URL:http://localhost:8075/webroot/decision/view/report?op=export&sessionID=10653244-3e46-408c-bc54-f89a214a9bc7&format=image&extype=PNG 来完成的,就是带OP=export以及format参数来完成的。如果不从界面传参数,比如我们自己实现了一个HTTP接口,也可以通过传参数format来完成各种格式的导

帆软爱好者的专栏 4270

WinAPI: SetWindowOrgEx - 设置窗口坐标原点

相关函数: GetWindowOrgEx、SetViewportOrgEx(设置视口坐标原点)、SetViewportOrgEx 本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...

weixin_30632089的博客 229

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Delphi 使用帮助提示(Hint)制作简单即时的系统帮助

Delphi 使用帮助提示(Hint)制作简单即时的系统帮助                使用Windows应用程序,用户可以把鼠标置于程序的某个部件上,如按钮,工具栏等。鼠标在部件上 停留超过一定时间后,应用程序将会显示一个弹出窗口,里面有部件名称和概述。这种帮助简单即时

xiongmao000738 4908

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

调用EXE在指定区域显示

思路:   首先,需要用CreateProcess或者ShellExecute执行exe程序。     然后,用FindWindow找到该exe程序的窗口句柄。     最后,根据得到的窗口句柄,用SetWindowPos或者MoveWindow控制该窗口的显示位置及大小 一    调用EXE程序的方法: 1.使用system函数 2.使用execl或execv函数 3.使用WinEx...

mangshe0的专栏 671

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Delphi 显示选择目录窗口的四种方式

Windows 下目录选择窗口的几种实现方式

0x0007 的博客 1742
上一篇: “磁性” 窗口
下一篇: C++与Delphi数据类型的比较
Jackalfly
博客等级 码龄17年 96粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值