【问题标题】:Dynamically resize a form to fit the size of a Frame in Delphi在 Delphi 中动态调整表单大小以适应 Frame 的大小
【发布时间】:2011-07-15 08:54:07
【问题描述】:

我有一个有 5 个不同大小的框架的应用程序。当我从一个框架移动到另一个框架时,我想动态调整主窗体的大小以适应框架。

我可以使用框架的MinHeight/MinWidth 属性来强制主窗体适应框架,但是当移动到较小的框架时,主窗体不会调整它的大小。

有什么想法吗?

--编辑

...
TFormMain = Class(TForm)
...
public
  FrameImportPackage: TFrameImportPackage;
...

procedure TFormMain.MenuPackagesImportClick(Sender: TObject);
begin
  if not (Assigned(FrameImportPackage)) then
    begin
      FrameImportPackage := TFrameImportPackage.Create(Self);
      FrameImportPackage.LabelFrameCaption.Caption := 'Import or Edit a Package';
    end
  else
    begin
      FrameImportPackage.BringToFront;
    end;

  FrameImportPackage.Parent := Self;
end;

--编辑

问候,彼得

【问题讨论】:

  • 当时是否只有一帧可见,您根据用户输入或其他条件更改可见帧?我想说只是在“从一帧移动到另一帧”的事件/方法中将主窗体的大小设置为“当前帧”的大小,即mainForm.Width := currentFrame.Constraints.MinWidth;
  • 您能否编辑您的问题以消除面板(如您的问题标题)和框架之间的混淆。
  • 面板与框架完全无关。行为是一样的。
  • 这是做什么的? SetFrameParent(FrameImportPackage)。为什么不是简单的FrameImportPackage.Parent := Self
  • 那是多余的代码。已删除。

标签: delphi dynamic resize frame


【解决方案1】:

如果我正确理解您的问题,您的框架不会改变大小,您希望表单更新大小以适合您的框架。让 Delphi 为您处理,使用 AutoSize 属性。

为您的表单设置AutoSize = True


我已经使用以下代码测试了AutoSize,使用Delphi 2010

  • 创建一个新的 VCL 应用程序。在空白表单上放置一个面板,让它保留其名称 (Panel1)。确保面板不要太小,因为我们会在运行时编写代码来减小它的大小。
  • 将表单的AutoSize 属性设置为True
  • 在面板上拖放两个按钮,Button1Button2
  • 双击按钮,然后复制粘贴以下事件处理程序:

代码:

procedure TForm31.Button1Click(Sender: TObject);
var NewR: TRect;
begin
  NewR := Panel1.BoundsRect;
  Dec(NewR.Right, 32);
  Dec(NewR.Bottom, 32);

  Button1.Parent := Self;
  Button2.Parent := Self;

  Panel1.Free;
  Panel1 := TPanel.Create(Self);
  Panel1.BoundsRect := NewR;
  Panel1.Parent := Self;

  Button1.Parent := Panel1;
  Button2.Parent := Panel1;
end;

procedure TForm31.Button2Click(Sender: TObject);
begin
  Panel1.Height := Panel1.Height - 32;
  Panel1.Width := Panel1.Width - 32;
end;

这实质上为您提供了两种减小面板大小的方法,以处理两种可能的情况:Button1 释放旧面板并创建一个新的、更小的面板。 Button2 直接调整现有面板的大小。两者都按预期工作!

【讨论】:

  • 我已经做到了,而且效果很好。唯一的问题是当当前帧小于上一帧时它不会收缩。
  • 我刚刚测试过,表单会自动更新它的大小就好了。我将编辑答案,向您展示我用于测试的代码。也许您应该指定您正在使用的 Delphi 版本;甚至可以显示您用来显示和隐藏框架的代码。
  • 我已编辑问题以显示代码,我们使用 Delphi XE。
  • 查看您的代码,在任何给定时间只会有一个框架和一个框架,并且在应用程序的生命周期内不会替换框架。这是AutoSize 的教科书示例,应该可以正常工作。但请确保您没有MinWidthMinHeight 设置任何内容,否则表单显然无法调整大小。
【解决方案2】:

至少在 Delphi 2006 上,Form AutoSize 存在一个真正令人讨厌的 BUG。

您将 TStringGrid 放到表单上(Left 和 Top 等于零,对齐等于 None,Top,CLient 无关紧要),当您更改其 ClientWidth 和 ClientHeightt 时,表单并不总是根据控件调整其大小。

通常当控件大小减小时失败,表单大小不会减小。

没有很好的解决办法,唯一的办法就是在调整对象大小时手动设置表单的clientwidth和clientheight。

据说:Form AutoSize 并不总是很好用!这是VCL上的一个BUG。

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2012-11-22
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多