control.hide / show和control.visible:= false / true之间有区别吗?

时间:2017-03-07 08:11:33

标签: delphi

我只是想知道

之间可能有什么区别

TControl.HideTControl.Visible := False

TControl.ShowTControl.Visible := True

如果存在差异,哪一种是最佳做法?

2 个答案:

答案 0 :(得分:2)

根据文档,调用Show / Hide方法将Visible属性设置为True / False,所以我认为没有区别......

TControl.Visible

TControl.Hide

TControl.Show

这是VCL代码:

procedure TControl.Hide;
begin
  Visible := False;
end;

procedure TControl.Show;
begin
  if Parent <> nil then Parent.ShowControl(Self);
  if not (csDesigning in ComponentState) or
    (csNoDesignVisible in ControlStyle) then Visible := True;
end;

答案 1 :(得分:2)

这取决于......您使用的是VCL还是FireMonkey? Blanc向你展示了VCL代码......但是FireMonkey做了很多不同的事情:

procedure TControl.SetVisible(const Value: Boolean);
var
  AlignRoot: IAlignRoot;
begin
  if FVisible <> Value then
  try
    if FVisible then
      Repaint;
    FVisible := Value;
    VisibleChanged;
  finally
    if FVisible then
      Show
    else
      Hide;
    // We notify all child controls, that parent changed visibility
    AncestorVisibleChanged(FVisible);
    if not (csLoading in ComponentState) and (Align <> TAlignLayout.None) then
    begin
      if FParentControl <> nil then
        FParentControl.Realign
      else
        if not(csLoading in ComponentState) and Supports(Parent, IAlignRoot, AlignRoot) then
          AlignRoot.Realign;
    end;
    if ParentContent <> nil then
      ParentContent.Changed;
    if FVisible then
    begin
      RecalcUpdateRect;
      Repaint;
      TAnimator.StartTriggerAnimation(Self, Self, 'IsVisible');
    end
    else
      ResetFocus;
  end;
end;

在这种情况下,更改Visible属性会执行许多不同的操作,包括调用Show或Hide方法。另请注意,在FireMonkey中,TControl的默认显示和隐藏实现实际上是空的。

所以我说使用VCL你应该使用Show / Hide ...而使用FireMonkey你应该使用Visible:= True / False