我有一個包含標簽、按鈕、備忘錄等的面板,我希望在該面板上單獨禁用每個組件(即,Enabled為假)。
我希望單獨禁用組件(而不僅僅是禁用面板本身)以向使用我的程式的人顯示物件存在但無法使用(它們變灰,因為Enabled屬性為假)。
有沒有一種更快的方法可以一次禁用所有這些,而不是將Enabled每個組件的屬性更改為 false?
uj5u.com熱心網友回復:
如果您不希望該選項禁用面板,則另一個選項是使用ControlsCount并Controls[i]回圈訪問面板內的所有組件。
使用這樣的代碼,您可以做到:
procedure TForm3.DisableAll(pnl: TPanel);
var
i:integer;
begin
for i := 0 to (pnl.ControlCount - 1) do
SetPropValue(pnl.Controls[i], 'Enabled', False);
可能有組件不具有該Enabled屬性(例如 a TBevel),在這種情況下會出錯;為此,您可以檢查您運行的每個組件是否具有它 ( GetPropInfo):
for i := 0 to (pnl.ControlCount - 1) do
if Assigned(GetPropInfo(pnl.Controls[i], 'Enabled')) then
SetPropValue(pnl.Controls[i], 'Enabled', False);
原件( panel1 ) 內部還可以有另一個TPanel( panel2 ) 具有更多組件,如圖所示。在這種情況下,此代碼只會禁用第一個和Panel2(而不是panel2內的組件)。如圖所示。TPanel

如果您希望它以遞回方式運行,則需要以遞回方式運行該函式。像這樣的東西:
procedure TForm3.DisableAll(pnl: TPanel);
var
i:integer;
info:PPropInfo;
begin
for i := 0 to (pnl.ControlCount - 1) do
if (pnl.Controls[i] is TPanel) then
DisableAll(TPanel(pnl.Controls[i]))
else
if Assigned(GetPropInfo(pnl.Controls[i], 'Enabled')) then
SetPropValue(pnl.Controls[i], 'Enabled', False);
end;
結果將是這樣的:

uj5u.com熱心網友回復:
有沒有一種更快的方法可以一次禁用所有這些,而不是將
Enabled每個組件的屬性更改為 false?
最快的方法是禁用面板本身,但您排除了這種可能性。所以不行,沒有別的辦法。您必須回圈瀏覽面板的組件并一次禁用它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/509893.html
上一篇:位串轉十六進制值
