Announcement

Collapse
No announcement yet.

Create Application

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

  • Create Application

    Hallo, sicherlich kann mir jemand im Forum den Unterschied zwischen:

    Form1:=TForm1.Create(Nil)

    Form1 := TForm1.Create(Application)

    Application.CreateForm(TForm1, Form1) in kurzen Sätzen erläutern. Danke Gruß ph.

  • #2
    Hallo,

    Fall 1: <br>
    Da Nil als Eigentümer dieser Formular-Instanz übergeben wird, muss sich der Aufrufer in jedem Fall selbst um das Abräumen der Ressourcen (d.h. freigeben der Formular-Instanz Form1 kümmern). Dieser Weg sollte immer dann verwendet werden, wenn man selbst die Lebensdauer der Formular-Instanz bestimmen will und diese nicht mit der Lebensdauer der Anwendung identisch ist.

    Fall 2: <br>
    Beim Ergeugen des Formulars wird die bereits laufenden Application-Instanz als Eigentümer des Formulars angegeben. Mit dem Abbleben von Application würde dann auch das Formular automatisch zerstört, was aber bei der Anwendung völlig ohne belang ist, da das Programmende immer mit dem Ende des eigenen Adressraums identisch ist. Daher ist es prinzipiell egal, ob Application oder Nil angegeben wird, wenn das Formular dynamisch erst zur Laufzeit erzeugt und zerstört wird.

    Fall 3: <br>
    Dieser Aufruf steht in einer DPR-Datei, auf diesem Weg erzeugt Delphi die automatisch beim Programmstart generierten Formular-Instanzen. Der erste Eintrag legt das <b>Hauptformular</b> der Anwendung fest

    Comment


    • #3
      Hallo,
      Vielen Dank für Ihre Erklärung. Mein Problem war oder ist auch noch, weil ich nicht genau weiß warum es jetzt funktioniert, das wenn ich das Formular wie im Fall2 erzeuge, dieses auch angezeigt wird und ich es auch beenden kann. Habe ich aber nach erzeugen des Formulars, die darin enthaltenen Anweisungen ausführen lassen, die auch zufriedenstellend abgearbeitet werden, über ein Schließen Button beendet, so erhielt ich die Fehlermeldung Zugriffsschutzverletzung.... aber erst wenn ich das Formular dreimal hintereinander aufgerufen habe und es jedesmal abarbeiten lasse. Dann habe lange herumgefummelt in Ihrem Buch Client/Server gestöbert, und es dann mit Fall1 probiert. Jetzt scheint es zu funktionieren. Haben Sie noch einen Rat wie eine Fehlermeldung Zugriffsschutzverletzung..., nach abarbeiten, folgendem schließen des Formulars herkommen kann. Für einen Rat bedanke ich mich schon jetzt. Gruß p

      Comment


      • #4
        Hallo,

        wenn das Formular eine Ereignisbehandlungsmethode für <b>OnClose</b> verwendet und dort dem Action-Parameter den Wert <b>caFree</b> zuordnet, wird die Formularinstanz beim Schließen zerstört:
        <pre>
        procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
        begin
        Action := caFree;
        end;
        </pre>
        Greift <b>danach</b> das Programm auf irgend einen Bestandteil dieses Formulars zu, so gibt es zwangsläufig eine Zugriffsverletzung.

        Alternativ zu <i>Action := caFree</i> könnte man das Erzeugen/Freigeben auch beim Aufrufer an einer Stelle einkapseln:
        <pre>
        procedure TFormEditManuskript.ActionManuskriptThemenExecute(
        Sender: TObject);
        begin
        with TFormEditManuskriptThemen.Create(Self) do
        try
        PanelTitel.Caption := DMManuskript.IBDSManuskriptARBEITSTITEL.Value;
        ShowModal;
        finally
        Release;
        end;
        end;
        </pre>
        In diesem Fall wird die TForm-Methode <b>Release</b> erst dann aufgerufen, wenn das dynamisch zur Laufzeit erzeugte Formular nicht mehr benötigt wird

        Comment

        Working...
        X