Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Projektplanung und -Management (https://www.delphipraxis.net/85-projektplanung-und-management/)
-   -   (Formular-)Handling größerer Projekte (https://www.delphipraxis.net/184235-formular-handling-groesserer-projekte.html)

Delbor 12. Mär 2015 13:52

AW: (Formular-)Handling größerer Projekte
 
Hi zusammen
Zitat:

Zitat von bcvs (Beitrag 1293159)
Zitat:

Zitat von Delbor (Beitrag 1293128)
Zitat:

Zitat von bcvs (Beitrag 1293019)
Diese Diese Instanz gibt sich selbst frei, wenn im das Action im Onclose auf caFree steht.

Das stimmt so nicht. Der Parameter Action steuert lediglich, was geschehen soll. Wird ihm caFree zugewiesen, wird das Formular tatsächlich geschlossen
Nach wie vor: ein Formular, das sich selbst freigeben soll, muss mit Release geschlossen werden.

Doch, das stimmt. Hast du dein Beispiel mal ausprobiert? Das funktioniert einwandfrei, ohne AV.

Mit Action:= caFree wird das Formular geschlossen und der Speicher freigegeben, wie es auch in der von dir zitierten Hilfe steht. Dort steht allerdings nicht, wann und wie diese Freigabe geschieht. Ein Blick in den Quelltext von TCustomForm zeigt, dass dann nach dem Aufruf von OnClose einfach ein Release gemacht wird. Also sind wir uns wieder einig :cheers:

Ich hab mir nun mal ein kleines Beispielprogramm geschrieben:
Delphi-Quellcode:
unit TestMainUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus;

type
  TForm1 = class(TForm)
    btn1: TButton;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Bearbeiten1: TMenuItem;
    procedure btn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
     Form1.Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     Action := caFree;
end;

end.
Tatsächlich funktioniert das. Und zwar deshalb, weil in TCustomForm.Close geprüft wird, ob die Form die Mainform ist und anschliessend Application.Terminate aufgerufen wird (DelphiXE4). Nach einigen elses wird auch Release aufgerufen. Beim Durchsteppen sprang meine 'ausgeführte Zeile' gleich nach dem Terminate auf end.
Das verblüfft mich doch ziemlich, da auf Delphi-Treff lange ein Tutorial zum schliessen eines Objektes (einer Form?) aus sich selbst heraus zu finden war.
Kann es sein, dass dieses Release erst in neueren Delphiversionen integriert wurde?

Gruss
Delbor

BadenPower 12. Mär 2015 13:54

AW: (Formular-)Handling größerer Projekte
 
[QUOTE=mm1256;1293209]
Delphi-Quellcode:
  if (Result = nil) then
   begin
    Result := TForm(AFormClass.Create(Application));
   end;
  if Assigned(Result) then // sonst knallts !!!!
  Result.Show;
Wenn Du hier Angst hast, dass es knallt und deshalb die Assigned-Abfrage eingefügt hast, dann darfst Du das unten auch nicht so machen:

Delphi-Quellcode:
  with TFrmClient1.Create(Application) do Show;
.
EDIT:
Da war ein Fehler in der Abfrage

mm1256 12. Mär 2015 14:01

AW: (Formular-)Handling größerer Projekte
 
Dazu kommt es doch gar nicht, denn denn wäre ja
Code:
Application.Components[i] is TFrmClient1
schon FALSE

Delbor 12. Mär 2015 14:09

AW: (Formular-)Handling größerer Projekte
 
Hi mm1256

Alternativ könntest du die Clientforms, die du zur Laufzeit erstellst, auch in eine (generische?) Objektliste stecken, dann müsstest du nicht alle Komponenten der Anwendung durchlaufen, sondern nur den Listeninhalt. Solltest du eine ältere Delphiversion haben, die noch keine Objectlisten kennt, kannst du auch ein TList-Objekt benutzen und da einen Zeiger ablegen.

Gruss
Delbor

Sir Rufo 12. Mär 2015 14:15

AW: (Formular-)Handling größerer Projekte
 
Zitat:

Zitat von Delbor (Beitrag 1293220)
Hi mm1256

Alternativ könntest du die Clientforms, die du zur Laufzeit erstellst, auch in eine (generische?) Objektliste stecken, dann müsstest du nicht alle Komponenten der Anwendung durchlaufen, sondern nur den Listeninhalt. Solltest du eine ältere Delphiversion haben, die noch keine Objectlisten kennt, kannst du auch ein TList-Objekt benutzen und da einen Zeiger ablegen.

Gruss
Delbor

Dafür nimmt man Delphi-Referenz durchsuchenSystem.Contnrs.TComponentList, denn dafür wurde die gebaut

mm1256 12. Mär 2015 14:15

AW: (Formular-)Handling größerer Projekte
 
Zitat:

Zitat von Delbor (Beitrag 1293220)
Hi mm1256

Alternativ könntest du die Clientforms, die du zur Laufzeit erstellst, auch in eine (generische?) Objektliste stecken, dann müsstest du nicht alle Komponenten der Anwendung durchlaufen.....

Danke für den Tipp. Application.ComponentCount hab ich natürlich vorher mal getestet, weil, Performance möchte ich nach Möglichkeit nicht verschenken. Auch wenn's nur Kleinigkeiten sind. Es scheint so zu sein, dass Application.ComponentCount nur die Anzahl der aktiven Fenster beinhaltet. Weil ich diese ja immer wieder freigebe, wenn sie nicht mehr gebraucht werden, dürfte Application.ComponentCount i.d.R. nicht viel größer als 10 sein. Ich denke, das ist also keine Spassbremse :thumb:

EDIT

Zitat:

Zitat von Sir Rufo (Beitrag 1293221)
Dafür nimmt man Delphi-Referenz durchsuchenSystem.Contnrs.TComponentList, denn dafür wurde die gebaut

Geil, was ihr so alles wisst. Das kannte ich noch gar nicht.

Sir Rufo 12. Mär 2015 14:20

AW: (Formular-)Handling größerer Projekte
 
Zitat:

Zitat von mm1256 (Beitrag 1293222)
Es scheint so zu sein, dass Application.ComponentCount nur die Anzahl der aktiven Fenster beinhaltet.

Wenn du
Delphi-Quellcode:
Application
als Owner nur den Formularen gibst, was soll da auch sonst noch drin sein?

Dort ist das drin, was du da rein steckst:
Delphi-Quellcode:
program foo;

...

begin
  Application.Initialize;
  Application.CreateForm( TFooForm, FooForm ); // <- Da, wird Owner
  Application.Run;
end.

BadenPower 12. Mär 2015 14:27

AW: (Formular-)Handling größerer Projekte
 
Zitat:

Zitat von Delbor (Beitrag 1293220)
dann müsstest du nicht alle Komponenten der Anwendung durchlaufen,

Über wieviele Millisekunden reden wir hier?

Du gehst ja nicht alle Komponenten der Anwendung durch, sondern wie Sir Rufo schon richtig angemerkt hat, nur die Komponenten deren Owner "Application" ist.
Und dies sind eben meistens nur die Formulare.

mm1256 12. Mär 2015 14:28

AW: (Formular-)Handling größerer Projekte
 
Zitat:

Zitat von Sir Rufo (Beitrag 1293223)
Wenn du
Delphi-Quellcode:
Application
als Owner nur den Formularen gibst, was soll da auch sonst noch drin sein?

Ooooops....stimmt. Eigentlich logisch. Danke für die Erklärung. :thumb:

Delbor 12. Mär 2015 16:42

AW: (Formular-)Handling größerer Projekte
 
Hi zusammen
Zitat:

Zitat von BadenPower (Beitrag 1293225)
Zitat:

Zitat von Delbor (Beitrag 1293220)
dann müsstest du nicht alle Komponenten der Anwendung durchlaufen,

Über wieviele Millisekunden reden wir hier?

Du gehst ja nicht alle Komponenten der Anwendung durch, sondern wie Sir Rufo schon richtig angemerkt hat, nur die Komponenten deren Owner "Application" ist.
Und dies sind eben meistens nur die Formulare.

Daran hab ich erstmal nicht gedacht - mein wirklich 'rotes Tuch' ist denn auch zum Bleistift Findcomponent, das die kompletten Komponenten eines Containers durchläuft. Wenn dieser eine Form ist, kann das recht happig werden, wenn jede Komponente so identifiziert werden soll...


Gruss
Delbor


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:02 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz