in FormShow() beenden



  • Ich habe diverse Überprüfungen beim Start meines Programms. Und sollte etwas nicht stimmen, möchte ich dass das Programm nicht startet. Den Start also abbrechen.

    Application->Destroy(); Application->Terminate(); und Form->Close();

    funzen nicht...

    thx



  • Schreib da ein Close() und gleich danach ein return rein.



  • funzt irgendwie nicht, reicht ja schon wenn die Form nicht erscheint, aber visible = false; will auch nicht



  • Hallo

    Das Hauptformular wird auf jedenfall angezeigt, erst danach könntest du mit den genannten Möglichkeiten das Programm beenden.
    Um das zu umgehen must du also in dem Programmstart eingreifen und das kannst du nur über die Hauptquellcodedatei mit der main-Funktion, <Projektname>.cpp. Dort findest du Application->Run(), vor dem du deine Überprüfungen machen kannst.

    bis bald
    akari



  • Das blöde ist nur, dass die überprüfungen in meiner Hauptform ablaufen.
    Diese Daten werden beim Start in einem Splashscreen angezeigt, und ist was falsch dürfte Form1 nicht sichtbar werden.

    Sry Schließen darf ich erst nach beenden des Splashscreens per Button.



  • Hallo

    Du must entweder die Überprüfung aus dem Hauptformular in eine extra unabhängige Unit verlegen (Siehe Trennnung von GUI und Logik) oder die Überprüfung so in deinem Hauptformular einbauen das sie von außen heraus auch aufrufbar ist. Denn auch ein Form ist eine normale Klasse und kann nach dem Erstellen mit seinen public-Membern benutzt werden.

    bis bald
    akari



  • Das Problem ist bloß, damit ich meine Funktion aufrufen kann muss sie erstellt sein, ist die Form aber erstellt ist sie auch schon sichtbar...



  • Hallo

    Nein das ist eben der Trugschluß. Nach dem CreateForm ist deine Form erstellt. Sichtbar ist sie aber erst mit dem Application->Run(). Dazwischen kannst du deine Überprüfung durchführen.

    bis bald
    akari



  • ok,so?

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                     Application->Initialize();
                     if(AnsiString(GetCommandLine()).UpperCase().Pos("/NOSPLASH") == 0)
                     {
                       frmSplash = new TfrmSplash(static_cast<void *> (NULL));
                       frmSplash -> Show();
                       Application -> ProcessMessages();
                     }
                     //Application->CreateForm(__classid(TForm1), &Form1);
                     Application->CreateForm(__classid(TForm1), &Form1);
                     //Application->CreateForm(__classid(TfrmSplash), &frmSplash);
                     Application->CreateForm(__classid(TForm3), &Form3);
                     Application->CreateForm(__classid(TForm4), &Form4);
                     if(!Form1->initialize()) { Application->Run(); }
            }
    

    Folgendes Verhalten, Splash+Form1 erscheinen und sobald bei if(!Form1->initialize()) { Application->Run(); } wird anscheinend abgebrochen



  • Hallo,

    was heißt es wird abgebrochen 😕

    'initialize' is not a member of 'TForm1', because the type is not defined yet

    Und Parameter lassen sich übrigens auch mit ParamStr(Index) auslesen 🙂

    mfg, Micha!



  • Wenn er die Headerdatei von TForm1 inkludiert hat, sollte dieser fehler nicht kommen. 🙂



  • Also wie gesagt, beide Fenster erscheinen (Form1, Splash), initialize wird durchgeführt und dann wird das Programm beendet. (Eine von mir gethrowte Exception tritt innerhalb von initialize auf, welche durch catch abgefangen wird)
    Hier noch nen bissl Code des jetzigen Zeitpunkts:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Splash.h"
    #include "GUI.h"
    //---------------------------------------------------------------------------
    USEFORM("GUI.cpp", Form1);
    USEFORM("UeberMich.cpp", Form3);
    USEFORM("Kamera.cpp", Form4);
    USEFORM("Splash.cpp", frmSplash);
    //---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
            try
            {
                     Application->Initialize();
                     if(AnsiString(GetCommandLine()).UpperCase().Pos("/NOSPLASH") == 0)
                     {
                       frmSplash = new TfrmSplash(static_cast<void *> (NULL));
                       frmSplash -> Show();
                       Application -> ProcessMessages();
                     }
                     Application->CreateForm(__classid(TForm1), &Form1);
                     //Application->CreateForm(__classid(TfrmSplash), &frmSplash);
                     Application->CreateForm(__classid(TForm3), &Form3);
                     Application->CreateForm(__classid(TForm4), &Form4);
                     if(!Form1->initialize()) { Application->Run(); }
            }
            catch (Exception &exception)
            {
                     Application->ShowException(&exception);
            }
            catch (...)
            {
                     try
                     {
                             throw Exception("");
                     }
                     catch (Exception &exception)
                     {
                             Application->ShowException(&exception);
                     }
            }
            return 0;
    }
    //---------------------------------------------------------------------------
    
    bool TForm1::initialize()
    {
      version = "0.9.0.0";
      this->Caption = "Planer - v. " + version;
    
      if(frmSplash) frmSplash->Version->Caption = "Planer v. " + version;
    
      bool fehler = false;
      AnsiString fehlertext;
    
      Liste->Cells[0][0] = "#";
      Liste->Cells[1][0] = "Linse";
      Liste->Cells[2][0] = "Decoder";
      Liste->Cells[3][0] = "Abstand";
      Liste->Cells[4][0] = "Auflösung";
      Liste->Cells[5][0] = "Winkel";
    
      Liste->ColWidths[0] = 26;
      Liste->ColWidths[1] = 55;
      Liste->ColWidths[2] = 105;
      Liste->ColWidths[3] = 58;
      Liste->ColWidths[4] = 70;
      Liste->ColWidths[5] = 56;
    
      extend = false;
      optimiert = true;
    
      // Zuletzt sortierte Spalte zurücksetzen
      igLastSortedColumn = -1;
    
      // Bilder instanziieren:
      bmpSortUp = new Graphics::TBitmap;
      bmpSortDown = new Graphics::TBitmap;
      bmpSortUp -> LoadFromResourceName(DWORD(HInstance), "PIC_SORT_UP");
      bmpSortDown -> LoadFromResourceName(DWORD(HInstance), "PIC_SORT_DOWN");
      bmpSortUp -> Transparent = true;
      bmpSortDown -> Transparent = true;
    
      DecimalSeparator = '.';
    
      this->Height = Liste->Top+Liste->Height+71;
    
      /* Initialisierungsphase 1 */
    
      // Statusmeldung im Fortschrittslabel des Splash-Formulars anzeigen:
      if(frmSplash) frmSplash -> Status -> Caption = "Loading language base...";
      // Windows Messagequeue abarbeiten lassen, damit das
      // Splash-Fenster aktualisiert werden kann:
      Application->ProcessMessages();
      // Verzögerungsschleife -> durch Initialisierungscode ersetzen !
      DWORD ilCounts = GetTickCount();
      while(GetTickCount() < ilCounts + 1000)
        Application->ProcessMessages();
    
      //Sprache laden bzw. Default benutzen
      try{ regload_Sprache(); } catch(...) { fehlertext = "!-Language base couldn`t be load!\n!-Default language will be used!"; fehler = true;}
      if( sprache == sprEnglisch )
      {
        SpracheDeutsch->Checked = false;
        SpracheDeutsch->Enabled = true;
        SpracheEnglisch->Checked = true;
        SpracheEnglisch->Enabled = false;
        SpracheFranzoesisch->Checked = false;
        SpracheFranzoesisch->Enabled = true;
    
        MenuDatei->Caption = "&File";
        DateiBeenden->Caption = "&Close";
    
        MenuOptionen->Caption = "&Options";
        OptionenSprache->Caption = "&Language";
        SpracheDeutsch->Caption = "&German";
        SpracheEnglisch->Caption = "&English";
        SpracheFranzoesisch->Caption = "&French";
    
        HilfePlaner->Caption = "&About Me";
    
        GroupBox1->Caption = "Pacel";
        MaxPakHoe->EditLabel->Caption = "Pacel height";
        MinModBre->EditLabel->Caption = "Min. modul width";
    
        GroupBox2->Caption = "Conveyer";
        Coverage->EditLabel->Caption = "Coverage";
        BeltSpeed->EditLabel->Caption = "Speed";
    
        Liste->Cells[1][0] = "Lense";
        Liste->Cells[2][0] = "Decoder";
        Liste->Cells[3][0] = "Throw";
        Liste->Cells[4][0] = "Resolution";
        Liste->Cells[5][0] = "Angle";
    
        Throw_D->Caption = "Farworking Distance: ";
        Resolution_D->Caption = "Resolution: ";
        Coverage_D->Caption = "Coverage: ";
        MinElement_D->Caption = "Min. modul width: ";
        MaxBeltSpeed_D->Caption = "Belt speed: ";
    
        languageChanged();
      }else if( sprache == sprFranzoesisch ){
        SpracheDeutsch->Checked = false;
        SpracheDeutsch->Enabled = true;
        SpracheEnglisch->Checked = false;
        SpracheEnglisch->Enabled = true;
        SpracheFranzoesisch->Checked = true;
        SpracheFranzoesisch->Enabled = false;
    
        MenuDatei->Caption = "&Fichier";
        DateiBeenden->Caption = "&Terminer";
    
        MenuOptionen->Caption = "&Réglages";
        OptionenSprache->Caption = "&Langues";
        SpracheDeutsch->Caption = "&Allemand";
        SpracheEnglisch->Caption = "&Anglais";
        SpracheFranzoesisch->Caption = "&Francais";
    
        HilfePlaner->Caption = "&De Moi";
    
        GroupBox1->Caption = "Paquet";
        MaxPakHoe->EditLabel->Caption = "Hauteur du paquet";
        MinModBre->EditLabel->Caption = "Min. de la largeur du code-barres";
    
        GroupBox2->Caption = "L`installation";
        Coverage->EditLabel->Caption = "Largeur";
        BeltSpeed->EditLabel->Caption = "Vitesse";
    
        Liste->Cells[1][0] = "Lentille";
        Liste->Cells[2][0] = "Decoder";
        Liste->Cells[3][0] = "Distance";
        Liste->Cells[4][0] = "Résiliation";
        Liste->Cells[5][0] = "Angle";
    
        Throw_D->Caption = "Distance: ";
        Resolution_D->Caption = "Résiliation: ";
        Coverage_D->Caption = "Largeur: ";
        MinElement_D->Caption = "Min. de la largeur du code-barres: ";
        MaxBeltSpeed_D->Caption = "Vitesse: ";
    
        languageChanged();
      }
    
      /* Initialisierungsphase 2 */
    
      // Statusmeldung im Fortschrittslabel des Splash-Formulars anzeigen:
      if(frmSplash) frmSplash -> Status -> Caption = "Loading Excel files...";
      // Windows Messagequeue abarbeiten lassen, damit das
      // Splash-Fenster aktualisiert werden kann:
      Application->ProcessMessages();
      // Verzögerungsschleife -> durch Initialisierungscode ersetzen !
      ilCounts = GetTickCount();
      while(GetTickCount() < ilCounts + 1000)
        Application->ProcessMessages();
    
      //Excel-Mappen einbinden
      try{
        TStringList *mappenliste = sucheNachEndung("xls");
        for(int i = 0; i < mappenliste->Count; i ++)
        {
          AnsiString datei = mappenliste->Strings[i];
          datei = getProgDir() + datei.SubString(1,datei.Pos("xls")-2);
          mappen.push_back(Excel(datei,mappenliste->Strings[i],true));
        }
    
        if( mappenliste->Count == 0)
        {
          if(fehlertext.Length() > 0)
          {
            fehlertext = fehlertext + "\n!-No Excel files found!";
          }else{
            fehlertext = "!-No Excel files found!";
          }
          fehler = true;
        }
      }catch(...){
        if(frmSplash->Fehler->Text.Length() > 0)
        {
          fehlertext = fehlertext + "\n!-Failure during loading Excel files!";
        }else{
          fehlertext = "!-Failure during loading Excel files!";
        }
        fehler = true;
      }
    
      //--------------------------------------------
      // Splash-Fenster schliessen:
      //--------------------------------------------
      if(frmSplash != NULL && !fehler)
      {
        delete frmSplash;
        frmSplash = NULL;
      }else if( fehler ){
        frmSplash->Fehler->Visible = true;
        frmSplash->Fehler->Text = fehlertext;
        frmSplash->setForm(this);
        frmSplash->Exit->Visible = true;
        frmSplash->Status->Caption = "";
        //PostMessage(Form1->Handle,WM_CLOSE,0,0);
        //ShowWindow (GetConsoleWindow(), SW_HIDE);
      }
    
      return fehler;
    }
    //----------------
    
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    

    Btw: GUI ist Form1



  • So habs gelöst, auch wenn unter etwas anderem Kontext: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1333363.html#1333363



  • Interessanterweise lässt sich eine Anwendung im Konstruktor des MainForms noch beenden, erst in der FormShow nicht mehr.



  • Du kannst an jeder beliebigen Stelle deines Programmes ein

    Application->Terminate();
    

    ausführen.


Anmelden zum Antworten