【问题标题】:How to align controls left and top without fixed width?如何在没有固定宽度的情况下左右对齐控件?
【发布时间】:2016-08-13 16:32:05
【问题描述】:

我在 ScrollBox 中有 6 个 RichEdit 控件。它们需要从上到下依次左对齐,但我需要宽度不固定,所以当文本长度超过 ScrollBox 宽度时,我可以使用滚动条滚动查看全文。

如果我设置:

RichEdit1.Align := alTop;
RichEdit2.Align := alTop;
RichEdit3.Align := alTop;
RichEdit4.Align := alTop;
RichEdit5.Align := alTop;
RichEdit6.Align := alTop;

它们完美对齐并在设计中保持固定,因此不会意外移动它们,但宽度固定。不好。

如果我手动对齐它们,那么点击它们时它们是不固定的,可以移动,我需要一直重新排列。烦人。

图片显示在所有带有 Align = alTop 且宽度固定为 ScrollBox 宽度的 RichEdits 顶部。 下面的例子是所有 RichEdits 的手动对齐,宽度可以超出 ScrollBox 的宽度,但它们可以在设计中移动:

所以,我想让它们像 alTop 一样固定在左侧,顶部,但不固定宽度。我怎样才能做到这一点?

【问题讨论】:

  • 您可以通过菜单项 Edit - Lock Controls 一旦正确放置组件来防止组件意外移动。
  • 寻找 alTop 对齐的级别,但对宽度不严格。是的,因此它们被锁定在设计中并在运行时保持一致。
  • 使用Align = alTop 将宽度固定到父级。
  • @TomBrunberg 没错!我需要让它们像 alTop 一样对齐顶部和左侧,但不是固定宽度 - RichEdit 的宽度,而不是父级。由于父级是 ScrollBox,它会在 RichEdit 的宽度超出 ScrollBox 的宽度时显示水平滚动条。
  • 是的,我明白了你的目标,但不幸的是没有像alTop 这样的东西,而不是将宽度固定为父级的宽度。正确放置后锁定控件,并考虑到@Jerry 提出的观点,IMO 仍然是您能做的最好的事情。

标签: delphi alignment controls delphi-10.1-berlin


【解决方案1】:

在设计时使用Align = alTop。然后,在运行时(例如,OnCreate of form)设置Align := alNone,并根据需要更改宽度。

【讨论】:

  • 我猜这很聪明。它会像我需要的那样工作。
  • 这当然是我在类似情况下的做法,这就是我重新打开答案的原因。
  • 将需要测试我拥有的 12 个滚动框在 OnCreate 中的更改需要多长时间。我在运行时更改对齐方面没有很好的经验,要么需要一段时间,要么在更改一个控件时,所有其他控件在完成更改过程之前开始四处移动......
  • @MikeTorrettinni 是的,我的经验是它会很慢。请参阅此问题,了解如何模仿 BeginUpdate/EndUpdate stackoverflow.com/questions/6196752/…
  • @JohnEasley 谢谢,如果需要,我会确保参考链接的答案。
【解决方案2】:

如果防止意外移动是您的目标,我看到了两种解决方案。

使用 Delphi 的“锁定控制”选项

Edit > Lock Controls,但这是一个临时解决方案,没有保存,关闭/重新打开时会再次禁用。

在面板内将它们全部对齐

然后将该面板设置为您需要的宽度。但是,这仍然不会阻止您意外移动面板 - 只是编辑控件。即使这样,您仍然可以重新排列对齐的控件 - 如果您不小心将一个控件拖到了其邻居的边缘之外。

这是一个示例 DFM 结构:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 340
  ClientWidth = 392
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object ScrollBox1: TScrollBox
    Left = 24
    Top = 8
    Width = 329
    Height = 281
    TabOrder = 0
    object Panel1: TPanel
      Left = 3
      Top = 3
      Width = 500
      Height = 217
      TabOrder = 0
      object Edit1: TEdit
        Left = 1
        Top = 1
        Width = 498
        Height = 21
        Align = alTop
        TabOrder = 0
        Text = 'Edit1'
        ExplicitLeft = 40
        ExplicitTop = 48
        ExplicitWidth = 121
      end
      object Edit2: TEdit
        Left = 1
        Top = 22
        Width = 498
        Height = 21
        Align = alTop
        TabOrder = 1
        Text = 'Edit2'
        ExplicitLeft = 16
        ExplicitTop = 56
        ExplicitWidth = 121
      end
      object Edit3: TEdit
        Left = 1
        Top = 43
        Width = 498
        Height = 21
        Align = alTop
        TabOrder = 2
        Text = 'Edit3'
        ExplicitLeft = 40
        ExplicitTop = 96
        ExplicitWidth = 121
      end
      object Edit4: TEdit
        Left = 1
        Top = 64
        Width = 498
        Height = 21
        Align = alTop
        TabOrder = 3
        Text = 'Edit4'
        ExplicitLeft = 32
        ExplicitTop = 128
        ExplicitWidth = 121
      end
      object Edit5: TEdit
        Left = 1
        Top = 85
        Width = 498
        Height = 21
        Align = alTop
        TabOrder = 4
        Text = 'Edit5'
        ExplicitLeft = 56
        ExplicitTop = 160
        ExplicitWidth = 121
      end
      object Edit6: TEdit
        Left = 1
        Top = 106
        Width = 498
        Height = 21
        Align = alTop
        TabOrder = 5
        Text = 'Edit6'
        ExplicitLeft = 80
        ExplicitTop = 192
        ExplicitWidth = 121
      end
    end
  end
end

另一方面,这激发了我研究如何在 TControl 级别上实现 LockChildren 布尔属性,启用该属性后,您将无法移动或调整其子控件的大小。


实际上,我刚刚在 Delphi 中发现了一个带有“锁定控件”选项的明显错误。如果在表单上启用它,然后关闭并重新打开表单,控件将不再锁定。但同时,如果您转到“编辑”菜单,“锁定控件”选项会显示为好像它仍然处于启用状态(即使它不是)。我想我记得在 Delphi 7 中这个错误 waaaaaay,但我仍然在 Delphi 10 Seattle 上看到它。

编辑我发现 QC 报告仍然打开:

http://qc.embarcadero.com/wc/qcmain.aspx?d=82764

【讨论】:

  • 这个错误是我不使用锁定控件的原因。当我稍后打开它时,控件的角落仍然显示为锁定(灰点而不是蓝色 - 表示锁定的控件),但我可以移动它们。
  • @Mike 这就是我为您提供另一个解决方案的原因。
  • 不确定该解决方案有何帮助。有时,当我选择它们时,它们会令人讨厌地移动 - 所以,无论它们是哪个父母,它们都会移动,对吧?无论如何都需要重新排列,还是我错过了 Panel 的某些内容?
  • @Mike 我想我错过了你的观点。 “无论如何都需要重新排列” 那有什么问题呢? “有时当我选择它们时它们会令人讨厌地移动”它们不应该,如果它们对齐alTop
  • 啊哈,现在我明白你的意思了:将控件放在 Panel 中并将它们全部对齐到 alTop 并根据需要调整面板大小,超出 ScrollBox 的宽度。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多