2014-01-21 46 views
2

我發現自己處於一個棘手的情況,我有一個應用程序具有嵌入表單中的表單,嵌入到表單中,嵌入到表單中...(你有這張照片)。查找表單中嵌入表單的屏幕位置,嵌入到表單中,

我試圖找到其中一種形式(很容易(Self.Width div 2)和(Self.Height div 2),右)的中間。然後,相對於屏幕的位置(這很簡單,以及(Self.Width div 2) + Self.Left(Self.Height div 2) + Self.Top)

的問題是,這種形式被嵌入另一種形式,所以我就 (Self.Width div 2) + Self.Left + Self.Parent.Left(Self.Height div 2) + Self.Top + Self.Parent.Top

的問題是,我我有一個遞歸調用;問題是並非所有對象都是表單,它們是表單,選項卡,面板等的組合。

什麼是優雅如何解決它?

+0

我不認爲我會說出你的問題。如果表格A嵌入表格B中,您爲什麼要將表格A相對於屏幕放置?當然,這隻會造成你將表格A放置在某個隱藏的位置上的風險? –

+0

假設表格A在100,100,表格B在50,50(相對於表格A),因此表格B在150,150,那麼可以說表格C在0,100和200,600的大小。所以C格式的絕對位置是150,250,這個格式的中心位置是250,550。它更有意義嗎?對不起,我應該把之前的例子。 – Icaro

+0

啊,現在我明白了。我錯過了想要找到**表格的位置。我冒昧地對標題進行了消歧(連同其他小修改)。當你在你自己的代碼中實現這個功能時,我強烈建議你在適當的動詞前面加上前綴,比如'Find'或'Get'。此外,由於任何控制都可以擁有一個位置,所以您可能想要概括HeartWave提供的解決方案。例如。 'FindCentreAsScreenCoords(AControl:TControl)' –

回答

6

這個怎麼樣:

FUNCTION CenterOfFormAsScreenCoords(F : TForm) : TPoint; 
    BEGIN 
    Result:=F.ClientToScreen(Point(0,0)); 
    Result:=Point(Result.Left+F.Width DIV 2,Result.Top+F.Height DIV 2) 
    END; 

或組合版本,如雷米勒博建議:

FUNCTION CenterOfFormAsScreenCoords(F : TForm) : TPoint; 
    BEGIN 
    Result:=F.ClientToScreen(Point(F.Width DIV 2,F.Height DIV 2)) 
    END; 

和更廣泛的版本(由克雷格年輕的建議):

FUNCTION GetCenterOfControlAsScreenCoords(C : TControl) : TPoint; 
    BEGIN 
    Result:=C.ClientToScreen(Point(C.Width DIV 2,C.Height DIV 2)) 
    END; 

或作爲CLASS HELPER:

TYPE 
    TControlHelper = CLASS HELPER FOR TControl 
        FUNCTION CenterAsScreenCoords : TPoint; 
        END; 

FUNCTION TControlHelper.CenterAsScreenCoords : TPoint; 
    BEGIN 
    Result:=ClientToScreen(Point(Width DIV 2,Height DIV 2)) 
    END; 
+3

您可以通過將窗體的中心座標直接傳遞給'ClientToScreen()':Result:= F.ClientToScreen(Point(F.Width div 2,F.Height div 2)) ;' –

+0

你是對的。替代版本增加了... – HeartWare

+0

這很好,謝謝你們。 – Icaro