Дельфи:Как программно настроить визуальный порядок компонентов с помощью align = alTop
Вопрос
У меня есть форма с несколькими панелями, каждая из которых имеет Align=alTop, поэтому они красиво складываются сверху формы.
Однако я хочу динамически менять порядок появления этих панелей, т. е. перемещать их вверх и вниз.Как лучше всего это сделать?
Решение
Вы можете легко переместить панель, выровненную по верху, наверх, установив ее Вершина собственность 0.Сделайте это в обратном порядке (сначала нижняя панель), и все готово.
Другие советы
Перемещайте их так же, как вы перемещали бы их во время разработки с помощью мыши:Установить текущую панель Top
собственности на единицу меньше, чем Top
свойство панели, которую вы хотите разместить под текущей панелью.VCL позаботится обо всем остальном.
Если вам нужно переместить несколько панелей, начните с BeginDeferWindowPos
.Отрегулируйте все панели по любым координатам, которые вы хотите, с помощью DeferWindowPos
, а затем заставить их всех двигаться одновременно с помощью EndDeferWindowPos
.
Я предлагаю создать структуру, в которой вы динамически удаляете/добавляете формы из/в их родительский элемент управления.В общем, порядок создания/добавления — это визуальный порядок, но из вашего вопроса я понимаю, что вы хотите, чтобы порядок менялся в течение жизни приложения, поэтому простого изменения исходного порядка создания будет недостаточно.
Чтобы изменить порядок, попробуйте:
- Скрыть панели
- Удалите панели из родительского контроля.
- Добавьте панели в родительский элемент управления в желаемом порядке.
- Показать панели
Как насчет того, чтобы попробовать выравнивание по верху? TGridPanel
с одним столбцом и н строки вместо этого --- изменение порядка панелей, выровненных по верхнему краю, на самом деле немного затруднительно.
(Примечание: TGridPanel
доступен в Delphi 2007 и более поздних версиях, если я правильно помню).
Если вы измените верхнюю часть панели, порядок визуального изменения панели изменится.
Попробуйте это (все панели выровнены вершина и с той же высотой):
ПАНЕЛЬ0
ПАНЕЛЬ1
ПАНЕЛЬ2
ПАНЕЛЬ3
ПАНЕЛЬ4
В По щелчку событие все панели сделай это:
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);Зная исходное и конечное положение, вы можете рассчитать верхнюю часть строчки для назначения панели.
Извините за мой плохой английский.с уважением
Я использовал следующий код:
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;
Согласно моей панели желаний_1 панель_2 панель_3 панель_4
Я знаю, что это старый пост, но в основном мне помогла идея установить нулевое значение свойства top.Я не могу использовать идею программного задания положения, потому что это зависит от пользователя приложения - он может выбрать отображение некоторых диаграмм в приложении, а затем все панели (родительские) диаграмм будут выровнены по верху.Я установил для их верхнего свойства значение 0 в обратном порядке, а затем просто установил видимое значение true или false в соответствии с вводом пользователя...
Спасибо.
panel3.Visible := True;
panel3.Top := 0;
panel2.Visible := True;
panel2.Top := 0;
panel1.Visible := True;
panel1.Top := 0;
Последний будет первым.