对于使用Delphi ObjectPascal的Guis,在(可能)更改它之前检查.Visible是否有用?

Jay*_*ton 3 delphi delphi-7

我继承了在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)

是否存在我需要注意的性能问题或外观问题(例如屏幕闪烁)?

Ser*_*lyk 8

正如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代码.


Rem*_*eau 6

与许多属性一样,Visible属性设置器在执行任何操作之前检查新值是否与当前值不同.无需手动检查当前属性值.