Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#1

Form laden: Localizeloading in InitHeritedcomponent

  Alt 10. Jun 2018, 13:09
Ich habe hier ein FMX-Project, wo das Laden der Mainform ca. 6-7 Sekunden dauert (ist aber erst seit einiger Zeit so).

Wenn ich per Debugging nach Application.Run durch den Code gehe, ist es der Aufruf in "InitInheritedComponent" (aus System.Classes) und zwar der Aufruf von der Procedure "NotifyGlobalLoading".

Ich verstehe dabei nicht so ganz, wie der Booleanwert für "LocalizeLoading" gesetzt wird oder ob man das irgendwie beeinflussen kann (so dass LocalizeLoading false ist und NotifiyGlobalLoading nicht aufgerufen werden muss).

Jemand eine Idee?

Delphi-Quellcode:
function InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;

  function InitComponent(ClassType: TClass): Boolean;
  begin
    Result := False;
    if (ClassType = TComponent) or (ClassType = RootAncestor) then Exit;
    Result := InitComponent(ClassType.ClassParent);
    Result := InternalReadComponentRes(ClassType.ClassName,
      FindResourceHInstance(FindClassHInstance(ClassType)), Instance) or Result;
  end;

var
  LocalizeLoading: Boolean;
begin
  GlobalNameSpace.BeginWrite; // hold lock across all ancestor loads (performance)
  try
    LocalizeLoading := (Instance.ComponentState * [csInline, csLoading]) = [];
    if LocalizeLoading then BeginGlobalLoading; // push new loadlist onto stack
    try
      Result := InitComponent(Instance.ClassType);
      if Result then Instance.ReadDeltaState;
      if LocalizeLoading then NotifyGlobalLoading; // < ---- call Loaded [das brauch Zeit!!]
    finally
      if LocalizeLoading then EndGlobalLoading; // pop loadlist off stack
    end;
  finally
    GlobalNameSpace.EndWrite;
  end;
end;
NotifyGloballoading sieht so aus:

Delphi-Quellcode:
procedure NotifyGlobalLoading;
var
  I: Integer;
  G: TList<TComponent>;
begin
  G := GlobalLoaded; // performance: eliminate repeated trips through TLS lookup
  for I := 0 to G.Count - 1 do
    TComponent(G[I]).Loaded;
end;

Geändert von Harry Stahl (10. Jun 2018 um 13:14 Uhr)
  Mit Zitat antworten Zitat