Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 什么时候调用OnResize表单?_Delphi - Fatal编程技术网

Delphi 什么时候调用OnResize表单?

Delphi 什么时候调用OnResize表单?,delphi,Delphi,我在表单OnResize事件中添加了一些代码。但它似乎只在调整大小更大时才调用事件。有没有办法改变这一点 说我有 procedure TForm1.Resize(Sender: TObject); begin RePaint(); end 我希望每次重新调整表单大小(大或小)时都运行“重新绘制”。我想您可以添加一个检查宽度/高度的复选框,但如果要这样做,为什么还要使用事件调整大小?也许除了调整大小之外,还有另一个事件可以同时实现这两个功能? 谢谢 Glen当通过任何方式调整窗体的大小时,都

我在表单OnResize事件中添加了一些代码。但它似乎只在调整大小更大时才调用事件。有没有办法改变这一点

说我有

procedure TForm1.Resize(Sender: TObject);
begin
  RePaint();
end
我希望每次重新调整表单大小(大或小)时都运行“重新绘制”。我想您可以添加一个检查宽度/高度的复选框,但如果要这样做,为什么还要使用事件调整大小?也许除了调整大小之外,还有另一个事件可以同时实现这两个功能? 谢谢
Glen

当通过任何方式调整窗体的大小时,都会触发OnResize事件,尽管它比以前大或小

要证明这一点,请创建一个新项目,在干净的表单上放置一个备忘录,并将此代码添加到OnResize事件中:

procedure TForm1.FormResize(Sender: TObject);
begin
  Memo1.Lines.Add(Format('%d,%d', [Width, Height]));
end;
执行您的项目,并拖动窗体的一个边缘使其变得越来越大,您会注意到它总是被触发,以及事件被触发的次数


还请注意,表单中有一个OnPaint事件,这可能就是您所关注的。

当表单以任何方式调整大小时,都会触发OnResize事件,尽管它比以前大或小

要证明这一点,请创建一个新项目,在干净的表单上放置一个备忘录,并将此代码添加到OnResize事件中:

procedure TForm1.FormResize(Sender: TObject);
begin
  Memo1.Lines.Add(Format('%d,%d', [Width, Height]));
end;
执行您的项目,并拖动窗体的一个边缘使其变得越来越大,您会注意到它总是被触发,以及事件被触发的次数


请注意,表单中有一个OnPaint事件,这可能就是您所关注的内容。

这里有两个问题

首先,当窗体在任意方向上调整大小时,将触发调整大小。句号

第二,当窗体变小时,为什么
重新绘制
不起作用,可能是因为您自己绘制。通常,只需重新绘制画布.Cliprect
。当窗体变小时,显示的区域不会更改,剪裁区域为空。毕竟,没有比以前更多的东西可以画了。当形状在一个方向上变大时,会发生类似的情况:剪裁区域仅由添加到形状表面的部分组成。同样,前面显示的区域保持不变,不会更新。只有当形状在两个方向上展开时,剪裁区域才不能再由单个矩形构成,因此它成为完整的曲面


您的解决方案是,通过调用
Invalidate
(或
Update
,在需要立即重新绘制表单时,通过调用
Invalidate
),通知Windows在任何调整大小时重新绘制表单的全部内容,并在
OnPaint
事件中执行自定义绘制

首先,当窗体在任意方向上调整大小时,将触发调整大小
。句号

第二,当窗体变小时,为什么
重新绘制
不起作用,可能是因为您自己绘制。通常,只需重新绘制画布.Cliprect
。当窗体变小时,显示的区域不会更改,剪裁区域为空。毕竟,没有比以前更多的东西可以画了。当形状在一个方向上变大时,会发生类似的情况:剪裁区域仅由添加到形状表面的部分组成。同样,前面显示的区域保持不变,不会更新。只有当形状在两个方向上展开时,剪裁区域才不能再由单个矩形构成,因此它成为完整的曲面


您的解决方案是,通过调用
Invalidate
(或
Update
,在需要立即重新绘制表单时,通过调用
Invalidate>,向Windows发出信号,在任何调整大小时重新绘制表单的全部内容,并在
OnPaint
事件中执行自定义绘图。

即使将窗体大小调整为较小的大小,也会触发
OnResize
事件。如果使用对齐属性或锚定,则不需要OnResize事件。OnResize并不总是启动(它会启动),但有更巧妙的方法使控件适应窗体大小。这个问题基于一个错误的假设,即只有当窗体变大时才会调整大小。也没有要调试的SSSCE代码。即使将窗体大小调整为较小的大小,也会触发
OnResize
事件。如果使用对齐属性或锚定,则不需要OnResize事件。OnResize并不总是启动(它会启动),但有更巧妙的方法使控件适应窗体大小。这个问题基于一个错误的假设,即只有当窗体变大时才会调整大小。也没有要调试的SSSCE代码。使用;-)更容易@特拉玛,是的,但有了备忘录,您就有了完整的历史记录,并了解事件是如何触发的!:)啊,就是这样,我测试过了,它确实调用了重新调整大小。当我收缩表单时,没有调用ONPaint。思考这个问题做得很好。我想我能理解为什么它不叫它,但我还是希望它叫:迪西尔和;-)@特拉玛,是的,但有了备忘录,您就有了完整的历史记录,并了解事件是如何触发的!:)啊,就是这样,我测试过了,它确实调用了重新调整大小。当我收缩表单时,没有调用ONPaint。思考这个问题做得很好。我想我能理解为什么它不叫它,但我还是希望它叫:D