2014-01-31 83 views
0

Delphi控件具有AutoSize屬性,它暴露在例如在TPanel。它根據內容調整面板的寬度/高度。如何解決AutoSize在不可見時被關閉的問題?

顯然,當面板不可見時,它什麼都不做,並且當它被設置爲可見時,它不會重新調整。所以如果我把一些控件放進去然後使其可見,尺寸不會調整。

我可以觸發通過FormShow設置高度爲任意值,調整大小:

procedure TForm1.FormShow(Sender: TObject); 
begin 
    Panel1.Height := Panel1.Height + 1; //triggers auto-resize 
end; 

但我不得不爲它具有自動調整大小在每個控制手動完成。我一定會忘記一些事情。

有沒有更好的方法來解決這個問題,最好是一勞永逸?

回答

0

它一直以來我用delphi的一段時間,但有一件事我記得的是,控制確實發揮了一點智力遊戲在我身上,大部分是因爲渲染引擎並沒有刷新窗體和控件的時間。 如果你有控制設置爲自動調整大小,我會建議檢查,如果form1.refresh或panel1.refresh自從我玩它幾年後(德爾福7)我可能會混淆刷新刷新。其中一些控件具有,其在重新繪製控件之前啓動了尺寸計算。由於delphi控件是開源的,你可以進入適當的pas文件來查找控件並查看刷新/重新繪製以查看是否可以保留自動調整大小。

希望有所幫助。

+0

渲染引擎是系統本身。而且,爲什麼強制重新繪製表格會重新控制?這會花費很多系統資源。 – TLama

3

我不認爲你能做的事情很多。調整大小的更好方法是在顯示面板後立即添加對面板的Realign方法的調用。

您可以掛鉤進入CM_VISIBLECHANGED消息並強制該事件發生,以實現自動調整大小的控件。例如,使用攔截器:

type 
    TPanel = class(Vcl.ExtCtrls.TPanel) 
    protected 
    procedure CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED; 
    end; 

procedure TPanel.CMVisibleChanged(var Message: TMessage); 
begin 
    inherited; 
    if Visible and AutoSize then 
    Realign; 
end; 
相關問題