这个问题跟着这个问题:Why this change in tokyo 10.2.3?,并介绍我认为在delphi中的误解
基本上在firemonkey中,您可以使用方法BeginUpdate
和EndUpdate
来停用 / 激活控制您何时更新它。不必在每次更改控件的一个属性时都重新调整控件几次,而只需在调用realign
以下这些功能的实现:
EndUpdate
请注意(重要的是)这些功能是虚拟的,因此您可以procedure TControl.BeginUpdate;
var
I: Integer;
begin
if FUpdating = 0 then
DoBeginUpdate;
Inc(FUpdating);
if FControls <> nil then
for I := 0 to FControls.Count - 1 do
FControls[I].BeginUpdate;
end;
procedure TControl.EndUpdate;
var
I: Integer;
begin
if IsUpdating then
begin
if FControls <> nil then
for I := 0 to FControls.Count - 1 do
FControls[I].EndUpdate;
Dec(FUpdating);
if not IsUpdating then
begin
DoEndUpdate;
RefreshInheritedCursorForChildren;
end;
end;
end;
procedure TControl.DoBeginUpdate;
begin
end;
procedure TControl.DoEndUpdate;
begin
Realign;
end;
的行为,例如TGrid的行为:
override
现在好了,我认为这是一个误解,当您在procedure TCustomGrid.DoBeginUpdate;
begin
if Model <> nil then
Model.BeginUpdate;
inherited;
end;
procedure TCustomGrid.DoEndUpdate;
begin
inherited;
if Model <> nil then
Model.EndUpdate;
end;
/ BeginUpdate
块中更新控件的属性时,通常还添加一些子控件(或删除一些子控件) 。问题是过程EndUpdate
和过程TControl.DoAddObject(const AObject: TFmxObject);
的实施方式是恢复
TControl.DoRemoveObject(const AObject: TFmxObject);
和
procedure TControl.DoAddObject(const AObject: TFmxObject);
begin
...
if AObject is TControl then
begin
AsControl := TControl(AObject);
AsControl.FUpdating := FUpdating;
end
...
end;
如您所知,当您向控件中添加子级时,请将其procedure TControl.DoRemoveObject(const AObject: TFmxObject);
procedure ResetUpdatingState(const AObject: TFmxObject);
var
I: Integer;
begin
if AObject is TControl then
TControl(AObject).FUpdating := 0;
for I := 0 to AObject.ChildrenCount - 1 do
ResetUpdatingState(AObject.Children[I]);
end;
begin
....
ResetUpdatingState(AObject);
....
end;
设置为新父控件的相同值(并且您也不会触发任何{ {1}} / FUpdating
事件,那么Tgrid之类的控件会发生什么?)。您没有触摸此子控件的BeginUpdate
个子控件,而使它们处于极有可能是错误的状态
删除子控件时,请将其EndUpdate
设置为零,并且所有子控件都相同(与您添加时的行为不同) )。但在这里您也不会触发任何FUpdating
/ FUpdating
事件
那么这是一个误解,还是有任何理由这样做?
我认为最好的方法是:
BeginUpdate
和
EndUpdate
但是不确定我是否没有错过任何事情...