我继承了在Delphi RadStudio2007中实现的GUI,针对Windows XP嵌入式.我看到很多代码看起来像这样:
procedure TStatusForm.Status_refresh;
begin
if DataModel.CommStatus = COMM_OK then begin
if CommStatusOKImage.Visible<>True then CommStatusOKImage.Visible:=True;
if CommStatusErrorImage.Visible<>False then CommStatusErrorImage.Visible:=False;
end else begin
if CommStatusOKImage.Visible<>False then CommStatusOKImage.Visible:=False;
if CommStatusErrorImage.Visible<>True then CommStatusErrorImage.Visible:=True;
end;
end
Run Code Online (Sandbox Code Playgroud)
我确实在Embarcadero网站上找到了这个代码示例:
procedure TForm1.ShowPaletteButtonClick(Sender: TObject);
begin
if Form2.Visible = False then Form2.Visible := True;
Form2.BringToFront;
end;
Run Code Online (Sandbox Code Playgroud)
这显示了在更改之前检查Visible,但是没有解释通过首先检查它所提供的内容.
我试图理解为什么原始开发人员觉得有必要只设置Visible标志,如果要更改它,并且不选择以这种方式编码:
procedure TStatusForm.Status_refresh;
begin
CommStatusOKImage.Visible := DataModel.CommStatus = COMM_OK;
CommStatusErrorImage.Visible := not CommStatusOKImage.Visible;
end
Run Code Online (Sandbox Code Playgroud)
是否存在我需要注意的性能问题或外观问题(例如屏幕闪烁)?
正如Remy Lebeau所说,Visible setter已经检查新值是否不同.例如,在XE中,对于TImage,对Visible的赋值实际上会调用继承的代码:
procedure TControl.SetVisible(Value: Boolean);
begin
if FVisible <> Value then
begin
VisibleChanging;
FVisible := Value;
Perform(CM_VISIBLECHANGED, Ord(Value), 0);
RequestAlign;
end;
end;
Run Code Online (Sandbox Code Playgroud)
因此,检查它没有任何好处.但是,您的代码中可能会使用某些第三方或稀有组件 - 但对于它们来说可能会有所不同,但我对此表示怀疑.
您可以自己调查,使用编辑器中的"查找声明"上下文菜单项(或简单地按Ctrl +单击),和/或单击"使用调试dcus"编译器选项打开VCL代码.