Beim Schließen einer TForm kommt der Fehler "Abnormal Programm termination"



  • Hallo folgendes Problem

    wenn man einen Button klickt soll ein neues TForm geöffnet werden, in welchem die Seriellen Schnittstellen ausgewählt werden können.
    Hier der Code zum Button Click

    void __fastcall TfrmHaupt::btnOptionenClick(TObject *Sender)
    {
    /*extern unsigned char	Schnittstelle;
    extern bool             NOP_Anzeige;*/
    AnsiString StPortvorhanden[256];
    int inAnzPorts=0;
    HANDLE     Com;
    AnsiString PortName;
    TRadioButton *RBCom[255];
    
    // alle Com-Ports bestimmen
    for (int i = 1; i <= 256; ++i)
    {
      PortName = "COM" + IntToStr(i);
    
      // Port öffnen
      Com      = ::CreateFile(PortName.c_str(),
                              GENERIC_READ | GENERIC_WRITE,
                              0,
                              0,
                              OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL,
                              0);
    
      if (Com != INVALID_HANDLE_VALUE)
      {
        // alle gefundenen Ports in ne Listbox packen
        inAnzPorts++;
        StPortvorhanden[inAnzPorts]=PortName;
    
        // Port wieder schliessen
        PurgeComm(Com, PURGE_RXABORT);
        CloseHandle(Com);
      }
    }
    frmOptionen = new TfrmOptionen(this);
    for (int k=1;k<=inAnzPorts;k++)
    {
           RBCom[k]= new TRadioButton(frmOptionen);
           RBCom[k]->Parent = frmOptionen;
           frmOptionen->Panel1->InsertControl(RBCom[k]);
           RBCom[k]->Width = 70;
           RBCom[k]->Height = 20;
           RBCom[k]->Top = 10+((k-1)*35);
           RBCom[k]->Left = 355;
           RBCom[k]->Alignment= taRightJustify;
           RBCom[k]->Caption= StPortvorhanden[k];
    
    }
    
    frmOptionen->ShowModal();
    delete frmOptionen;
    
    }
    

    so das scheint auch zu klappen nur beim Schließen des ganzen über den Button
    Schließen

    void __fastcall TfrmOptionen::btnCloseClick(TObject *Sender)
    {
            frmOptionen->Close();
    }
    

    kommt obiger Fehler woran kann das liegen?

    Merci für eure Hilfe

    MfG Felix



  • frmOptionen dürfte bereits von der Applikation verwendet werden. Versuch es mal mit einem anderen Namen für das dynamisch erstellte Formular.

    Grüße Joe_M.



  • Hallo Joe Hallo at all

    also hab lange nichts mehr von mir hören lassen nun bin ich aber wieder etwas dran.

    Also das Problem trat erst auf nachdem ich die Radiobuttons eingefügt habe. Ist das überhaupt korrekt die so im Aufruf zu erzeugen oder gibt es bei Borland C auch eine Funktion die beim öffnen der Form Aufgerufen wird (wer sich in Visual Basic auskennt ich mein sowas wie FormCreate) und muß ich die erzeugten RadioButtons vor dem Terminieren der Forms wieder löschen?

    Viele Fragen wer weiß noch was?

    Vielen Dank für eure Hilfe

    MfG Felix



  • Borland C kennt keine Formulare

    Die Borland C++ Builder kennen OnCreate. Einfach mal im Objektinspektor unter Ereignisse nachschauen



  • nimm hier das frmOptionen-> raus

    [cpp]
    void __fastcall TfrmOptionen::btnCloseClick(TObject *Sender)
    {
    frmOptionen->Close(); // frmOptionen ist hier falsch!
    }
    [/cpp]



  • So habe das frmOption rausgenommen und die erzeugung der Radiobuttons bei OnCreate eingefügt. nun funktioniert es einmal, beim zweitenmal schließen kommt wieder Abnormale Programm termination wobei davor eine Zugriffsverletzung auf die Adresse 004981F4 Lesen von Adresse EBBE6632

    hier mal der abgewandelte Code

    Form erzeugen

    frmOptionen = new TfrmOptionen(this);
    frmOptionen->ShowModal();
    delete frmOptionen;
    

    Das erzeugen der Radiobuttons

    void __fastcall TfrmOptionen::FormCreate(TObject *Sender)
    {
    AnsiString StPortvorhanden[256];
    int inAnzPorts=0;
    HANDLE     Com;
    AnsiString PortName;
    TRadioButton *RBCom[255];
    // alle Com-Ports bestimmen
    for (int i = 1; i <= 256; ++i)
    {
      PortName = "COM" + IntToStr(i);
    
      // Port öffnen
      Com      = ::CreateFile(PortName.c_str(),
                              GENERIC_READ | GENERIC_WRITE,
                              0,
                              0,
                              OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL,
                              0);
    
      if (Com != INVALID_HANDLE_VALUE)
      {
        // alle gefundenen Ports in ein Array packen
        inAnzPorts++;
        StPortvorhanden[inAnzPorts]=PortName;
    
        // Port wieder schliessen
        PurgeComm(Com, PURGE_RXABORT);
        CloseHandle(Com);
      }
    }
    
           for (int k=1;k<=inAnzPorts;k++)
           {
               RBCom[k]= new TRadioButton(frmOptionen);
               RBCom[k]->Parent = frmOptionen;
               Panel1->InsertControl(RBCom[k]);
               RBCom[k]->Width = 70;
               RBCom[k]->Height = 20;
               RBCom[k]->Top = 10+((k-1)*35);
               RBCom[k]->Left = 355;
               RBCom[k]->Alignment= taRightJustify;
               RBCom[k]->Caption= StPortvorhanden[k];
    
            }
    
    }
    

    und das beenden des Forms mit einem Button

    void __fastcall TfrmOptionen::btnCloseClick(TObject *Sender)
    {
            Close();
    }
    

    Vielleicht kann mir jemand sagen woran das liegt? Bei Basic kammen solche Probleme meist wenn man die Radiobuttons erneut mit gleichem Index erzeugt erzeugt aber warum kommt dann der Fehler erst beim schließen

    Vielen Dank auf jedenfall mal Felix

    P.S.: Es scheint effektiv an den RadiButtons zu liegen, wenn ich die Funktion zum erzeugen heraus nehme läuft es ohne Probleme



  • Ich kann nichts zu dem Problem sagen, aber wieso nimmst du RadioButtons?
    Wäre eine Combobox nicht einfacher?



  • zufaulzumeinloggen schrieb:

    frmOptionen dürfte bereits von der Applikation verwendet werden. Versuch es mal mit einem anderen Namen für das dynamisch erstellte Formular.

    Solange Du frmOptionen nicht aus der Liste der automatisch erzeugten Formulare herausnimmst und darauf bestehst, den globalen Formularnamen zu verwenden, hast Du ein Problem. Ich sehe allerdings auch nirgendwo die Stelle, an der Du die Radiobuttons wieder 'deletest'.



  • Das Problem hat sich jetzt mal soweit erledigt. Ich hab den Tip mit der Combobox befolgt nun kommt keine Fehlermeldung mehr

    Merci für alle Hilfethemen

    MfG Felix



  • Es wird doch frmOptionen beim erstellen übergeben, sollte dann nicht die Form das löschen übernehmen?

    Dazu muss man natürlich die Form löschen nachdem sie geschlossen wurde...



  • Das ist noch die Frage, solange die Applikation davon ausgeht, dass frmOptionen von ihr verwaltet wird, führt das zu Problemen.
    Die Applikation hat bereits eine Instanz von frmOptionen erzeugt. Dann geht bierber hin und erzeugt eine neue Instanz von frmOptionen, ohne die alte freizugeben. Dann löscht er die Form, ohne den Zeiger auf NULL zu setzen, oder eine neue Instanz anzulegen. Beim Beenden der Applikation versucht diese dann frmOptionen freizugeben...


Anmelden zum Antworten