Formular automatisch schließen



  • Hallo, ich habe hier 2 Fragen:
    Wenn ich unten stehenden Code compiliere und ausführe,
    dann erscheint das Formular erst NACH abarbeitung
    der For-Schleife. Die vorherige Ausgabe

    Edit1->Text="Hallo";
    

    ist nicht sichtbar. Ausserdem erhällt der Anwender keinen Hinweis darauf,
    dass das Programm überhaupt läuft.
    1. Wie kann ich erreichen, dass das Formular gleich sichtbar wird ?
    2. Wie kann erreicht werden, dass sich das Formular nach abarbeitung der
    Schleife automatisch schliesst, ohne das der Anwender es wegklicken muss ?

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    	Edit1->Text="Hallo";
      for(unsigned int i=0; i<1000000; i++)
      {
      	Edit1->Text=IntToStr(i); // Irgendeine  zeitraubende Berechnung
      }
    }
    

    Gruß,
    Terry



  • Hi,
    Du arbeitest im Ctor des Fensters. Das Fenster wird allerdings erst angezeigt, nachdem dieser abgearbeitet ist. Außerdem wird die Anzeige zwischendurch nicht aktualisiert, wodurch ohnehin das Hallo und alle bis auf die letzte Zahl geschluckt würden. An Deiner Stelle würde ich mit einem Timer arbeiten, den Du in FormShow anstößt. Nach Beendigung der Schleife schreibst Du einfach Close(), und schon schließt sich das Fenster. Das funktioniert allerdings auch nicht im Konstruktor, sondern erst, wenn das Fenster fertig erstellt ist.
    Viele Grüße,
    Christian



  • Hi Christian
    Danke für deine Antwort. Diese For-Schleife sollte nur ein Beispiel
    für eine längerdauernde Berechnungsroutine sein. In meinem Programm
    soll eine Wave-Datei erstellt werden, welche leicht 500 MByte-große
    Dateien erzeugt. Das dauert auf meinem PC schon mal ein paar Minuten.
    Während dieser Zeit bekome ich vom Programm keine Rückmeldung.
    Es erscheint nicht einmal ein Eintrag in der Task-Leiste. 😃
    Erst nachdem die Berechnungsroutine fertig ist erscheint das
    Formular auf dem Desktop und in der Taskleiste.

    Und das mit dem

    Close();
    

    habe ich probiert.
    Wenn ich dann die fertige exe-Datei aufrufe, schließt sie sich
    nicht nach Abarbeitung des Programmes 😡

    Irgendwas mache ich noch falsch.

    Gruß,
    Terry



  • Hallo

    Was erwartest du wenn die Berechnung im Konstruktor des MainForms erfolgt? Du die Berechnung natürlich in eine andere Methode auslagern die aufgerufen wird nachdem das Form angezeigt wird. Da du offenbar aber gleich beim Start des Programms die Berechnung anzeigen und nach der Berechnung das Programm wieder schließen willst kommst du aber um größere Eingriffe nicht herum

    - Erstell eine Sicherheitskopie deines Projektes...
    - Lagere die Berechnung in eine eigene public-Methode des Forms aus
    - Führere in der Berechnung nach jedem Arbeitsschritt Application->ProcessMessages(); aus, vorzugsweise nach Ausgabe von Fortschrittsinformationen
    - Öffne die Hauptprojektdatei (<Projektname>.cpp), wo die main-Funktion und das Erzeugen der Forms steht
    - Füge den include dort ein

    #include "Form1.h" // Headerdatei des fraglichen Forms
    

    - Ersetzt die Zeile Application->Run(); durch

    Form1->Show();
    Form1->MachBerechnung(...); // Berechnung ausführen
    ... // Programm wird automatisch danach beendet
    

    Die Frage ist dann ob diese Form der Benutzerführung wirklich sinnvoll ist. Meiner Meinung nach sollte so nur eine Konsolenanwendung im Hintergrund laufen.
    GUI-Programme sollten zumindestens auf dem Form noch einen Start-Button sowie vor dem Beenden eine Art Protokoll anzeigen. Dadurch würde sich bei dir nämlich der Ablauf drastisch vereinfachen.

    bis bald
    akari



  • Hallo akari,
    naja, das Ergebnis soll erst nach der Berechnung angezeigt werden, aber während der Berechnung sollte der Anwender schon erkennen können, dass das Programm überhaupt läuft. Ebenfalls soll auf einem Progress Bar der Fortschritt der Berechnung angezeigt werden.

    Ich verstehe, das das alles nicht in den Konstruktor des MainForms gehört, aber ich weiß nicht wie ich es sonst einbinden soll 😕
    Ich habe noch nicht viel Erfahrung mit Windows-Programmierung und verwechsele den Konstruktor des MainForms immer mit der Main-Funktion eines Konsolenprogrammes.

    Vermutlich ist die Lösung ganz einfach.

    Gruss,
    Terry



  • Hallo

    Und eine mögliche Lösung, die alle von die genannten Punkte berücksichtigt, habe ich dir beschrieben.

    bis bald
    akari



  • Hallo,

    du könntest deine "Berechnungsroutine" auch Zeitverzögert starten. Zum Beispiel mit einem Timer der ein Interval von - was weiß ich - einer MilSek hat.

    mfg, Micha



  • Hallo

    vielen Dank für die Vorschläge und Anregungen. Ich werde mal ein wenig damit experimentieren uns sehen was für mich am besten passt.

    Gruß,
    Terry


Anmelden zum Antworten