Z-Order у TControl

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Z-Order у TControl

Сообщение VirtUX » 11.04.2019 11:45:59

Собственно вопрос: "Как определить положение TControl на его Parent по оси Z?"
Данные:
На "протвине" (TPanel/TForm/TFrame/etc) расположены слоёные пироги в виде стопок TControl.
Пирогов может быть несколько.
Количество слоёв в каждом пироге за рание не известно.
Делать для каждого пирога свой собственный протвинь нельзя.
Вопрос:
Как определить уровень некоторого слоя, в некотором пироге?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 856
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Z-Order у TControl

Сообщение iskander » 11.04.2019 13:43:39

Если контролы в стопке имеют одинаковый размер, то может быть
Код: Выделить всё
function CtrlOrder(aPane: TWinControl; aControl: TControl): Integer;
var
  I: Integer;
  CtrlBounds: TRect;
begin
  CtrlBounds := aControl.BoundsRect;
  Result := -1;
  for I := 0 to aPane.ControlCount - 1 do
    if aPane.Controls[I].BoundsRect = CtrlBounds then
      begin
        Inc(Result);
        if aPane.Controls[I] = aControl then
          exit;
      end;
   Result := -1;
end;
?
iskander
постоялец
 
Сообщения: 166
Зарегистрирован: 08.01.2012 18:43:34

Re: Z-Order у TControl

Сообщение VirtUX » 11.04.2019 14:15:57

Сложность вопроса в том, что aPane.Controls[5] не факт, что выше aPane.Controls[3]; если после размещения контролов на паренте было выполнено - aPane.Controls[3].BringToFront или aPane.Controls[5].SendToBack так как их индексы при этом не меняются, но z-order - меняется.
Вот как парент узнаёт при отрисовке - какой контрол рисовать поверх другого?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 856
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Z-Order у TControl

Сообщение iskander » 11.04.2019 14:33:17

VirtUX писал(а):их индексы при этом не меняются

А вы проверяли?
iskander
постоялец
 
Сообщения: 166
Зарегистрирован: 08.01.2012 18:43:34

Re: Z-Order у TControl

Сообщение VirtUX » 11.04.2019 14:34:18

Да
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 856
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Z-Order у TControl

Сообщение iskander » 11.04.2019 14:51:45

У нас разные Лазарусы?
На PageControl(на TabSheet1) лежит TMemo(mmInfo), на на TabSheet3 - стопка меток.
Обработчик на клик:
Код: Выделить всё
procedure TfrmMain.TabSheet3MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  I: Integer;
  s: string;
begin
  s := '';
  for I := 0 to TabSheet3.ControlCount - 1 do
    s := s + TabSheet3.Controls[I].Name + ', index = ' + I.ToString + sLineBreak;
  mmInfo.Append(s);
  Label1.BringToFront;
  mmInfo.Append('Label1.BringToFront' + sLineBreak);
  s := '';
  for I := 0 to TabSheet3.ControlCount - 1 do
    s := s + TabSheet3.Controls[I].Name + ', index = ' + I.ToString + sLineBreak;
  mmInfo.Append(s);
  Label1.SendToBack;
  mmInfo.Append('Label1.SendToBack' + sLineBreak);
  s := '';
  for I := 0 to TabSheet3.ControlCount - 1 do
    s := s + TabSheet3.Controls[I].Name + ', index = ' + I.ToString + sLineBreak;
  mmInfo.Append(s);
end; 

выхлоп:
Код: Выделить всё
Label1, index = 0
Label2, index = 1
Label3, index = 2
Label4, index = 3
Label5, index = 4
Label6, index = 5
Label7, index = 6

Label1.BringToFront

Label2, index = 0
Label3, index = 1
Label4, index = 2
Label5, index = 3
Label6, index = 4
Label7, index = 5
Label1, index = 6

Label1.SendToBack

Label1, index = 0
Label2, index = 1
Label3, index = 2
Label4, index = 3
Label5, index = 4
Label6, index = 5
Label7, index = 6
iskander
постоялец
 
Сообщения: 166
Зарегистрирован: 08.01.2012 18:43:34

Re: Z-Order у TControl

Сообщение VirtUX » 11.04.2019 15:28:49

Хм...
Код: Выделить всё
  ShowMessage(IntToStr(GContainer4.ComponentIndex));
  GContainer4.SendToBack;
  ShowMessage(IntToStr(GContainer4.ComponentIndex));

ComponentIndex в обоих месаджах = 3.
Получается что: ComponentIndex не равен тому индексу, который у парента на этот контрол?... Тогда для чего используется ComponentIndex?
То есть без прохода по всем котролам парента нам не узнать положение нужного контрола?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 856
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Z-Order у TControl

Сообщение iskander » 11.04.2019 15:40:47

ComponentIndex это индекс компонента в списке компонентов его владельца.
VirtUX писал(а):То есть без прохода по всем котролам парента нам не узнать положение нужного контрола?

Во всяком случае мне не известен лучший способ.
iskander
постоялец
 
Сообщения: 166
Зарегистрирован: 08.01.2012 18:43:34


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: olegy123, Yandex [Bot] и гости: 6

Рейтинг@Mail.ru