我只是想知道
之间可能有什么区别 TControl.Hide
和TControl.Visible := False
和
TControl.Show
和TControl.Visible := True
如果存在差异,哪一种是最佳做法?
答案 0 :(得分:2)
根据文档,调用Show / Hide方法将Visible属性设置为True / False,所以我认为没有区别......
这是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