Topic: координаты компонента

возможно-ли определить координаты компоненты относительно экрана а не формы..

Re: координаты компонента

Для этого нужна рекурсивная процедура, которая будет складывать top и left с родительскими. В Дельфи это метод встроен в компоненты, в MVDB придется писать скрипт ))).

Визуальное программирование: блог и телеграм-канал.

Re: координаты компонента

k245 wrote:

Для этого нужна рекурсивная процедура, которая будет складывать top и left с родительскими. В Дельфи это метод встроен в компоненты, в MVDB придется писать скрипт ))).

да я так и делаю, но я хотел написать универсальный скрипт, ведь компонент может находиться не только на самой форме..
к примеру на панели_1 которая находиться на панели_2  которая вообще расположена в еще каком ни будь боксе..
..

Re: координаты компонента

сделал так

Repeat

  if ( TdbPanel(TdbPanel(panelGeneral).Parent) is TdbPanel ) then
  begin
    XY := XY-TdbPanel(panelGeneral).Left-frm.Left - TdbPanel(TdbPanel(panelGeneral).Parent).Left-5;
    YY := YY-TdbPanel(panelGeneral).Top-frm.Top-TY - TdbPanel(TdbPanel(panelGeneral).Parent).Top;
    panelGeneral := TdbPanel(panelGeneral).Parent;
    CPName := TdbPanel(panelGeneral).Parent.Name;
  end;
  if ( TdbGroupBox(TdbGroupBox(panelGeneral).Parent) is TdbGroupBox ) then
  begin
    XY := XY-TdbGroupBox(panelGeneral).Left-frm.Left - TdbGroupBox(TdbGroupBox(panelGeneral).Parent).Left-5;
    YY := YY-TdbGroupBox(panelGeneral).Top-frm.Top-TY - TdbGroupBox(TdbGroupBox(panelGeneral).Parent).Top;
    panelGeneral := TdbPanel(panelGeneral).Parent;
    CPName := TdbGroupBox(panelGeneral).Parent.Name;
  end;
  if ( TdbTabSheet(TdbTabSheet(panelGeneral).Parent) is TdbTabSheet ) then
  begin
    XY := XY-TdbTabSheet(panelGeneral).Left-frm.Left - TdbTabSheet(TdbTabSheet(panelGeneral).Parent).Left-5;
    YY := YY-TdbTabSheet(panelGeneral).Top-frm.Top-TY - TdbTabSheet(TdbTabSheet(panelGeneral).Parent).Top;
    panelGeneral := TdbPanel(panelGeneral).Parent;
    CPName := TdbTabSheet(panelGeneral).Parent.Name;
  end;

  until frm.FindComponent(CPName) = nil;

5 (edited by k245 2022-04-08 06:47:25)

Re: координаты компонента

Да, можно без рекурсии, циклом:

procedure ControlScreenPos( Sender:TObject; var X:integer; var Y:integer);
// возвращает экранные координаты компонента
var
  tmpParent: TControl;
begin
  tmpParent := TControl(Sender);
  x := tmpParent.Left;
  y := tmpParent.Top;
  repeat
    tmpParent := TControl( tmpParent.Parent );
    if tmpParent <> nil then
    begin
      x := x + tmpParent.Left;
      y := y + tmpParent.Top;
    end;
  until tmpParent = nil;
end;

Пример использования

procedure Form1_Button2_OnClick (Sender: TObject; var Cancel: boolean);
var
  x,y: integer;
begin
  ControlScreenPos( Sender, X, Y);
  ShowMessage( IntToStr(X)+':'+IntToStr(y)  )
end;

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&amp;item=8551&amp;download=0

Post's attachments

Attachment icon кнопка.png 8.48 kb, 76 downloads since 2022-04-08 

Визуальное программирование: блог и телеграм-канал.

6 (edited by sibprogsistem 2022-04-11 12:06:44)

Re: координаты компонента

k245 wrote:

Да, можно без рекурсии, циклом

Спасибо а то я уже успел запутаться в этих вычислениях
все почти готово..
хочу еще реализовать возможность перетаскивания блоков, примерный принцип понимаю (проверять положение мышки и использовать  parent)
но я не могу понять как реализовать перемещение блоков внутри контейнера (как их переставлять вверх и вниз)
http://pavlenkovv.ru/wp-content/uploads/2022/04/pret.png

Post's attachments

Attachment icon test.zip 13.84 kb, 136 downloads since 2022-04-08