【问题标题】:Why is my TSplitter in the wrong place?为什么我的 TSplitter 放错地方了?
【发布时间】:2011-03-11 18:37:59
【问题描述】:

我有一个对话框,其布局如下:

---------------------------------------------
|                                           |
| CONFIG AREA                               |
| Align: alTop                              |
--------------------------------------------- <-static boundary
|                                           |
| DISPLAY AREA 1                            |
| Align: alTop                              |
============================================= <-TSplitter Align: alTop
|                                           |
| DISPLAY AREA 2                            |
| align: alClient                           |
--------------------------------------------- <-bottom of dialog

但是,在运行时,拆分器不会出现在显示区 1 和显示区 2 之间,而是显示在配置区和显示区 1 之间,从而导致一些烦人的界面问题。表单的设置相关事件处理程序中没有任何内容可以更改任何这些组件的 Visible 或 Align 属性。有谁知道为什么拆分器没有加载到表单设计器中的位置?

【问题讨论】:

  • 从您所展示的内容来看,它应该可以按预期工作。唯一想到的是约束、边距(如果自动调整大小且边距为真)和拆分器的 MinSize 属性。我最近对表单的意外增长感到各种乐趣,因为拆分器的 MinSize 在错误的时间获得了“荣誉”。我会检查 Splitters MinSize 是默认的,并且小于 Config+Display 的高度并且小于 Display2 的(初始)高度。对约束/边距的类似检查。其他可能性:Explicit Height 让他们肮脏的手指参与其中。
  • 再想一想:@GameCat 的解释可能就是正在发生的事情。如果 dfm 中的顺序未反映屏幕上的顺序,则拆分器可能会出现在您意想不到的地方。

标签: delphi user-interface splitter


【解决方案1】:

(无法复制。)拆分器是棘手的事情。我总是编写代码来定位它们。在这种情况下,我会这样做

procedure Form1Show(Sender: TObject);
begin
  Splitter1.Top := DisplayArea2.Top;
end;

【讨论】:

  • 选择这个而不是 Gamecat 的解决方案是因为在 FormShow 中有明确的代码可以减少将来有人在表单设计器中戳错东西的可能性会以某种方式破坏脆弱的创建顺序他的解决方案依赖于。
  • +1 这种我的东西在代码中总是比设计师更好用
  • 智能移动,在玩 dfm 文件的同时,您可以很容易地在脚上开枪。但有时这是最简单的方法。
【解决方案2】:

过去我也遇到过类似的问题。它们的原因是:

  1. 控制不可见的位置。
  2. 控件创建顺序。

我认为拆分器是在配置区域之后和显示区域1之前创建的。如果你在显示区域 1 之后创建它应该没问题。

【讨论】:

  • +1。这可能会消除对自定义定位代码的需求。
  • +1 这比我在 cmets 中写的更有可能! Dfm 顺序并不总是(几乎永远)与屏幕上的顺序相同。
【解决方案3】:

我过去也遇到过同样的问题。 TSplitter 应该放在两个 TPanel 之间,像这样:

+---------------------------------------------+
|+-------------------------------------------+|
||                                           ||
|| CONFIG AREA                               ||
|| Align: alTop                              ||
|+-------------------------------------------+|
||                                           ||
|| DISPLAY AREA 1                            ||
|| Align: alClient                           ||
|+-------------------------------------------+|
+---------------------------------------------+
=============================================== <-TSplitter Align: alTop
|                                             |
| DISPLAY AREA 2                              |
| align: alClient                             |
----------------------------------------------- <-bottom of dialog

现在配置区域和显示区域 1 应该包含在 Align := alTop 的 TPanel 中,并且配置区域或显示区域 1 应该与 alClient 对齐。

希望对你有帮助

【讨论】:

  • 是的,这也是一个很好的解决方案,但有时可能会觉得有点“矫枉过正”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2018-12-07
  • 2011-02-23
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多