Для Guis, использующего Delphi ObjectPascal, служит ли проверка .Visible перед (потенциально) изменением его какой-либо полезной цели? - PullRequest
3 голосов
/ 22 сентября 2011

Я унаследовал графический интерфейс, реализованный в Delphi RadStudio2007, предназначенный для встроенной 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

Я нашел этот пример кода на сайте Embarcadero :

procedure TForm1.ShowPaletteButtonClick(Sender: TObject);
begin
    if Form2.Visible = False then Form2.Visible := True;
    Form2.BringToFront;
end; 

Это показываетпроверка Visible перед его изменением, но нет объяснения того, что обслуживается, сначала проверяя его.

Я пытаюсь понять, почему первоначальный разработчик считал, что необходимо установить флаг Visible, только если он былчтобы изменить его, и вместо этого он решил не кодировать его следующим образом:

procedure TStatusForm.Status_refresh;

begin
    CommStatusOKImage.Visible := DataModel.CommStatus = COMM_OK;
    CommStatusErrorImage.Visible := not  CommStatusOKImage.Visible;
end

Есть ли какие-либо проблемы с производительностью или косметические проблемы (например, мерцание экрана), о которых мне нужно знать?

Ответы [ 3 ]

8 голосов
/ 22 сентября 2011

Как сказал Реми Лебо, 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;

Таким образом, его проверка не дает никаких преимуществ.Однако, возможно, там в вашем коде используются какие-то сторонние или редкие компоненты - для них все могут отличаться, хотя, я сомневаюсь.

Вы можете исследовать это самостоятельно, используя пункт контекстного меню «Найти объявление»в редакторе (или просто Ctrl + щелчок) и / или вход в код VCL с включенной опцией компилятора «Использовать отладочный dcus».

6 голосов
/ 22 сентября 2011

Как и многие свойства, установщик свойств Visible проверяет, отличается ли новое значение от текущего значения, прежде чем что-либо делать. Нет необходимости проверять текущее значение свойства вручную.

0 голосов
/ 22 сентября 2011

Ну, я сомневаюсь, что это произойдет, но, возможно, могут быть проблемы с формами в последних версиях Delphi. Свойство Visible повторно объявлено в TCustomForm, чтобы обеспечить выполнение события OnCreate до установки видимости. Технически он не переопределяется, поскольку TControl.SetVisible не является виртуальным, но имеет тот же эффект:

procedure TCustomForm.SetVisible(Value: Boolean);
begin
  if fsCreating in FFormState then
    if Value then
      Include(FFormState, fsVisible) else
      Exclude(FFormState, fsVisible)
  else
  begin
    if Value and (Visible <> Value) then SetWindowToMonitor;
    inherited Visible := Value;
  end;
end;

Эта реализация в Delphi 7 по-прежнему не требует проверки видимости вручную, но проверьте это самостоятельно для более свежих версий.

Кроме того, я согласен с комментарием Ларри Люстига, поскольку предоставленный вами код не свидетельствует о принятом синтаксисе. Это могло бы быть лучше написано как:

procedure TForm1.ShowPaletteButtonClick(Sender: TObject);
begin
  if not Form2.Visible then Form2.Visible := True;
  Form2.BringToFront;
end;
...