Delphi: как программно настроить визуальный порядок компонентов с помощью align = alTop
У меня есть форма с несколькими панелями, каждая из которых имеет Align=alTop, поэтому они складываются красиво сверху формы.
однако я хочу динамически изменить порядок появления этих панелей-i.e, двигайте их вверх и вниз. Как лучше всего это сделать?
7 ответов
вы можете легко переместить верхнюю выровненную панель наверх, установив ее Top свойство 0. Сделайте это в обратном порядке (сначала нижняя панель), и все готово.
переместить их так же, как вы бы переместить их во время разработки с помощью мыши: установите текущую панель Top
собственность на один меньше, чем Top
свойство панели, которую вы хотите быть ниже текущей панели. Об остальном позаботится VCL.
Если вам нужно переместить несколько панелей, начните с BeginDeferWindowPos
. Настройте все панели на любые координаты, которые вы хотите с DeferWindowPos
, а затем заставить их всех двигаться одновременно с EndDeferWindowPos
.
Я предлагаю создать структуру, в которой вы динамически удаляете/добавляете формы из/в их родительский элемент управления. В общем, порядок создания / добавления-это визуальный порядок, но из вашего вопроса я понимаю, что вы хотите, чтобы порядок изменился в течение срока службы приложения, поэтому просто изменить исходный порядок создания будет недостаточно.
чтобы изменить порядок, попробуйте:
- скрыть панели
- снять панели от родителей контроль
- добавить панели для родительского контроля в новом порядке
- показать панели
Как насчет попытки выровненного сверху 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 в соответствии с пользовательским вводом...
спасибо.