폼이 있습니다..
그위에 Notebook을 놓고 그안에
GroupBox를 놓고 그안에 BitBtn 버튼을 놓았습니다..
문제는 여기에 있습니다..
이 버튼의 실제 Left 값을 계산하려고 합니다..
버튼의 Left 값에다가 GroupBox의 Left 및 Notebook의 Left를 더해줘야
실제로의 버튼의 Left 값이 되는거 잖아요..
그래서.. 이렇게 계산을 하거든요..
(Sender as TBitBtn).Parent.Left + (Sender as TBitBtn). Parent.Parent.Left
+ (Sender as TBitBtn). Parent.Parent.Parent.Left 식으로 계산을 합니다..
문제는 여기에 있습니다..
if (Sender as TBitBtn).HasParent and
((Sender as TBitBtn).Parent.ClassType <> TForm) then
sLeft := sLeft + (Sender as TBitBtn).Parent.Left;
if (Sender as TBitBtn).Parent.HasParent and
((Sender as TBitBtn).Parent.Parent.ClassType <> TForm) then
sLeft := sLeft + (Sender as TBitBtn).Parent.Parent.Left;
if (Sender as TBitBtn).Parent.Parent.HasParent and
((Sender as TBitBtn).Parent.Parent.Parent.ClassType <> TForm) then
sLeft := sLeft + (Sender as TBitBtn).Parent.Parent.Left;
대충 이런식인데.. 분명이 Parent가 TForm인데도 값을 더해서 계산을 합니다..
Parent가 Form인지 아닌지 구분을 달리해야 하는지.. 아니면.. 다른방법이
있는지.. 아시는 분은 답좀해주세요..
그럼 즐프하세요..
var p:TPoint;
p:=Button1.ClientToScreen(Point(0,0));
이렇게 하면 버튼의 실제 화면상의 위치(x,y)가 반환됩니다.
폼에서 버튼의 위치를 구하려면 여기에다 폼의 위치만 빼주면 됩니다.
p.x:=p.x-Form1.left;
p.y:=p.y-Form1.Top;
폼의 클라이언트 좌표를 기준으로 한다면 ClientOrigin을 뺍니다.
p.x:=p.x-Form1.ClientOrigin.X;
p.y:=p.y-Form1.ClientOrigin.Y;