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



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



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

678   8  

8 ответов:

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

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

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

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

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

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

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

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

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

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

PANEL0
PANEL1
PANEL2
PANEL3
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 для 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 в соответствии с пользовательским вводом...

Спасибо.

Comments

  1. Илья Якобсон
    Илья Якобсон 2 года назад
    <p>Вы можете взять высоту родителя на которого добавляете панель и передать его в отступ сверху вашей панели, оставляя align в alTop<br /><br />
    function AddRow__________v1(Sender: TObject; Color: TColor): TPanel;<br />
    var Row: TPanel;<br />
    begin<br />
        IncrementID := IncrementID+1;</p>

    <p>    Row         := TPanel.Create(nil);<br />
        Row.Parent  := TWinControl(Sender);<br />
        Row.Name    := 'Row_'+IntToStr(IncrementID);<br />
        Row.Color   := Color;<br />
        Row.Align   := alTop;<br />
        Row.Top     := TWinControl(Sender).Height;  // Просто передайте Height родителя динамически создаваемумо элементу<br />
    end;<br /><br />
    Тогда вы добьётесь необходимого результата:<br />
    PANEL0<br />
    PANEL1<br />
    PANEL2<br />
    PANEL3<br />
    PANEL4</p>