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