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

StackOverflow https://stackoverflow.com/questions/1259849

  •  12-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

Как насчет того, чтобы попробовать выравнивание по верху? 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;

Последний будет первым.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top