Topic: координаты компонента
возможно-ли определить координаты компоненты относительно экрана а не формы..
My Visual Database → Russian → координаты компонента
возможно-ли определить координаты компоненты относительно экрана а не формы..
Для этого нужна рекурсивная процедура, которая будет складывать top и left с родительскими. В Дельфи это метод встроен в компоненты, в MVDB придется писать скрипт ))).
Для этого нужна рекурсивная процедура, которая будет складывать top и left с родительскими. В Дельфи это метод встроен в компоненты, в MVDB придется писать скрипт ))).
да я так и делаю, но я хотел написать универсальный скрипт, ведь компонент может находиться не только на самой форме..
к примеру на панели_1 которая находиться на панели_2 которая вообще расположена в еще каком ни будь боксе..
..
сделал так
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;
Да, можно без рекурсии, циклом:
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;
Да, можно без рекурсии, циклом
Спасибо а то я уже успел запутаться в этих вычислениях
все почти готово..
хочу еще реализовать возможность перетаскивания блоков, примерный принцип понимаю (проверять положение мышки и использовать parent)
но я не могу понять как реализовать перемещение блоков внутри контейнера (как их переставлять вверх и вниз)
My Visual Database → Russian → координаты компонента
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi