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;