Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programm hält beim Start einfach an (https://www.delphipraxis.net/137151-programm-haelt-beim-start-einfach.html)

Uwe Raabe 15. Jul 2009 15:30

Re: Programm hält beim Start einfach an
 
Zitat:

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.

Luckie 15. Jul 2009 21:18

Re: Programm hält beim Start einfach an
 
Man kommt auch ohne Timer und Schleife aus, wenn man die API-Funktion MSDN-Library durchsuchenAnimateWindow benutzt.

rollstuhlfahrer 16. Jul 2009 09:00

Re: Programm hält beim Start einfach an
 
Zitat:

Zitat von BAMatze
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;

Mich würde da was ganz großes stören, nämlich die Verwendung von exakten Variablennamen (LoaderForm.). Der andere Punkt ist, dass du hier schreibst, dass das Formular durch den aufruf von Self.Free terminiert wird.

An anderer Stelle schreibst du:
Zitat:

Zitat von BAMatze
[delphi]
// Splashscreen schließen
LoaderForm.Close;
LoaderForm.Free;

So, jetzt ist das Objekt doch 2x aus dem Speicher entfernt worden, oder? (hab die Delphi-VCL-Quelltexte noch nicht konsultiert) Aber dennoch müsste hier ein Fehler vorliegen.

Bernhard

BAMatze 16. Jul 2009 16:34

Re: Programm hält beim Start einfach an
 
Hallo an euch alle und vielen Dank für die ganzen Anregungen. Konnte heute leider noch nicht weiter machen mit dem Problem, ist aber morgen früh gleich 2. Tagespunkt. Musste heute mal um Abschlussarbeit und so kümmern und deswegen leider nur unterwegs.
Aber danke euch für die vielen Verbesserungsvorschläge und die Hilfe. Werde morgen posten, ob das Problem gelöst ist.

Vielen Dank an Euch :dp:
BAMatze

BAMatze 17. Jul 2009 12:43

Re: Programm hält beim Start einfach an
 
Also habe jetzt mal die Close-Procedure wie ihr mir geraten habt geändert und das Application.ProcessMessages; aus der Schleife genommen. Funktioniert alles super. Hätte eigentlich nur noch die Frage, warum eigentlich, wenn ich diesen Befehl weglasse das Bild in meiner Form nicht sichtbar ist, sondern erst nach der Schleife eingebunden wird.

Vielen Dank
BAMatze

Uwe Raabe 17. Jul 2009 13:15

Re: Programm hält beim Start einfach an
 
Zitat:

Zitat von BAMatze
Hätte eigentlich nur noch die Frage, warum eigentlich, wenn ich diesen Befehl weglasse das Bild in meiner Form nicht sichtbar ist, sondern erst nach der Schleife eingebunden wird.

Weil die Paint- bzw. Refresh-Message solange noch in der Message-Queue festsitzt?

GHorn 17. Jul 2009 13:33

Re: Programm hält beim Start einfach an
 
Zitat:

Hätte eigentlich nur noch die Frage, warum eigentlich, wenn ich diesen Befehl weglasse das Bild in meiner Form nicht sichtbar ist, sondern erst nach der Schleife eingebunden wird.
Was meinst Du mit "Bild nicht sichtbar"? Wird das Ausblenden nicht angezeigt?
Oder stehe ich jetzt auf dem Schlauch?

BAMatze 17. Jul 2009 13:45

Re: Programm hält beim Start einfach an
 
Zitat:

Zitat von GHorn
Zitat:

Hätte eigentlich nur noch die Frage, warum eigentlich, wenn ich diesen Befehl weglasse das Bild in meiner Form nicht sichtbar ist, sondern erst nach der Schleife eingebunden wird.
Was meinst Du mit "Bild nicht sichtbar"? Wird das Ausblenden nicht angezeigt?
Oder stehe ich jetzt auf dem Schlauch?

Das aufblenden wird dargestellt mit schwarzem Bildschirm, ist das Fenster da, wird das Bild eingefügt. Problem lässt sich beheben, indem ich den angesprochenen Befehlt bei close nach der Schleife und beim Start vor die Schleife schreibe. Was ich mich gerade nur frage, ist warum dies so ist, dass das Bild ohne den Befehl nicht oder erst später angezeigt wird, als ich eigentlich möchte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz