AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Klasse beenden, wenn Form beendet wird

Ein Thema von Jens01 · begonnen am 4. Mai 2012 · letzter Beitrag vom 5. Mai 2012
Antwort Antwort
Jens01

Registriert seit: 14. Apr 2009
667 Beiträge
 
#1

Klasse beenden, wenn Form beendet wird

  Alt 4. Mai 2012, 11:56
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
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Klasse beenden, wenn Form beendet wird

  Alt 4. Mai 2012, 12:02
Von TComponent statt TObject ableiten und per Create(DeineForm) erzeugen
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Klasse beenden, wenn Form beendet wird

  Alt 4. Mai 2012, 12:17
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
667 Beiträge
 
#4

AW: Klasse beenden, wenn Form beendet wird

  Alt 4. Mai 2012, 12:32
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..
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#5

AW: Klasse beenden, wenn Form beendet wird

  Alt 4. Mai 2012, 12:36
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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Klasse beenden, wenn Form beendet wird

  Alt 4. Mai 2012, 13:02
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Klasse beenden, wenn Form beendet wird

  Alt 4. Mai 2012, 13:31
Zitat von Bummi:
if Assigned(g) then FreeAndNil(g);
Doppelt gemoppelt
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
667 Beiträge
 
#8

AW: Klasse beenden, wenn Form beendet wird

  Alt 4. Mai 2012, 14:07
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?
Achtung: Bin kein Informatiker sondern komme vom Bau.

Geändert von Jens01 ( 4. Mai 2012 um 14:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Klasse beenden, wenn Form beendet wird

  Alt 5. Mai 2012, 00:18
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 ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 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