Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#11

Re: Programm hält beim Start einfach an

  Alt 15. Jul 2009, 16:30
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.
Uwe Raabe
  Mit Zitat antworten Zitat