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

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

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

Ответы [ 7 ]

28 голосов
/ 11 августа 2009

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

6 голосов
/ 11 августа 2009

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

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

1 голос
/ 05 ноября 2015

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

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

1 голос
/ 11 августа 2009

При изменении верхней части панели порядок визуального изменения панели.

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

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

При OnClick событие все панели делают это:

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

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

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

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

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

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

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

1 голос
/ 11 августа 2009

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

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

1 голос
/ 11 августа 2009

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

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

  1. Скрыть панели
  2. Удалить панели из родительского контроля
  3. Добавьте панели к родительскому элементу управления в новом порядке, который вы хотите
  4. Показать панели
0 голосов
/ 18 декабря 2009

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

Спасибо.

...