我希望允许用户调整表单的大小,并按比例调整其控件的大小.ScaleBy(N,M)对我来说很好,但如果重复,当然会出现累积舍入错误.为了解决这个问题,我只希望在ScaleBy()之前调用以默认外观和大小重新创建表单,然后使用各种值调用ScaleBy.我知道我可以通过在一个面板中托管我的表单(并处理/重新创建它)来做到这一点但是有一个调用会在使用ScaleBy()之后重置表单吗?
编辑 - 我正在使用Delphi XE2,也会对任何人使用组件或其他代码(付费或免费)成功地扩展表单感兴趣 - 我自己的下载还没有产生可行的解决方案.
我正在研究需要监控多种形式的东西.从表单外部,并且不在表单中放置任何代码,我需要以某种方式从这些表单中捕获事件,最有可能以Windows消息的形式.但是你如何捕获与它相关的类外的Windows消息呢?
我的项目有一个对象,它包装它正在监视的每个表单,我认为这个处理将进入这个对象.基本上,当我创建一个我想要监视的表单时,我创建了一个相应的对象,该对象又被添加到所有已创建表单的列表中.最重要的是,当该表单关闭时,我必须知道所以我可以从列表中删除此表单的包装器对象.
这些活动包括:
我不想要的:
OnClose因为它们将用于其他目的我想要的是:
问题用相同的信息重写,但方法不同
我有一个TForm对象,其高度大于我的屏幕所需的垂直分辨率.
出于某种原因,Windows不允许表单的可见(客户端?)区域超出屏幕分辨率,因此垂直滚动条出现在我的表单上.
我如何获得TBitmap图像或整个表单的屏幕截图(没有滚动条,所有表单组件都可见),以便表单的所有内容都可见?
我有这种情况(见图),现在当我Splitter1在运行时向上移动,Panel2身高增长,身高也Form1增长.
但是我需要知道并阻止这种类型的事件,当Splitter1由于Panel1.Constraints.MinHeight到达而无法向上移动时,所以Panel2不能改变它的高度Form1.
谢谢你的帮助.

- 编辑 -
Panel1.Align:= alLeft;
Splitter1.Align:= alBottom;
Panel2.Align:= alBottom;
嗨,我有一个内部有几个框架的表格.
对于某些帧,我希望滚动内容(或至少处理鼠标轮事件).
我尝试过以下方法:
只需为每个帧分配一个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)
不幸的是,两者似乎都没有用.
因此,简单地说,如何将鼠标滚轮事件指向鼠标光标所在的最顶层控件(无论光标位于哪个帧/父/窗体等)?
是否可以创建和显示TForm而无需源文件?我想在运行时创建我的表单,并且空的*.dfm和*.pas文件对我来说似乎没用.
谢谢
在我的应用程序中,我有一个主窗体,能够在数据库中加载一些图像.在加载图像时,我想显示一个带有进度指示器的表单(带有bsNone边框样式).
但是,如果我使用ShowModal显示表单,主表单的执行会停止,所以我不能这样做.
如果我调用Show,则用户可以访问所有其他表单组件,这可能很危险,而照片未完全加载.
我需要得到方法,禁用主窗体上的所有内容,而加载没有完成.
请告诉我,这是怎么可能的.
如果我在一个表单上实现一个接口,TMyForm = class(TForm, IMyInterface)当没有更多的接口引用时,该对象是否会自行释放?似乎没有,虽然我无法弄清楚如何计算TForm(如果有的话).当接口引用超出范围时,我担心表单被释放,但这似乎不会发生.
我想这个问题有两个部分,首先是一个表单是否可能意外释放(真正的问题),其次是表单是如何计算引用的.
我注意到一些非常奇怪的事情.我在表单关闭时保持表单的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.
有没有人对这个结果有合理的解释?
我有以下情况:
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 ×10
tform ×10
delphi-xe2 ×2
delphi-2010 ×1
delphi-7 ×1
dynamic ×1
focus ×1
height ×1
interface ×1
mousewheel ×1
position ×1
resize ×1
scale ×1
screenshot ×1
setbounds ×1
splitter ×1
tframe ×1
windows ×1