如何在没有固定宽度的情况下将控件左对齐和上对齐?

How to align controls left and top without fixed width?

我在 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 一样固定在左侧,顶部,但不固定宽度。我怎样才能做到这一点?

如果防止意外移动是您的目标,我认为有两种解决方案。

使用 Delphi 的 "Lock Controls" 选项

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 中的 "Lock Controls" 选项中发现了一个明显的错误。如果在窗体上启用它,然后关闭并重新打开窗体,控件将不再被锁定。但与此同时,如果您转到 "Edit" 菜单,"Lock Controls" 选项似乎仍然处于启用状态(即使它不是)。我想我记得这个错误 waaaaaay 回到 Delphi 7,但我仍然在 Delphi 10 西雅图看到它。

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

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

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