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