Announcement

Collapse
No announcement yet.

Builder2009 Delete - Anwendung beendet nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Builder2009 Delete - Anwendung beendet nicht

    Hallo zusammen,

    eigenartiges mit dem neuen c++Builder2009.... Will alte Klassen benutzen, die schon fertig sind. Nach dem ich die Stringklassen angepasst habe läuft auch alles. Ich hab nur das Problem, dass das Aufräumen (delete) beim beenden des Programms zwar noch durchläuft, aber das Programm nicht ganz beendet wird. Die Anwendung ist zwar nicht mehr zu sehen, aber der Prozess wird nicht beendet (ohne Fehlermelung). Kommentiere ich die Delete's in der OnDestroy- Methode aus, beendet der Prozess normal. Das ist aber gegen mein gutes Gewissen! Autopointer werde ich hier auch nicht einsetzen können.

    Hat schon mal jemand so was gesehen und eine Lösung? Vielen Dank!

  • #2
    Nachschlag

    Also, was ich vergessen habe / gerade bemerkt:
    Es geht hier nur um eine eigene Klasse. Wenn diese erzeugt wird, kann man das Programm nicht mehr komplett beenden, egal ob das Delete kommt oder nicht.
    Bei dieser Klasse handelt es sich um meine Datenbank- Klasse. Es besteht aus einem virtuellem abstrakten DB- Klasse und einer abgeleiteten FirebirdDB- Klasse. In dieser werden Objekte von TSQLConnection und TSQLQuery aus dbExpress erzeugt und natürlich wieder gekillt. Als Treiber verwende ich DevartInterBase.

    Geht man im Debug durch läuft man durch alle Destructoren meines Programms und dann durch die restlichen bis:

    Code:
    initialization
      HtmlHelpModule := 0;
    finalization
      if HtmlHelpModule <> 0 then FreeLibrary(HtmlHelpModule);
    end.
    in der Datei Windows.....

    Jemand eine Idea?

    Comment


    • #3
      Aufräumen im Destruktor versuchen?
      Christian

      Comment


      • #4
        Was passiert wenn z.B. die ganzen DB-Klassen z.B. schon im OnCloseQuery des hauptformulares freigegeben werden.

        Comment


        • #5
          Leider ..

          Leider geht es genau so schief, wie im OnDestroy... Ich hab schon 5 x geschaut, ob ich alles aufräume. Wie gesagt, ich erzeuge nur zwei Objekte und die zerstöre ich auch wieder!

          Comment


          • #6
            TSQLQuery ist schuld....

            ??? Mittlerweile hab ich es eingegrenz auf die TSQLQuery in meiner DB Klasse. Erzeuge ich die, kann ich das Programm nicht mehr beenden, obwohl ich die so wieder zerstöre:

            Code:
            if (aQ != NULL) 
              {aQ->SQLConnection = NULL;  //Mit und ohne der Zeile -> keine Auswirkung
                delete aQ;
                aQ = NULL;};

            Comment


            • #7
              a) sind die if != null Abfragen überflüssig

              b) ist das eine dynamisch erzeugte TSQLQuery oder hast du die Komponente auf deine Form gezogen. Im letzteren Fall wird sie von der Form selbst gelöscht
              Christian

              Comment


              • #8
                Erzeugen...

                Nun ja, if != NULL nutze ich immer, damit ich ein Okjekt auch vernünftig zerstören kann, wenn Teile beim Erzeugen nicht funktioniert haben und JA, aQ erzeuge ich dynamisch. Hier der zugehörige Konstruktor:

                Code:
                aCon = NULL;
                aQ = NULL;
                
                if (aCon == NULL) {aCon = new TSQLConnection((TComponent*)NULL);}
                aCon->DriverName = "DevartInterBase";
                aCon->ConnectionName = "Devart InterBase";
                aCon->GetDriverFunc = "getSQLDriverInterBase";
                aCon->LibraryName = ExtractFilePath(Application->ExeName)+"dbexpida40.dll";
                aCon->VendorLib = ExtractFilePath(Application->ExeName)+"fbembed.dll";
                
                if (aQ == NULL) {aQ = new TSQLQuery((TComponent*)NULL);}
                aQ->SQLConnection = aCon;
                und der gesamte Destuctor:
                Code:
                if (aCon != NULL) {Deactivate_DB_Connection();};
                
                if (aQ != NULL) {aQ->SQLConnection = NULL;
                                 delete aQ;
                				 aQ = NULL;};
                
                if (aCon != NULL) {delete aCon;
                				   aCon = NULL;};

                Comment

                Working...
                X