2015-12-30 41 views
0

我想在OnPaint事件中啓用/禁用控件,但更改沒有得到反映。如果與其他應用程序更改撥動得到反映(使用ALT + TAB)禁用/啓用控制onPaint事件,但更改不反映

procedure TfrmBase.FormPaint(Sender: TObject); 
var 
... 
... 
begin 

    flg := False; 
    for i := ComponentCount - 1 downto 0 do 
    begin 
    Temp := Components[i]; 

    if (Temp is TToolButton) then 
    begin 

      (Temp as TToolButton).Enabled := SomeFuncWhichReturnBoolean; 

    end 
    else if (Temp is TButton) then 

      (Temp as TButton).Enabled := SomeFuncWhichReturnBoolean ; 


    end; 


end; 

請建議

+0

好線了所有的操作按鈕,所以現在你加入到新版本的標籤,對於那些間隔也是10兩年的版本。哪一個? – GolezTrol

+0

使用'TActionList',定義一些動作並將動作連接到按鈕。每個動作都有一個「OnExecute」和「OnUpdate」事件 –

+1

繪畫時不要改變狀態。真是個壞主意。 –

回答

1

的OnPaint是畫,它不改變狀態正確的時刻怎麼過。這樣做最多可以觸發另一種油漆,或者在最壞情況下不會。所以無論代碼是行不通的,還是效率不高。而且,Paint並不是一直被調用。即使當你移動表格時,也不能保證它會被重新粉刷。所以,作爲一個觸發器,這是一個非常不可靠的事件。

取而代之,將控件添加到DisableControlList或從中刪除時切換控件。更改已啓用的控件應該會觸發重繪,所以您不必擔心該部分。

你沒有提及這是一個什麼樣的列表,但它可能有一個OnChange事件可以使用,或者你可以包裝它或從它繼承來實現切換,而不必使它成爲添加控制到列表。你現在的代碼應該在OnChange事件中。

+0

謝謝,請提出任何事件,如果任何控制狀態變化的GUI中的任何更改被調用。 TForm沒有OnChange –

+0

Application.OnIdle,但請不要使用它。你這樣做是錯的。 – GolezTrol

+0

其實我必須禁用我的應用程序中的所有按鈕。我有一個基類,通過它可以派生出應用程序中的所有表單。我想做什麼 - 禁用基本形式方法中的所有按鈕(該方法已經在所有的chaild形式中被調用...主要是構造函數)。如果我能夠實現這一點,那麼我將只需要在基礎類的一個地方進行更改。我試圖解釋情況,希望我能夠解釋它。請建議,也請讓我知道,如果我的方法不正確 –

1

一般來說,有時間來改變狀態,並有時間來描繪當前狀態。不要混淆。

每個按鈕代表按下按鈕時會發生的操作,此操作可能允許或不允許。

德爾福有一個TActionList您可以在其中管理操作。每個動作都有一個OnExecute(應該發生什麼)和一個OnUpdate事件。此OnUpdate事件是啓用或禁用該操作的理想場所。

procedure TFoo.BarActionExecute(Sender:TObject); 
begin 
    DoBarAction(); 
end; 

procedure TFoo.BarActionUpdate(Sedner:TObject); 
begin 
    (Sender as TAction).Enabled := CanDoBarAction(); 
end; 

只需從TActionList