2015-12-30 2 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. Изменение Enabled элемента управления должно вызывать перерисовку, поэтому вам не нужно беспокоиться об этой части.

Вы не указали, что это за список, но, возможно, у него есть событие OnChange, которое вы можете использовать, или вы можете обернуть его или наследовать от него, чтобы реализовать переключатель, не возлагая на него ответственность за процедуру, которая добавила управление списком. Код, который у вас есть, должен быть в этом событии OnChange.

+0

Спасибо, пожалуйста, предложите любое событие, которое вызывается, если какое-либо изменение в графическом интерфейсе, как любое изменение состояния управления. TForm не имеет OnChange –

+0

Application.OnIdle, но, пожалуйста, не используйте это. Ты делаешь это неправильно. – GolezTrol

+0

На самом деле мне нужно отключить все кнопки в приложении. У меня есть базовый класс, по которому производятся все формы в приложениях. То, что я хотел сделать, - отключить все кнопки в методе базовой формы (этот метод уже вызван во всех chaild-формах ... в основном, для контрструктур). если я смогу добиться этого, тогда мне придется делать изменения только в одном месте, которое является базовым классом. Я попытался объяснить сценарий, надеюсь, что смог объяснить это. Пожалуйста, дайте мне знать, если мой подход не правильный –

1

Вообще говоря, есть время, чтобы изменить состояния, и есть время, чтобы нарисовать текущие состояния. Не смешивайте их.

Каждая кнопка представляет собой действие, которое произойдет, когда вы нажмете кнопку, и это действие возможно разрешено или нет.

В Delphi есть 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