我正在尝试在OnPaint事件中启用/禁用控件,但不会反映更改。如果与其他应用程序更改切换反映(使用ALT + TAB)
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 :(得分:1)
OnPaint用于绘画,它不是改变状态的合适时机。这样做最多会引发另一种油漆,或者最坏的情况是它不会。所以要么代码不起作用,要么效率低下。而且,Paint并不是一直被调用的。即使你移动表格,也不能保证它会重新粉刷。因此,作为一个触发器,这是一个非常不可靠的事件。
而是在控件添加到DisableControlList
或从/etc/nginx/sites-available/default
移除时切换控件。更改启用控件应触发重绘,因此您不必担心该部分。
你没有提到它是什么类型的列表,但也许它有一个你可以使用的OnChange事件,或者你可以包装它或继承它来实现切换而不使它成为添加控件的过程的责任到列表。您现在拥有的代码应该在OnChange事件中。
答案 1 :(得分: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