Announcement

Collapse
No announcement yet.

Formular freigeben und Nil setzen - wo?

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

  • Formular freigeben und Nil setzen - wo?

    Hallo,<br>

    ich hatte schon mal das Problem. Dann ging es lange problemlos und nun seit<br>
    gestern wieder eine Zugriffsschutzverletzung.<br>
    (Zugriff auf ffffffff - also dürfte irgendwas nich mehr aktuelle sein.)<br>

    Frage: Wann genau wird der Speicherplatz eines Formulares freigegeben?<br>

    Ich rufe mit Show (nicht showmodal) ein Formular auf. Wenn ich dieses schließe<br>
    (CloseQuery), sende ich eine entsprechende Mitteilung an das Hauptformular.<br>
    Dort habe ich es bisher immer freigegeben und auf nil gesetzt. (Nil ist wichtig,<br>
    da es nur neu erzeugt werden soll, wenn es noch nicht existiert.)<br>
    Bisher ging das, wie gesagt immer. Nun schmiert er bei der Freigabe ab (Das <br>
    Formular wurde nicht verändert!)<br>
    Wenn ich es jedoch nicht freigebe und nur nil setze, scheint der Speicherplatz <br>
    noch blokiert zu sein. Jedenfall wird die GDI immer weiter belastet.<br>
    (Norton Utilities, Win 98SE).<br>

    Also fragt sich, wo ich das freigeben kann bzw. wo und wie ich das gefahrlos<br>
    auf nil setzen kann.<br>

    Habt Ihr einen Tipp für mich?<br>

    Gruß<br>
    Matthias

  • #2
    Moin Matthias,<br>
    <br>
    wo gibst Du denn das Formular frei, und wie?<br>
    Wann wird das Formular erzeugt? Immer nur bei Bedarf, oder auch schon in der Projektdatei?<br>
    An irgendeiner Stelle wird es offensichtlich noch referenziert, nachdem es zerstört wurde.<br>
    <br>
    BTW: Nur auf nil setzen darf auf keinen Fall geschehen, da dann, wie Du ja schon festgestellt hast, die belegten Resourcen nicht wieder freigegeben werden. So Deine Delphi Version es schon hat solltest Du am Besten FreeAndNil benutzen (ist das Gleiche wie Free mit anschliessendem := nil)<br>
    <br>
    Ciao<br>
    Chri

    Comment


    • #3
      Hallo Christian,<br>

      also:<br>
      Das Formular wird vom Hauptformular bei Bedarf erzeugt. Der Bedarf<br> ist gegeben, wenn es nicht nil ist (not assigned), sonst wird<br> das ja existierende nur in den Vordergrund geholt.<br>
      Das Formular wird mit Show (nicht showmodal) angezeigt.<br>
      Wenn dieses Formular geschlossen wird (closequery), sendet es eine private<br> Botschaft an das Hauptformular, das seinerseits so darauf reagiert,<br>dass dieses Formular freigegeben und danach auf Nil gesetzt wird.<br>
      Das funktionierte bisher ganz ausgezeichnet und ist wohl eigentlich auch richtig.<br>
      Neuerdings bricht aber das Programm mit einer Speicherschutzverletzung<br>ab. Und zwar genau dann, wenn ich die Form freigebe<br>(Form.release oder ähnliches).<br>
      Also entweder wird noch von irgendwo auf die Form zugegriffen - eher unwahrscheinlich<br>- oder der Speicher für diese Form ist schon nicht mehr da, so dass form.release in die Leere geht.<br>
      Fragt sich, wie man das vermeiden kann?<br>

      Gruß<br>
      Matthia

      Comment


      • #4
        Hallo Matthias,<br>das Formular muss nicht explizit freigeben werden, wenn im OnClose Event Action auf caFree gesetzt wird. Wenn Du im OnClose EventHandler eine Message (PostMessage) ans Hauptformular sendest und dort die Referenz auf Nil setzt reicht das aus

        Comment


        • #5
          Hallo,<br>

          das caFree scheint es zu tun. Vielen Dank!<br>
          Trotzdem nochmal dazu:<br>
          Ich weiß inzwischen, wo es daneben geht:<br>
          Wenn ich im Hauptprogramm einen globalen Exceptionhandler habe (Application.onexception)<br>
          wird der beim Freigeben des "Unterformulars" aufgerufen. Die Fehlermeldung: "Abstrakter Fehler".<br>
          Ich habe zuerst immer auf Sender.Classname zugegriffen (um in etwa zu wissen, wo der Fehler auftritt).<br>
          Das ging aber hier offenbar gegen den Baum, weil das Unterformular (als Sender) wohl schon freigegeben war.<br>
          Soweit zum Fehler.<br>
          Die Frage ist nur, warum da eine Exception ausgelöst wird?<br>
          Und warum passiert nichts weiter, wenn ich keinen Programmabbruch im Exceptionhandler vorsehe.<br>
          Es geht alles normal weiter und der GUI-Verbrauch geht wieder zurück - also ist das Formular<br>
          doch ordentlich freigegeben!?<br>

          Gruß<br>
          Matthia

          Comment


          • #6
            Vielleicht hilft es Dir weiter, wenn Du herausbekommst, ob und wann die Form freigegeben wurde.
            Bei allen eigenen Klassen empfiehlt es sich, den constructor und destructor zu überschreiben.
            Wenn Du dann dort Breakpoints setzt, dann kannst Du die Erzeugnungs- und Zerstörungsabfolge kontrollieren.
            Bisweilen kann man im Aufruf-Stack auch noch ersehen, wer die Zerstörung initiiert hat

            Comment


            • #7
              Hallo,<BR>
              eure Diskussion sollte die Lösung für mein Problem sein. Nur habe ich keine Ahnung, wie man durch eine Message ans Hauptformular dort die Referenz auf NIL setzt.<BR>
              Bin dankbar für Hilfe.<BR>
              Gruß Gunna

              Comment

              Working...
              X