Zitat von
BAMatze:
Hallo habe das jetzt mit Debugger und Protokoll getestet und er bleibt immer in der FromClose-Prozedure des Splash hängen. Allerdings wird dort, wie man anhand des Quellcodes sieht nicht viel gemacht.
Delphi-Quellcode:
procedure TLoaderForm.FormClose(Sender: TObject; var Action: TCloseAction);
var i: Integer;
begin
// Wenn Form geschlossen wird, ausblenden und "Self.Free" machen
for i := 230 downto 0 do
begin
LoaderForm.AlphaBlendValue := i;
Application.ProcessMessages;
end;
Action := caFree;
end;
Und wie gesagt, in dem Meisten Fällen läuft das ganze ja durch.
Ich denke auch, das Application.ProcessMessages ist das Problem. Dabei werden alle anstehenden Messages abgearbeitet bis die Message-Queue leer ist. Da dein Timer im ControlerBoard aber alle 30ms auslöst, kann es sein, daß deine "Ausblenden"-Aktion ziemlich lange dauern wird.
Vorschlag: Nimm im Hauptform einen neuen Timer, der das Splashscreen ausblendet und am Ende freigibt. Statt LoaderForm.Close/Free enablest du nur den Timer. Etwa so:
Delphi-Quellcode:
// Splashscreen schließen
LoaderFormCloseTimer.Interval := 100; // 100 ms;
LoaderFormCloseTimer.Tag := 50; // 50 * 100ms = 5 Sekunden
LoaderFormCloseTimer.Enabled := true;
BedienForm.Enabled := true;
Und im Timer-Event:
Delphi-Quellcode:
procedure TBedienForm.LoaderFormCloseTimerTimer(Sender: TObject);
begin
LoaderFormCloseTimer.Tag := LoaderFormCloseTimer.Tag - 1;
if LoaderFormCloseTimer.Tag > 0 then begin
LoaderForm.AlphaBlendValue := Round(230*LoaderFormCloseTimer.Tag/50);
end
else begin
LoaderForm.Close;
LoaderForm.Free;
end;
end;
Die Schleife im TLoaderForm.FormClose kann dann weg.