标签: tform

如何在使用ScaleBy()后将delphi TForm重置为原始外观

我希望允许用户调整表单的大小,并按比例调整其控件的大小.ScaleBy(N,M)对我来说很好,但如果重复,当然会出现累积舍入错误.为了解决这个问题,我只希望在ScaleBy()之前调用以默认外观和大小重新创建表单,然后使用各种值调用ScaleBy.我知道我可以通过在一个面板中托管我的表单(并处理/重新创建它)来做到这一点但是有一个调用会在使用ScaleBy()之后重置表单吗?

编辑 - 我正在使用Delphi XE2,也会对任何人使用组件或其他代码(付费或免费)成功地扩展表单感兴趣 - 我自己的下载还没有产生可行的解决方案.

delphi resize scale tform delphi-xe2

8
推荐指数
1
解决办法
5851
查看次数

如何从表单外部捕获表单的某些事件?

我正在研究需要监控多种形式的东西.从表单外部,并且不在表单中放置任何代码,我需要以某种方式从这些表单中捕获事件,最有可能以Windows消息的形式.但是你如何捕获与它相关的类外的Windows消息呢?

我的项目有一个对象,它包装它正在监视的每个表单,我认为这个处理将进入这个对象.基本上,当我创建一个我想要监视的表单时,我创建了一个相应的对象,该对象又被添加到所有已创建表单的列表中.最重要的是,当该表单关闭时,我必须知道所以我可以从列表中删除此表单的包装器对象.

这些活动包括:

  • 最小化
  • 最大化
  • 恢复
  • 聚焦进/出

我不想要的:

  • 此处理的任何表单或表单单元内的任何代码
  • 从任何自定义基本表单继承表单
  • 使用表单的事件,例如OnClose因为它们将用于其他目的

我想要的是:

  • 处理这些事件的Windows消息
  • 有关如何从课外获取Windows消息的任何提示
  • 我需要监听哪些Windows消息

问题用相同的信息重写,但方法不同

delphi delphi-7 tform windows-messages

7
推荐指数
2
解决办法
5218
查看次数

其尺寸大于屏幕尺寸的表单的屏幕截图

我有一个TForm对象,其高度大于我的屏幕所需的垂直分辨率.

出于某种原因,Windows不允许表单的可见(客户端?)区域超出屏幕分辨率,因此垂直滚动条出现在我的表单上.

我如何获得TBitmap图像或整个表单的屏幕截图(没有滚动条,所有表单组件都可见),以便表单的所有内容都可见?

windows delphi screenshot tform delphi-2010

7
推荐指数
1
解决办法
227
查看次数

设置Panel1.Constraints.MinHeight时,TSplitter上不需要的表单大小会增加

我有这种情况(见图),现在当我Splitter1在运行时向上移动,Panel2身高增长,身高也Form1增长.

但是我需要知道并阻止这种类型的事件,当Splitter1由于Panel1.Constraints.MinHeight到达而无法向上移动时,所以Panel2不能改变它的高度Form1.

谢谢你的帮助.

预习

- 编辑 -
Panel1.Align:= alLeft;
Splitter1.Align:= alBottom;
Panel2.Align:= alBottom;

delphi height splitter tform

7
推荐指数
1
解决办法
1155
查看次数

Delphi 7 - 处理表单中嵌入式帧的MouseWheel事件?

嗨,我有一个内部有几个框架的表格.

对于某些帧,我希望滚动内容(或至少处理鼠标轮事件).

我尝试过以下方法:

只需为每个帧分配一个OnMouseWheel事件处理程序

覆盖父窗体的MouseWheel事件:

procedure TFmReview.MouseWheelHandler(var Message: TMessage);
var   Control: TControl;
begin
    Control := ControlAtPos(ScreenToClient(SmallPointToPoint(TWMMouseWheel(Message).Pos)), False, True);
    if Assigned(Control) and (Control <> ActiveControl) then
    begin
         ShowMessage(Control.Name);
         Message.Result := Control.Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam);
         if Message.Result = 0 then
            Control.DefaultHandler(Message);
     end else inherited MouseWheelHandler(Message);
end;
Run Code Online (Sandbox Code Playgroud)

不幸的是,两者似乎都没有用.

  • 在情况1中,事件永远不会被触发,但是父表单鼠标轮处理程序被触发.
  • 在情况2中,接收焦点的控件是保持我希望发送鼠标轮事件的帧的面板.

因此,简单地说,如何将鼠标滚轮事件指向鼠标光标所在的最顶层控件(无论光标位于哪个帧/父/窗体等)?

delphi focus mousewheel tframe tform

6
推荐指数
1
解决办法
3046
查看次数

是否可以在没有*.dfm和*.pas文件的情况下动态创建表单?

是否可以创建和显示TForm而无需源文件?我想在运行时创建我的表单,并且空的*.dfm和*.pas文件对我来说似乎没用.

谢谢

delphi dynamic createinstance tform delphi-xe2

6
推荐指数
1
解决办法
4440
查看次数

Delphi在加载时禁用表单

在我的应用程序中,我有一个主窗体,能够在数据库中加载一些图像.在加载图像时,我想显示一个带有进度指示器的表单(带有bsNone边框样式).

但是,如果我使用ShowModal显示表单,主表单的执行会停止,所以我不能这样做.

如果我调用Show,则用户可以访问所有其他表单组件,这可能很危险,而照片未完全加载.

我需要得到方法,禁用主窗体上的所有内容,而加载没有完成.

请告诉我,这是怎么可能的.

delphi tform

6
推荐指数
2
解决办法
5880
查看次数

当没有更多的引用时,接口实现形式是否会自行释放?

如果我在一个表单上实现一个接口,TMyForm = class(TForm, IMyInterface)当没有更多的接口引用时,该对象是否会自行释放?似乎没有,虽然我无法弄清楚如何计算TForm(如果有的话).当接口引用超出范围时,我担心表单被释放,但这似乎不会发生.

我想这个问题有两个部分,首先是一个表单是否可能意外释放(真正的问题),其次是表单是如何计算引用的.

delphi interface tform

6
推荐指数
1
解决办法
940
查看次数

为什么TForm.SetBounds仅在设计时将TForm.Position设置为poDefault时才能正常工作

我注意到一些非常奇怪的事情.我在表单关闭时保持表单的top,left,width和height属性,并使用此信息通过使用以前存储的信息调用SetBounds再次打开表单时恢复表单的最后位置.这很有效,但前提是表单的Position属性在设计时设置为poDefault.如果设置为其他内容,例如poDesigned,poScreenCenter或poMainFormCenter,则SetBounds不会恢复表单的先前位置和大小.

这是奇怪的部分.看似重要的是在设计时将Position属性设置为什么.我可以在运行时将此属性的值更改为poDefault,并且对SetBounds的调用仍然无法正常工作.我尝试过类似下面的内容

if Self.Position <> poDefault then
  Self.Position := poDefault;
Run Code Online (Sandbox Code Playgroud)

在表单的OnCreate事件处理程序中,以及从重写的构造函数(并在构造函数中将Position设置为poDefault,并在OnCreate事件处理程序中调用SetBounds).在所有情况下,在运行时将表单的Position属性更改为poDefault并不能解决我在SetBounds中观察到的问题.我发现的唯一一致模式是SetBounds只有在设计时表单的Position属性为poDefault才能正常工作.

当表单的Position属性在设计时未设置为poDefault时,还有其他一些我注意到SetBounds的工作原理.例如,如果调用SetBounds,则在设计时将Position属性设置为poScreenCenter的表单不一定会显示在屏幕的中心.但是,它不会出现在由SetBounds定义的左上角位置,也不会出现在调用SetBounds时指定的宽度和高度.但是,让我重复一遍,我在调用SetBounds之前将表单的Position属性设置为poDefault.我甚至在两个操作之间调用了Application.ProcessMessages,但这并没有解决问题.

我已经在Windows 10上运行Delphi 10.1 Berlin进行了广泛的测试.我还在Windows 7上使用Delphi XE6对其进行了测试.结果相同.

如果您有疑问,请创建一个包含四种表单的VCL应用程序.在第一个表单上放置三个按钮,并为每个按钮添加如下OnClick:

 with TForm2.Create(nil) do
 try
   ShowModal;
 finally
   Release;
 end;
Run Code Online (Sandbox Code Playgroud)

构造函数创建TForm2,然后TForm3和TForm4.

在表单2到4的OnCreate上,添加以下代码:

if Self.Position <> poDefault then
  Self.Position := poDefault;
Self.SetBounds(500,500,500,500);
Run Code Online (Sandbox Code Playgroud)

在form2上,将Position设置为poDefault,在form3上将Position设置为poScreenCenter,并在form4上将Position设置为默认值poDefaultPosOnly.只有form2将出现在500,500,宽度为500,高度为500.

有没有人对这个结果有合理的解释?

delphi position tform setbounds

6
推荐指数
1
解决办法
951
查看次数

运算符IS与TFormClass

我有以下情况:

TMyFormClass = class of TMyForm

function IsMyClass(AClass: TFormClass);
begin
  Result := AClass is TMyForm      // Operator not applicable to this operand type
  Result := AClass is TMyFormClass // Operator not applicable to this operand type
end;
Run Code Online (Sandbox Code Playgroud)

这两行都没有建立,错误是运算符不适用于此操作数类型

我该如何比较?

delphi tform delphi-10.3-rio

6
推荐指数
1
解决办法
111
查看次数