Announcement

Collapse
No announcement yet.

FreeAndNil

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

  • FreeAndNil

    Hallo,<br>
    <br>
    ich habe ein Object vom Typ TWordApplication mit Create(nil) erstellt. Bisher dachte ich es reicht, das Object mit Free freizugeben. So verwendet die BeispielAnwendung Demos\ActiveX\OLEAuto\Word8 zum Beenden jedoch:<br>
    <br>
    WordObj.Free;<br>
    WordObj := nil;<br>
    <br>
    Die Notwendigkeit des NIL hat sich auch in meiner Anwendung rausgestellt, da sonst Zugriffsverletzungen auftreten. Aber warum wird diese Zuweisung von NIL gemacht. Es gibt zwar in Delphi auch die Funktion FreeAndNil, aber deren Sinn ist ja leider auch nicht weiter erläutert.<br>
    <br>
    Danke
    Schöne Grüße, Mario

  • #2
    Hallo Mario,

    Free gibt den Speicher eines Objektes frei aber seine Adresse bleibt weiterhin bestehen, erst die Zuweisung von NIL "löscht" die Adresse.
    Deshalb ergibt auch if assigned(obj) TRUE wenn ein Object mit Free freigegeben wurde aber nicht auf NIL gesetzt ist. Die Funktion FreeAndNil (ab Delphi 5) gibt ein Objekt mit Free Frei und setzt es auf NIL. Hat also die gleiche Funktion wie die Anweisung Obj.Free; obj:=NIL;

    Carste

    Comment


    • #3
      ergänzung: FreeAndNil kopiert zuerst die referenz, setzt die übergebene variable auf nil und ruft erst dann free auf. ist also auf nummer sicher und sollte bei zeitkritischen anwendungen benutzt werden (threads) anstatt es manuell freizugeben.

      andr

      Comment


      • #4
        verursacht bei mir eine zugriffsverletzung!
        muß ich da etwas beachten?

        ich rufe das form mit showmodal auf und schließe es so:

        <pre>
        procedure Tform1.btn_backClick(Sender: TObject);
        begin
        freeandnil(form1);
        //close;
        end;</pre&gt

        Comment


        • #5
          hatte wirklich mit showmodal zu tun!!! (bitte wenns falsch ist trotzdem eine lösung anbieten!)

          BINE :

          Comment


          • #6
            @Bine:
            <br>Hi
            <br>
            <br>öffnen von Fenstern mache ich meistens so:
            <br>
            <br>if xForm = nil then xForm := TxForm.Create(Self);
            <br>xForm.Show;
            <br>
            <br>d.h. xForm <> NIL => Fenster ist schon geöffnet worden
            <br>
            <br>Und dann noch wichtig im Form X folgendes eingeben:
            <br>procedure TxForm.FormClose(Sender: TObject;
            <br>var Action: TCloseAction);
            <br>begin
            <br>action := caFree;
            <br>end;
            <br>
            <br>procedure TxForm.FormDestroy(Sender: TObject);
            <br>begin
            <br>if xForm = Self then xForm := nil;
            <br>end;
            <br>
            <br>Die Fenster, die so geöffnet werden, müssen noch unter Projekt/optionen von links nach rechts verschoben werden.
            <br>
            <br>mfg
            <br>P

            Comment


            • #7
              *GGGGGGGGGGGG* des brauchst mir net sagen mit den optionen *lach*

              danke trotzdem

              Comment


              • #8
                Hi

                TForms sollten generell NICHT mit .Free zerstört werden, einzigste Ausnahme -> das Form besitzt noch kein fensterhandle. Ansonsten sollte ein Form immmer mit .Release freigegeben werden.

                Gruß Hage

                Comment


                • #9
                  soo jetzt wieder eine frage?

                  unterschied zwischen release und freeandnil (kenn mich mit den ressourcenverwaltung net aus!)

                  BIN

                  Comment


                  • #10
                    Hallo Hagen,
                    <br>Ist das was ich geschrieben habe nicht OK?
                    <br>Ich habe schon viel gesehen aber nichts hat so gut funktioniert wie der Code, den ich geschrieben habe. Alles andere hat irgendwie Probleme gemacht.
                    <br>Was will ich:
                    <br>-Fenster öffnen
                    <br>-Fenster schließen
                    <br>-Fenster A öffnen Fenster B wird aus Fenster A heraus geöffnet. Fenster A wird geschlossen und automatisch wird Fenster B geschlossen und ggf. ein Fenster C, das aus Fenster B heraus geöffnet wurde.
                    <br>
                    <br>Wenn du eine bessere Methode kennst, dann wäre ich dir sehr dankbar, wenn du dich nochmal meldest.
                    <br>
                    <br>Danke!
                    <br>
                    <br>mfg
                    <br>p

                    Comment


                    • #11
                      Hi

                      @Patrick, NEIN, Dein Code ist absolut sauber Ich selber nutze ihn in ähnlicher Form.

                      Es ging mir aber um die Frage ist .Free gut und was ist equivalent besser. Nun, .Free zerstört SOFOT das Formular. Sehen wir uns folgenden Code an:

                      <pre>

                      function GetXYZ: String;
                      var
                      F: TForm1;
                      begin
                      Result := '';
                      F := TForm1.Create(Self);
                      try
                      if F.ShowModal = mrOk then
                      Result := F.Edit1.Text;
                      finally
                      F.Free;
                      end;
                      end;

                      </pre>

                      Mit Deiner Methode wird beim Schließen des Form1 intern .Release aufgerufen. Das ist Ok. Wichtig ist bei einem .Free im Form1 selber, das die aufrufende Funktion noch auf das Form zugreift das schon zerstört wurde.

                      Was aber wenn die Entscheidung ob das Form zerstört oder nur unsichtbar gemacht werden soll, in der aufrufenden Routine liegen soll. Bei Deiner Methode wird das Form unweigerlich nach dem Schließen auch zerstört. Normalerweise sollte aber immer der Erzeuger der Resource diese auch zerstören, also wie oben gezeigt.

                      Gruß Hage

                      Comment


                      • #12
                        @Hagen
                        <br>
                        <br>"Was aber wenn die Entscheidung ob das Form zerstört oder nur unsichtbar gemacht werden soll, in der aufrufenden Routine liegen soll. Bei Deiner Methode wird das Form unweigerlich nach dem Schließen auch zerstört. Normalerweise sollte aber immer der Erzeuger der Resource diese auch zerstören, also wie oben gezeigt. "
                        <br>
                        <br>ich vergaß noch zu erwähnen:
                        <br>wenn in form A form B geöffnet werden kann, so
                        gibt es folgenden Code in Form b:
                        <br>procedure TFormA.FormClose(Sender: TObject;
                        <br> var Action: TCloseAction);
                        <br>begin
                        <br> if Not (FormB = nil) Then
                        <br> FormB.Close;
                        <br> action := caFree;
                        <br>end;
                        <br>
                        <br>Bis dann ...
                        <br>
                        <br>mfg
                        <br>P

                        Comment


                        • #13
                          Hi

                          @Patrick, wird

                          <pre>

                          procedure TFormA.DoOpenB();
                          begin
                          FormB := TFormB.Create(Self);
                          end;<br>

                          procedure TFormB.DoOpenC();
                          begin
                          FormC := TFormC.Create(Self);
                          end;

                          </pre>

                          aufgerufen, und nun im Aufrufer FormA.Free oder FormA.Release ausgeführt werden FormB und FormC ebenfalls zerstört.

                          Zudem:

                          <pre>

                          if not (FormB = nil) then ;<br><br>
                          geht übersichtlicher mit<br><br>
                          if FormB <> nil then ;<br><br>

                          </pre>

                          Gruß Hage

                          Comment

                          Working...
                          X