【问题标题】:How do you make a TFrame's OnResize event occur when it first appears?如何让 TFrame 的 OnResize 事件在第一次出现时发生?
【发布时间】:2013-12-29 08:33:39
【问题描述】:

我有一个放置在表单上的框架。我希望在表单上放置该框架的多个实例。

它有一个带有 2 列的绘图网格,在 OnResize 事件中,我使第二列扩展到可用空间的末尾。这适用于手动调整窗体大小并将框架对齐设置为 alTop 的情况。但是当表单第一次出现时,即使 FrameResize 被调用,它也没有任何效果。 (虽然当我在它上面设置断点时它确实达到了预期的效果)。

所以,我现在正在做的是从表单 OnShow 处理程序中调用 FrameResize,但这很难看。框架应该能够在没有表单帮助的情况下正确显示。

有什么想法吗?我确实尝试过覆盖 SetParent,但这没有用。使用 Xe2。

TIA 标记

【问题讨论】:

  • 它对我来说效果很好。我在表单上放置了一个带有 align=alNone 的 Frame 和一个带有 alRight 的 Frame。表单首先获得一个WM_SIZE 消息,该消息会在每个TFrame 上引发onResize 事件。他们的TDrawGrids 然后得到调整。一切顺利。您可以发布您的onResize 事件处理程序代码吗?
  • 我创建了一个空框架和一个空表单,并将框架的一个实例添加到表单中。我为调用Beep 的框架实现了OnResize 事件。当我运行该应用程序时,它会在启动时发出哔哔声。我认为我们需要一个 SSCCE。
  • 感谢你们的努力,并教我 SSCCE 首字母缩写词。它可能是特定于版本的错误吗?我正在使用 XE2。既然我已经解决了,我需要继续做其他事情。
  • Mark:这在 XE2 中按预期工作。
  • Bruce:我在 tframe 中设置了 OnResize 事件。当我手动调整它所在的表单的大小并具有所需的效果时,它会被调用。在 Frame 的构造函数中,Align 属性似乎还没有产生效果,我的大小调整依赖于此。因此,即使在构造函数中调用 FormResize 也不正确。但是覆盖 SetBounds 就可以解决问题。

标签: delphi resize delphi-xe2 tframe


【解决方案1】:

我在 Delphi Team B Delphi 成员 Peter Above 的建议下解决了这个问题。

我覆盖了框架的设置边界。它甚至在设置组件变量之前就被调用了,所以它看起来像这样

procedure TfaDupDisplay.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);  // Had to use SetBounds because OnRezise was not working
var grid: TDrawGrid;
begin
  inherited;
  if pnlWebData = nil then
    exit;
  pnlWebData.Width := Width div 2;
  for grid in TArray<TDrawGrid>.Create(grdData, grdDup) do
    grid.ColWidths[1] := grid.Width - grdData.ColWidths[0];
end{ SetBounds};

【讨论】:

    猜你喜欢
    • 2021-04-11
    • 2019-02-08
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多