带有添加或删除子对象的BeginUpdate / Endupdate块:delphi中的误解?

时间:2018-08-08 10:10:44

标签: delphi firemonkey

这个问题跟着这个问题:Why this change in tokyo 10.2.3?,并介绍我认为在delphi中的误解

基本上在firemonkey中,您可以使用方法BeginUpdateEndUpdate停用 / 激活控制您何时更新它。不必在每次更改控件的一个属性时都重新调整控件几次,而只需在调用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

但是不确定我是否没有错过任何事情...

0 个答案:

没有答案