我正在使用操作管理器,并且我有一些与其中一些操作相关联的按钮。这些按钮的字形会自动从操作管理器的图像列表中分配相应的图像。但是,如果我去更改其中一个此类操作的图像索引,或者以其他方式更改图像列表中的实际图像,则该按钮将保留最初分配给该操作时的原始字形,并且不会更新到新图像。
当我更改动作的图像时,如何确保这些按钮的字形得到更新?
我正在使用操作管理器,并且我有一些与其中一些操作相关联的按钮。这些按钮的字形会自动从操作管理器的图像列表中分配相应的图像。但是,如果我去更改其中一个此类操作的图像索引,或者以其他方式更改图像列表中的实际图像,则该按钮将保留最初分配给该操作时的原始字形,并且不会更新到新图像。
当我更改动作的图像时,如何确保这些按钮的字形得到更新?
这是使用 Delphi 动作的陷阱之一。当您将动作分配给按钮或任何基于字形的控件时,它会复制与该动作对应的图像。对该图像的任何更改都不会反映在按钮的字形中 - 或者其他任何基于字形的控件。
在任何时候对动作的图像进行更改时,都可以运行以下代码,它会强制更新表单上的所有控件,以反映对动作(主要是图像)的任何和所有更改:
procedure UpdateActions(AControl: TWinControl);
var
C: TControl;
X: Integer;
begin
for X := 0 to AControl.ControlCount-1 do begin
C:= AControl.Controls[X];
C.Action:= C.Action; //Forces everything to update
if C is TWinControl then
UpdateActions(TWinControl(C));
end;
end;
你这样称呼它:
UpdateActions(MyForm);
这将简单地递归遍历表单上的所有控件并将每个控件的操作分配回自身,从而触发它使用新图像更新任何基于字形的控件。