![]() |
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:
Die Form habe ich in eine Klasse eingebaut. Gibt es eine sinnvolle Möglichkeit TGrundProgramm zu befreien (Free), wenn der Anwender die Form beendet?
TGrundProgramm = class(TObject)
frmFenster: TForm; end; Gruss Jens |
AW: Klasse beenden, wenn Form beendet wird
Von TComponent statt TObject ableiten und per Create(DeineForm) erzeugen
|
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.
|
AW: Klasse beenden, wenn Form beendet wird
Delphi-Quellcode:
Bin gerade noch am Probieren des Vorschlags von Bummi.
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.
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.. |
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); |
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 |
AW: Klasse beenden, wenn Form beendet wird
Zitat:
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. |
AW: Klasse beenden, wenn Form beendet wird
Ich habe das jetzt mal nach Vorschlag himitsu durchgeführt.
Den Owner habe ich so
Code:
ans Fenster angebunden.
frmFenster.InsertComponent(Self{TGrundProgramm});
Damit wird dann Destroy von TGrundprogramm aufgerufen, wenn frmFenster geschlossen wird. Er geht also -insoweit ich es jetzt getestet habe- Danke! @Thomas
Code:
ist das überhaupt notwendig, wenn doch schon aufgrund der Owner-Anbindung das Destroy des Grundprogramms aufgerufen wird?
frmFenster.OnClose := CloseFormInfo;
|
AW: Klasse beenden, wenn Form beendet wird
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz