Announcement

Collapse
No announcement yet.

action := cafree - brauche Erklärung

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

  • action := cafree - brauche Erklärung

    Hallo,

    ich verstehe etwas grundsätzlich nicht.

    2 Forms: Form1 und Form2. OnButtonClick in Form1:

    <pre>
    Form2 := TForm2.create(self);
    Form2.showmodal;
    showmessage(Form2.edit1.text);
    </pre>

    In Form2 ist aber in OnClose angegeben action := cafree. Wieso kann ich dann nach dem Schließen (nach showmodal) trotzdem auf den Text von Form2.edit1. zugreifen?

    Wäre grundsätzlich wichtig für mich zu wissen, da man ja oft Infos aus anderen Forms holt und diese mit showmodal anzeigt.

    Danke im Voraus...

    Felix

  • #2
    Normalerweise sollte man dies dann nicht tun. Wenn Action = caFree ist wird NICHT .Free aufgerufen sondern .Release. Es besteht zwischen beiden Methoden ein rießiger Unterschied. Während .Free sofort das Formular zerstört wird bei .Release eine Message = cm_Release ans Formular gepostet!!. Erst wenn der Prozess-Message-Queue im Application.Run durch GetMessage() ausgelesen wurde, wird auch die cm_Release Message bearbeitet. Da Du KEIN Application.ProcessMessage NACH .ShowModal ausführst wird auch der Messageque nicht sofort nach .ShowModal ausgelesen. Fazit: nach .ShowModal exisistiert das Formular noch solange bis es die cm_Release Message empfangen hat. <br> Probier doch mal nach dem .ShowModal Application.ProcessMessages aufzurufen und danach auf das Formular zuzugreifen.

    Gruß Hage

    Comment


    • #3
      Hallo Hagen,

      danke für die Super-Erklärung! Wenn ich Application.ProcessMessages einbaue, wird ein Leerstring angezeigt. (Ich hatte an sich eine Zugriffsverletzung erwartet, denn das Formular existiert doch gar nicht mehr!?).

      Ist es dann richtiger, action := cafree rauszunehmen und zu schreiben:
      <pre>
      Form2 := TForm2.create(self);
      try
      Form2.showmodal;
      showmessage(Form2.edit1.text);
      finally
      Form2.release;
      end;
      </pre>

      Gruß Felix..

      Comment


      • #4
        Richtig, das ist perfekt. Es gilt die goldene Regel, <b>derjenige der eine Resource erstellt ist auch für dessen Freigabe verantwortlich</b> das krasse Gegenteil wären dann <b>selbstzerstörende</b> resourcen. In solchen Fällen fragen sich die Programmer immer "Muß ich nun, oder muß ich nun nicht, die Resource freigeben ??"

        Gruß Hage

        Comment


        • #5
          PS: allerdings kannst'e auch dann .Free aufrufen

          Comment


          • #6
            Super, danke. Das hat mich weitergebracht.

            Gruß Felix

            Comment


            • #7
              oder...<br>
              <PRE>
              Form2 := TForm2.create(self);
              try
              Form2.showmodal;
              showmessage(Form2.edit1.text);
              finally
              freeAndNil(Form2) //
              end;
              </PRE>
              <br>
              Dietma

              Comment


              • #8
                @Dietmar, Warum ? in den meisten Fällen ist/sollte Form2 eine lokale Variable sein, d.h. nach dem .Free wird garantiert NIE wieder auf Form2 zugegriffen

                Comment


                • #9
                  @Hagen: Wollte nur eine weitere Alternative aufzeigen

                  Comment

                  Working...
                  X