Delphi: как программно настроить визуальное упорядочение компонентов с помощью align = alTop

У меня есть форма с несколькими панелями, каждая из которых имеет Align = alTop, поэтому они аккуратно складываются из верхней части формы.

Однако я хочу динамически изменять порядок появления этих панелей - т.е. перемещать их вверх и вниз. Какой лучший способ сделать это?

Ответ 1

Вы можете легко перенести верхнюю выровненную панель вверх, установив для свойства Верх значение 0. Сделайте это в обратном запрошенном порядке (сначала снизу), и все готово.

Ответ 2

Переместите их так же, как вы перемещаете их во время разработки с помощью мыши. Установите для текущего свойства панели Top значение меньше, чем свойство Top панели, которая должна находиться ниже текущей панели. VCL позаботится обо всем остальном.

Если вам нужно переместить несколько панелей, начните с BeginDeferWindowPos. Откорректируйте все панели в соответствии с любыми координатами, которые вы хотите, с помощью DeferWindowPos, а затем запустите их все с помощью EndDeferWindowPos.

Ответ 3

Я предлагаю создать структуру, в которой вы динамически удаляете/добавляете формы из/в свой родительский элемент управления. В общем, порядок создания/добавления - это визуальный порядок, но из вашего вопроса я понимаю, что вы хотите, чтобы заказ изменился во время жизни приложения, поэтому просто изменить первоначальный порядок создания будет недостаточно.

Чтобы изменить порядок, попробуйте:

  • Скрыть панели
  • Удалите панели из своего родительского элемента управления
  • Добавить панели в свой родительский элемент управления в новом желаемом
  • Показать панели

Ответ 4

Как насчет того, чтобы выровнять верхний выровненный TGridPanel с одним столбцом и n строками вместо этого - переупорядочить панели с верхним выравниванием - это действительно боль.

(Примечание: TGridPanel доступно в Delphi 2007 и выше, если я правильно помню).

Ответ 5

Если вы измените верхнюю часть панели, измените порядок визуальной панели.

Попробуйте это (все панели выровнены altop и с одинаковой высотой):

PANEL0
ПАНЕЛИ1
panel2
панелью3
PANEL4

В OnClick событие всех панелей выполните следующее:

 TPanel(Sender).Top := TPanel(Sender).Top - TPanel(Sender).Height - 2;

Если вы нажмете на панель, она переместится на одну позицию.

Это идея. Измените верхние пиксели X.
В то же время, если вы это сделаете:

   TPanel(Sender).Top := TPanel(Sender).Top - (TPanel(Sender).Height * 2)- 2; 

Панель вверх на 2 позиции.

ДОБАВЛЕН: Если вы используете Drag & Drop, это событие возвращает позицию (X и Y); С исходным положением и конечным положением вы можете рассчитать верхнюю часть wew для панели управления.

Извините, мой плохой английский. рассматривает

Ответ 6

Я использовал следующий код:

procedure Show_Hide (Flag_Show : boolean);
begin
  if Flag_Show then
  begin
    with Panel_1 do begin Align := alTop; Visible := true; end;
    with Panel_2 do begin Align := alTop; Visible := true; end;
    with Panel_3 do begin Align := alTop; Visible := true; end;
    with Panel_4 do begin Align := alTop; Visible := true; end;
  end else
  begin
    with Panel_1 do begin Visible := false; Align := alNone; end;
    with Panel_2 do begin Visible := false; Align := alNone; end;
    with Panel_3 do begin Visible := false; Align := alNone; end;
    with Panel_4 do begin Visible := false; Align := alNone; end;
  end;
end;

согласно моему желанию Panel_1 Panel_2 Panel_3 Panel_4

Ответ 7

Я знаю его старый пост, но в основном помог мне - идея установить верхнее свойство равным нулю. Я не могу использовать идею программно установить позицию, потому что это зависит от пользователя приложения - он может отображать некоторые диаграммы в приложении, а затем все панели (родительские) для teecharts выровнены по горизонтали. Я устанавливаю их верхнее свойство равным 0 в обратном порядке, а затем просто устанавливаю видимое значение true или false в соответствии с пользовательским вводом...

Спасибо.

Ответ 8

panel3.Visible  := True;
panel3.Top      := 0;

panel2.Visible  := True;
panel2.Top      := 0;

panel1.Visible  := True;
panel1.Top      := 0;

Последний будет первым.