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

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

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

7 ответов


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


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

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


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

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

  1. скрыть панели
  2. снять панели от родителей контроль
  3. добавить панели для родительского контроля в новом порядке
  4. показать панели

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

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


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

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

PANEL0
ПАНЕЛЬ1
ПАНЕЛЬ2
ГРУППЫ3
PANEL4

At 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 для asign на панель.

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


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

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


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

спасибо.