Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Изменить Z-порядок ваших контролов во время выполнения программы

Delphi , Компоненты и Классы , RTTI

Изменить Z-порядок ваших контролов во время выполнения программы

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  Sometimes you want to change the order of your controls during runtime. 
  Usually you only can send them all the way to the front (Control.BringToFront) or 
  send them all the way back (Control.SendToBack). 

  The following procedure will help you moving a control just one position for or back. 
  This is especially useful when using vector graphis or similar applications. 

  The procedure takes the control to be moved as the first parameter. 
  The direction is the second parameter (True brings the control one step up, 
  False sends it one step back). 

  Internally, this procedure works with SendToBack and BringToFront too, however, 
  it creates an order list first and pushes the other controls as well. 
}

 procedure ChangeControlZOrder(Sender: TObject; MoveUp: Boolean = True);
 var
   I, Curr: Integer;
   Control: TControl;
   List: TList;
 begin
   if Sender is TControl then
   begin
     // only components of type TControl and descendends 
    // work 
    Control := Sender as TControl;
     // has no parent, cannot move ;-) 
    if Control.Parent = nil then
       // quit 
      Exit;
     // determine position in z-order 
    Curr := -1;
     for I := 0 to Pred(Control.Parent.ControlCount) do
       if Control.Parent.Controls[I] = Sender then
       begin
         Curr := I;
         Break;
       end;
     if Curr < 0 then
       // position not found, quit 
      Exit;
     List := TList.Create;
     try
       if MoveUp then
       begin
         for I := Curr + 2 to Pred(Control.Parent.ControlCount) do
           // load other controls in group 
          List.Add(Control.Parent.Controls[I]);
         Control.BringToFront;
         for I := 0 to Pred(List.Count) do
           // move other controls to front, too 
          TControl(List[I]).BringToFront;
       end else begin
         for I := 0 to Curr - 2 do
           // load other controls in group 
          List.Add(Control.Parent.Controls[I]);
         Control.SendToBack;
         for I := Pred(List.Count) downto 0 do
           // move other controls to back, too 
          TControl(List[I]).SendToBack;
       end;
     finally
       List.Free;
     end;
   end;
 end;

Перевод контента на русский язык:

Это процедура Delphi, которая изменяет порядок Z-очереди управления в реальном времени. Процедура принимает два параметра: Sender (управление для перемещения) и MoveUp (логическое значение, указывающее, нужно ли переместить управление на одну позицию вверх или вниз).

Шаг за шагом объясняется, как она работает:

  1. Сначала проверяется, является ли отправителем экземпляром класса TControl или его наследников.
  2. Если у управления нет родителя, процедура сразу выходит из работы.
  3. Определяется текущая позиция управления в порядке Z-очереди, перебирая управлений родительского компонента, пока не будет найдено отправитель.
  4. Если отправитель не был найден, процедура выходит из работы.
  5. Создается TList, чтобы хранить другие управления в том же группе, что и отправитель.
  6. Если MoveUp истинно, процедура выполняет следующие действия:
  7. Загружает все управления после отправителя в список.
  8. Возвращает отправитель на передний план с помощью BringToFront.
  9. Перемещает каждый элемент списка на передний план с помощью BringToFront.
  10. Если MoveDown ложно, процедура выполняет противоположные действия:
  11. Загружает все управления до отправителя в список.
  12. Отправляет отправитель на задний план с помощью SendToBack.
  13. Перемещает каждый элемент списка на задний план с помощью SendToBack.

Использование TList позволяет эффективно управлять другими управлениями в той же группе, а блок try-finally обеспечивает освобождение списка, независимо от того, была выброшена ошибка или нет.

Вот альтернативное решение, которое достигает identical результата без использования TList:

procedure ChangeControlZOrder(Sender: TObject; MoveUp: Boolean);
var
  I: Integer;
begin
  if Sender is TControl then
  begin
    Control := Sender as TControl;
    if Control.Parent = nil then
      Exit;

    Curr := -1;
    for I := 0 to Pred(Control.Parent.ControlCount) do
      if Control.Parent.Controls[I] = Sender then
      begin
        Curr := I;
        Break;
      end;

    if Curr < 0 then
      Exit;

    if MoveUp then
    begin
      for I := Curr + 2 to Pred(Control.Parent.ControlCount) do
        TControl(Control.Parent.Controls[I]).BringToFront;

      Control.BringToFront;
      for I := 0 to Curr - 1 do
        TControl(Control.Parent.Controls[I]).SendToBack;
    end
    else
    begin
      for I := 0 to Curr - 2 do
        TControl(Control.Parent.Controls[I]).BringToFront;

      Control.SendToBack;
      for I := Curr + 1 to Pred(Control.Parent.ControlCount) do
        TControl(Control.Parent.Controls[I]).SendToBack;
    end;
  end;
end;

Альтернативное решение использует простой цикл для перемещения других управлений в той же группе, а не загружает их в список. Это может быть более эффективно для больших групп управлений, но может быть менее гибким, если вам нужно выполнить дополнительные операции над элементами списка.

В статье описывается процедура ChangeControlZOrder для изменения порядка контролов в программе во время выполнения, которая позволяет перемещать контролы на один шаг вперед или назад.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: RTTI ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:10:10/0.0036029815673828/0