在IDE中設計窗體時,可以自由放置和定位非可視組件(例如TMainMenus,TDatamodules)。該位置是持久的,所以在重新加載表單時,這些組件出現在正確的位置。如何訪問非可視化Delphi組件的設計位置?
但是,TComponent沒有頂部或左側的屬性!
那麼,如何將我的代碼訪問非可視化組件的「設計的立場」?
在IDE中設計窗體時,可以自由放置和定位非可視組件(例如TMainMenus,TDatamodules)。該位置是持久的,所以在重新加載表單時,這些組件出現在正確的位置。如何訪問非可視化Delphi組件的設計位置?
但是,TComponent沒有頂部或左側的屬性!
那麼,如何將我的代碼訪問非可視化組件的「設計的立場」?
這可以在運行時訪問,但它是那種一個黑客攻擊。 (主要是因爲它是作爲一種破解實現的)。
Left和Top屬性設置爲字大小值,並且它們中的兩個被打包在一起,稱爲TComponent.FDesignInfo
。您可以使用DesignInfo
屬性獲取其值。看看TComponent.DefineProperties
來看看它是如何使用的。
這就是我需要的破解。謝謝。 – Roddy
謝謝!但我怎樣才能設置這個值?我需要設置一些非可視組件的位置。 – user1580348
而且也:
目的:將圖標放在視覺區域外,在設計時隱藏它。
注意:例如創建直接從TComponent派生的簡單視覺組件時,我記得一個非常簡單的標籤(taht是全部對齊頂部,allways left = 0,top是自動計算的, bla bla bla)只將標題屬性存儲到.dfm文件中;並且任何本地化程序都只會看到該標題屬性。
的解決方案是要覆蓋ReadState
使用如下代碼:
procedure TMyComponent.ReadState(Reader:TReader);
var
NewDesignInfo:LongRec;
begin
inherited ReadState(Reader);
NewDesignInfo.Hi:=Word(-100); // Hide design-time icon (top position = -100)
NewDesignInfo.Lo:=Word(-100); // Hide design-time icon (left position = -100)
DesignInfo:=Longint(NewDesignInfo); // Set the design-icon position out of visual area
end;
希望幫助別人!
@David,當然IDE只是「運行時代碼」,當然?我並不期待它很容易,但它是可能的。 – Roddy
對於左側現在的位置嘗試'LongRec(YourComponent.DesignInfo).Lo'和頂部使用'LongRec(YourComponent.DesignInfo).Hi' – RRUZ
什麼是你能夠訪問運行時代碼的左邊和頂部無屬性的好處可視化組件? –