3 votes

Pour les GUI utilisant Delphi ObjectPascal, est-ce que le fait de vérifier .Visible avant de le changer (potentiellement) sert à quelque chose d'utile ?

J'ai hérité d'une GUI implémentée dans Delphi RadStudio2007 ciblant Windows XP embarqué. Je vois beaucoup de code qui ressemble à ceci :

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

J'ai trouvé cet exemple de code sur le site Embarcadero :

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

Cela montre une vérification de Visible avant de le changer, mais il n'y a pas d'explication sur ce que cela sert de vérifier d'abord.

J'essaie de comprendre pourquoi le développeur original a jugé nécessaire de ne définir le drapeau Visible que s'il devait être changé, et n'a pas choisi de le coder ainsi à la place :

procedure TStatusForm.Status_refresh;

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

Y a-t-il des problèmes de performance ou des problèmes esthétiques (comme le scintillement de l'écran) dont je dois être conscient ?

8voto

Sergiy Kheylyk Points 576

Comme l'a dit Remy Lebeau, le setter Visible vérifie déjà si la nouvelle valeur est différente. Par exemple, dans XE, pour TImage, l'assignation à Visible invoque en réalité le code hérité :

procedure TControl.SetVisible(Value: Boolean);
begin
  if FVisible <> Value then
  begin
    VisibleChanging;
    FVisible := Value;
    Perform(CM_VISIBLECHANGED, Ord(Value), 0);
    RequestAlign;
  end;
end;

Donc, il n'y a aucun avantage à le vérifier. Cependant, il se peut que dans votre code, des composants tiers ou rares soient utilisés - pour eux, tout pourrait être différent, bien que j'en doute.

Vous pouvez enquêter vous-même, en utilisant l'élément de menu contextuel "Trouver la déclaration" dans l'éditeur (ou simplement Ctrl+clic), et/ou en entrant dans le code VCL avec l'option de compilation "Utiliser les DCU de débogage" activée.

6voto

Remy Lebeau Points 130112

Tout comme de nombreuses propriétés, le setter de la propriété Visible vérifie si la nouvelle valeur est différente de la valeur actuelle avant de faire quoi que ce soit. Il n'est pas nécessaire de vérifier manuellement la valeur actuelle de la propriété.

0voto

NGLN Points 25671

Eh bien, je doute que cela se produise, mais il pourrait y avoir des problèmes spécifiques aux formulaires dans les versions récentes de Delphi. La propriété Visible est redéclarée dans TCustomForm pour garantir l'exécution de l'événement OnCreate avant de définir la visibilité. Techniquement, il n'est pas surchargé puisque TControl.SetVisible n'est pas virtuel, mais il a le même effet :

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;

Cette implémentation dans Delphi 7 ne nécessite toujours pas de vérifier la visibilité manuellement, mais vérifiez par vous-même pour les versions plus récentes.

De plus, je suis d'accord avec le commentaire de Larry Lustig car le code que vous avez fourni ne témoigne pas d'une syntaxe acceptée. Il aurait pu être mieux écrit comme suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X