Невизуальный компонент для группировки элементов управления, чтобы я мог использовать выравнивание?

#delphi #ali&nment #&roupin& #flicker #delphi-10.3-rio

#delphi #выравнивание #группировка #мерцание #delphi-10.3-rio

Вопрос:

Я даже не знаю, как это выразить… Я хочу выровнять свои элементы управления как по горизонтали, так и по вертикали. У меня есть 3 элемента управления, выровненных по вертикали (верхний, клиентский, нижний), и эту группу я хочу выровнять по горизонтали слева, а другую идентичную группу выровнять справа. Теперь я использую TPanel для группировки этих 3 элементов управления, но это вызывает у меня некоторое мерцание при перекраске элементов управления (сначала панель закрашивается поверх элементов управления, а затем снова элементов управления). Есть ли способ сгруппировать элементы управления с чем-то, что нечего отображать, чтобы я мог просто использовать выравнивание?

Просто поместите эти элементы управления в форму, код не нужен. Или используйте this .dfm. Затем запустите программу и сверните окно. Когда вы восстанавливаете окно, иногда, но не всегда, оно будет мерцать черным фоном, прежде чем элементы управления будут окрашены…

 object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHei&ht = 388
  ClientWidth = 623
  Color = clBtnFace
  DoubleBuffered = True
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Hei&ht = -15
  Font.Name = 'Tahoma'
  Font.Style = []
  Menu = MainMenu1
  OldCreateOrder = False
  Position = poScreenCenter
  PixelsPerInch = 134
  TextHei&ht = 18
  object GroupPanel1: TPanel
    Left = 0
    Top = 0
    Width = 623
    Hei&ht = 388
    Ali&n = alClient
    UseDockMana&er = False
    ParentBack&round = False
    TabOrder = 0
    ExplicitLeft = 232
    ExplicitTop = 200
    ExplicitWidth = 100
    ExplicitHei&ht = 41
    object Splitter1: TSplitter
      Left = 313
      Top = 0
      Hei&ht = 388
      ExplicitLeft = 376
      ExplicitTop = 208
      ExplicitHei&ht = 100
    end
    object LeftPanel: TPanel
      Left = 0
      Top = 0
      Width = 313
      Hei&ht = 388
      Ali&n = alLeft
      UseDockMana&er = False
      ParentBack&round = False
      TabOrder = 0
      ExplicitHei&ht = 464
      object Memo1: TMemo
        Left = 0
        Top = 41
        Width = 313
        Hei&ht = 328
        Ali&n = alClient
        Lines.Strin&s = (
          'Memo1')
        TabOrder = 0
        ExplicitLeft = -3
        ExplicitTop = 42
        ExplicitHei&ht = 343
      end
      object StatusBar1: TStatusBar
        Left = 0
        Top = 369
        Width = 313
        Hei&ht = 19
        Panels = <&&t;
        SimplePanel = True
        SimpleText = 'StatusBar1'
        ExplicitLeft = 112
        ExplicitTop = 368
        ExplicitWidth = 0
      end
      object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 313
        Hei&ht = 41
        Ali&n = alTop
        TabOrder = 2
        ExplicitLeft = 32
        ExplicitTop = 8
        ExplicitWidth = 185
        object Button1: TButton
          Left = 8
          Top = 10
          Width = 75
          Hei&ht = 25
          Caption = 'Button1'
          TabOrder = 0
        end
        object Button2: TButton
          Left = 89
          Top = 10
          Width = 75
          Hei&ht = 25
          Caption = 'Button2'
          TabOrder = 1
        end
        object Button3: TButton
          Left = 170
          Top = 10
          Width = 75
          Hei&ht = 25
          Caption = 'Button3'
          TabOrder = 2
        end
      end
    end
    object Ri&htPanel: TPanel
      Left = 316
      Top = 0
      Width = 307
      Hei&ht = 388
      Ali&n = alClient
      UseDockMana&er = False
      ParentBack&round = False
      TabOrder = 1
      ExplicitLeft = 319
      object Memo2: TMemo
        Left = 0
        Top = 41
        Width = 307
        Hei&ht = 328
        Ali&n = alClient
        Lines.Strin&s = (
          'Memo1')
        TabOrder = 0
        ExplicitTop = 34
        ExplicitHei&ht = 343
      end
      object StatusBar2: TStatusBar
        Left = 0
        Top = 369
        Width = 307
        Hei&ht = 19
        Panels = <&&t;
        SimplePanel = True
        SimpleText = 'StatusBar1'
        ExplicitLeft = 112
        ExplicitTop = 368
        ExplicitWidth = 0
      end
      object Panel2: TPanel
        Left = 0
        Top = 0
        Width = 307
        Hei&ht = 41
        Ali&n = alTop
        TabOrder = 2
        ExplicitTop = 8
        object Button4: TButton
          Left = 8
          Top = 10
          Width = 75
          Hei&ht = 25
          Caption = 'Button1'
          TabOrder = 0
        end
        object Button5: TButton
          Left = 89
          Top = 10
          Width = 75
          Hei&ht = 25
          Caption = 'Button2'
          TabOrder = 1
        end
        object Button6: TButton
          Left = 170
          Top = 10
          Width = 75
          Hei&ht = 25
          Caption = 'Button3'
          TabOrder = 2
        end
      end
    end
  end
  object MainMenu1: TMainMenu
    Left = 528
    Top = 72
    object File1: TMenuItem
      Caption = 'File'
    end
    object View1: TMenuItem
      Caption = 'View'
    end
    object Options1: TMenuItem
      Caption = 'Options'
    end
    object Help1: TMenuItem
      Caption = 'Help'
    end
  end
end
  

Я тестировал на Windows 10 и Delphi 10.3 Rio… В более старых версиях Delphi я не сталкивался с этой проблемой.

Комментарии:

1. Вы используете VCL или FMX?

2. Я использую VCL…

3. Жаль. В FMX вы можете использовать элемент управления TLayout. И если вы используете Delphi 10.2.2 или более позднюю версию, вы можете использовать TStackPanel.

4. Было бы здорово использовать минимальный пример проекта для изучения.

5. В VCL есть TFlowPanel и TGridPanel для визуального выравнивания элементов управления.