Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Klasse beenden, wenn Form beendet wird (https://www.delphipraxis.net/168087-klasse-beenden-wenn-form-beendet-wird.html)

Jens01 4. Mai 2012 11:56

Klasse beenden, wenn Form beendet wird
 
Hallo ..

habe bei mir ein kleines Problem bei einem Klassenaufbau mit einer enthaltenen Form.
Die Klasse sieht stark verkürzt so aus :
Delphi-Quellcode:
TGrundProgramm = class(TObject)
  frmFenster: TForm;
end;
Die Form habe ich in eine Klasse eingebaut. Gibt es eine sinnvolle Möglichkeit TGrundProgramm zu befreien (Free), wenn der Anwender die Form beendet?

Gruss Jens

Bummi 4. Mai 2012 12:02

AW: Klasse beenden, wenn Form beendet wird
 
Von TComponent statt TObject ableiten und per Create(DeineForm) erzeugen

DeddyH 4. Mai 2012 12:17

AW: Klasse beenden, wenn Form beendet wird
 
Es sei denn, die Klasse erzeugt das Formular selbst, dann muss man den Owner später zuweisen. Aber um da etwas Genaueres sagen zu können, sind die Infos noch zu dürftig.

Jens01 4. Mai 2012 12:32

AW: Klasse beenden, wenn Form beendet wird
 
Delphi-Quellcode:
Es sei denn, die Klasse erzeugt das Formular selbst, dann muss man den Owner später zuweisen. Aber um da etwas Genaueres sagen zu können, sind die Infos noch zu dürftig.
Bin gerade noch am Probieren des Vorschlags von Bummi.

Ja, die Form wird in TGrundProgramm selbst erzeugt, D.H nach dem Createn der Form wird die Form dem Owner zugeordnet: Owner := frmFenster , oder?

Ich probiers mal aus..

himitsu 4. Mai 2012 12:36

AW: Klasse beenden, wenn Form beendet wird
 
Den Owner kann man nicht setzen.

Delphi-Quellcode:
// geht nicht, da readonly
X.Owner := Z;

// Den Owner setzt man, indem man die Komponente als Unterkomponente anmeldet.
Z.InsertComponent(X);

// Ich glaub InsertComponent sorgt selbst für das RemoveComponent, falls nötig,
// aber wenn nicht, dann müßte man seine Komponente vorher dort abmelden.
if Assigned(X.Owner) then
  X.Owner.RemoveComponent(X);
Z.InsertComponent(X);

Bummi 4. Mai 2012 13:02

AW: Klasse beenden, wenn Form beendet wird
 
Anhand eines Beispiels, ich hoffe ich habe die Anforderung richtig verstanden ..

Delphi-Quellcode:
unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type


  TGrundProgramm = class(TControl)
    frmFenster: TForm;
    protected
    Procedure CloseFormInfo(Sender:TObject;var Action: TCloseAction);
    public
    Procedure Showwindow;
    Constructor Create(AOwner:TComponent);override;
    Destructor Destroy;Override;
  end;
  TForm5 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
     g:TGrundProgramm;
    { Public-Deklarationen }
  end;

var
  Form5: TForm5;

implementation
uses Unit6;
{$R *.dfm}

{ TGrundProgramm }

procedure TGrundProgramm.CloseFormInfo(Sender: TObject;var Action: TCloseAction);
begin
  Free;
end;

constructor TGrundProgramm.Create(AOwner: TComponent);
begin
  inherited;
  frmFenster := TClassForm.Create(Self);
  frmFenster.OnClose := CloseFormInfo;
end;

destructor TGrundProgramm.Destroy;
begin
  Showmessage('Destroy');
  inherited;
end;



procedure TGrundProgramm.Showwindow;
begin
   frmFenster.Show;
end;

procedure TForm5.Button1Click(Sender: TObject);
begin
    g := TGrundProgramm.Create(self);
    g.Showwindow;
end;

procedure TForm5.Button2Click(Sender: TObject);
begin
  // Destroy wird beim drücken diese Buttons ausgeführt, ebenso beim Schliessen des frmFenster
  if Assigned(g) then FreeAndNil(g);
end

DeddyH 4. Mai 2012 13:31

AW: Klasse beenden, wenn Form beendet wird
 
Zitat:

Zitat von Bummi
Delphi-Quellcode:
if Assigned(g) then FreeAndNil(g);

Doppelt gemoppelt :mrgreen:
Bevor wir irgendwelche Dinge konstruieren: wozu ist diese Klasse denn überhaupt da, was macht sie, und wozu muss sie das Formular kennen? Das sieht mir irgendwie etwas komisch aus, wenn Non-VCL-Klassen VCL-Controls beinhalten, was aber nicht unbedingt heißen muss, dass der Ansatz falsch ist.

Jens01 4. Mai 2012 14:07

AW: Klasse beenden, wenn Form beendet wird
 
Ich habe das jetzt mal nach Vorschlag himitsu durchgeführt.
Den Owner habe ich so
Code:
frmFenster.InsertComponent(Self{TGrundProgramm});
ans Fenster angebunden.
Damit wird dann Destroy von TGrundprogramm aufgerufen, wenn frmFenster geschlossen wird. Er geht also -insoweit ich es jetzt getestet habe-
Danke!

@Thomas
Code:
frmFenster.OnClose := CloseFormInfo;
ist das überhaupt notwendig, wenn doch schon aufgrund der Owner-Anbindung das Destroy des Grundprogramms aufgerufen wird?

Bummi 5. Mai 2012 00:18

AW: Klasse beenden, wenn Form beendet wird
 
Zitat:

ist das überhaupt notwendig, wenn doch schon aufgrund der Owner-Anbindung das Destroy des Grundprogramms aufgerufen wird?
hängt davon ab wer wessen Owner ist ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr.

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