Announcement

Collapse
No announcement yet.

Erzeugen/Freigeben von Formularen/Datenmodulen

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

  • Erzeugen/Freigeben von Formularen/Datenmodulen

    Wie erzeuge ich (richtig) zur Laufzeit ein Formular bzw. ein Datenmodul?
    Wie/Wann gebe ich es wieder (richtig) frei?

    Ich weis die Frage hört sich wie von vor X Jahren als programmieren mit Delphi noch in den Kinderschuhen stand an... Aber es ist mir immer noch unklar, zumal ich immer wieder auf unterschiedliche Antworten/Beispiele in diversen Foren gestoßen bin!?

    Was ist der Unterschied zwischen Release und Free? Worin besteht der
    Unterschied, wenn ich ein Formular mit Parent übergebe oder ohne?

    Beispiel für das Verwenden eines Datenmoduls/Formulars lokal in einer procedure:

    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>var</b>
    &nbsp; F : TForm2; <i>//oder TDatamodule1</i>
    <b>begin</b>
    &nbsp; <b>try</b> <i>// try vor dem create oder...</i>
    &nbsp;&nbsp;&nbsp; <i>//Variante 1:</i>
    &nbsp;&nbsp;&nbsp; F := TForm2.Create(self);
    <i>&nbsp;&nbsp;&nbsp; //Variante 2:</i>
    &nbsp;&nbsp;&nbsp; F := TForm2.Create(<b>nil</b>);
    &nbsp;&nbsp;&nbsp; <b>try</b> <i>// try nach dem create?</i>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F.ShowModal;
    &nbsp;&nbsp;&nbsp;<i>&nbsp; //Do Something</i>
    &nbsp;&nbsp;&nbsp;<b>finally</b>
    <i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Variante 1:</i>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F.Release;
    <i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Variante 2: </i>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F.Free;
    <i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Variante 3:
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//F nicht freigeben, wenn ein Parent übergeben wurde, denn dann macht er alles frei, wenn der Parent selbst freigegeben wird!</i>
    <b>&nbsp; end;</b>
    <b>end;</b>

    Beispiel für die globale Verwendung in einer Form:

    <b>unit</b> Unit1;
    <b>interface</b>
    <b>uses</b>
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    StdCtrls;

    <b>type</b>
    &nbsp;TForm1 = class(TForm)
    &nbsp;Button1: TButton;
    &nbsp;Button2: TButton;
    &nbsp;procedure FormCreate(Sender: TObject);
    &nbsp;procedure FormDestroy(Sender: TObject);
    &nbsp;procedure Button1Click(Sender: TObject);
    &nbsp;procedure Button2Click(Sender: TObject);
    &nbsp; <b>private</b>
    &nbsp;&nbsp;&nbsp;F : TDataModule1; <i>//oder TForm1</i>
    &nbsp; <b>public</b>
    <b>end;</b>

    <b>var</b>
    Form1: TForm1;

    <b>implementation</b>

    {$R *.dfm}

    <b>procedure</b> TForm1.FormCreate(Sender: TObject);
    <b>begin</b>
    &nbsp; <i>//Variante 1:</i>
    &nbsp;F := TDataModule1.Create(self);

    &nbsp; <i>//Variante 2:</i>
    &nbsp;F := TDataModule1.Create(<b>nil</b>);
    <b>end;</b>

    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>begin</b>
    <i>&nbsp;//F verwenden
    </i>&nbsp;F.DoSomething;
    <b>end;</b>

    <b>procedure</b> TForm1.Button2Click(Sender: TObject);
    <b>begin</b>
    <i>&nbsp;//F verwenden
    </i>&nbsp;F.DoSomethingElse;
    <b>end;</b>

    <b>procedure</b> TForm1.FormDestroy(Sender: TObject);
    <b>begin</b>
    <i>&nbsp;//Variante 1:
    </i>&nbsp;F.Release;
    <i>&nbsp;//Variante 2:
    </i>&nbsp;F.Free;
    <i>&nbsp;//Variante 3:
    &nbsp; //F nicht freigeben, wenn ein Parent übergeben wurde, denn dann macht er alles frei, wenn der Parent selbst freigegeben wird!
    </i><b>end;</b>
    <b>end.</b></p>

  • #2
    > F := TForm2.Create(self);

    TForm2-Instanz wird in die Verwaltungsliste von <self> eingetragen und wird auf jedenfall bei der Freigabe von <self> auch freigegeben. F kann aber jederzeit früher (z.B. um Resourcen zu sparen) auch schon freigegeben werden. Hierbei trägt es sich automatisch wieder aus der Verwaltungsliste von <self> aus.

    > F := TForm2.Create(nil);

    Hier mußt du auf jedenfall selbst für die Freigabe sorgen

    > F.Release;

    Sollte man verwenden, wenn man ein sichtbares nicht modales Fenster freigibt. Hier wird das Formular erst freigegeben wenn keine Windows-Message mehr für das Formular anliegt.

    > F.Free;

    Kann problemlos bei Modalen Formularen/Dialogen verwendet werden, da ShowModal erst zurückkommt wenn alle Windows-Messages abgearbeitet sind

    Comment


    • #3
      Danke erst mal für die Antwort.

      Kann man das so auch für Datenmodule sehen? Was ist die bessere/richtigere Variante? Wo sollte das "try" stehen

      Comment


      • #4
        Hi M...,

        das Try Finally bei deinem modalen Form ist schon richtig.
        Grundsätzlich erzeuge ich keine Datenmodule oder Formulare ohne Owner. So sollte man wenigstens die Application als Owner übergeben, damit beim Beenden der Anwendung vergessene Datenmodule oder Formulare zerstört werden.
        Datenmodule gehören auch bei mir in der Regel zu einem Formular und werden wie bei dir über Variable := TMyDataModul.Create(Self) erzeugt und damit automatisch beim Zerstören des Formulares freigegeben.
        Bei nicht modalen Formularen wird in der Procedure des OnClose - Event mit Action := caFree; dafür gesorgt, dass diese beim Schliessen freigegeben werden.
        Datenmodule, die nicht zu einem Formular gehören, kann man im Initialization der Unit erzeugen mit Application als Owner.
        Übergibt man als Owner nil, muss man im Finalization selbst freigeben.
        <CODE>
        //F nicht freigeben, wenn ein Parent übergeben wurde,
        </CODE>
        Achtung, nicht Parent und Owner verwechseln. Der Parent hat mit der Freigabe nichts zu tun.<BR><BR>
        Gruss, Fran

        Comment

        Working...
        X