Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   2. Form schliessen Variable=Nil (https://www.delphipraxis.net/162425-2-form-schliessen-variable%3Dnil.html)

ibp 22. Aug 2011 17:07

2. Form schliessen Variable=Nil
 
Hallo,

ich glaube heute ist es zu warm.... oder ich sehe den Wald vor Bäumen nicht usw... daher brauche ich kurz Hilfe....

Szenario bisher: Form_1 erstellt zur Laufzeit eine Form_2 und zwar modal. Schön und gut. Saubere Sache.
Delphi-Quellcode:
unit1:
...
Form2:=Tform.Create(nil);
try
  Form2.ShowModal;
finally
  FreeAndNil(Form2);
end;
...

Szenario jetzt: Die Form2 soll nicht mehr modal sein, kann aber jederzeit selber geschlossen oder erstellt werden oder Inhalte ändern sich oder wird bei Programmende einfach mit geschlossen. Form2 darf, wenn nur einmal existieren.

Mein Problem gerade. Wenn die Form2 geschlossen wird dann bekommt unit1 das nicht mit und die Variable Form2 ist noch assigned, auch wenn in Form2 unter FormClose Action:=caFree; eingestellt ist.

Delphi-Quellcode:
unit1:
uses uForm2,...

Form2:TForm2;
...
procedure TForm1.btnCreateForm2Click(Sender: TObject);
begin
  if Assigned(Form2) then <--- hier knallts beim 2. Aufruf wenn Form2 geschlossen wurde, da Form2<>Nil ist!
  begin
    ShowMessage('schon da!');
    Form2.BringToFront;
  end
  else
  begin
    Form2:=TForm2.Create(nil);
    Form2.Show;
  end;
end;

...

procedure TForm1.DingeDieDieWeltNichtBraucht;
begin
  ...
  Form2.ZeigeWasAnderes;
  ...
end;
Wie setze ich Form2=nil wenn der Anwender das Form_2 schliesst?

Ich möchte aber nicht FindComponent nutzen...

Danke schon mal....

jaenicke 22. Aug 2011 17:08

AW: 2. Form schliessen Variable=Nil
 
Setze Form2 einfach in OnDestroy von TForm2 auf nil. ;-)

ibp 22. Aug 2011 17:52

AW: 2. Form schliessen Variable=Nil
 
Zitat:

Zitat von jaenicke (Beitrag 1118664)
Setze Form2 einfach in OnDestroy von TForm2 auf nil. ;-)

haut nicht hin.. Bekomme ich beim Aufruf eine AV. Assigned(Form2)<>Nil!

WM_CLOSE 22. Aug 2011 18:38

AW: 2. Form schliessen Variable=Nil
 
setze in OnCreate/OnDestroy eine Klassenvariable auf true/false. Die kannst du dann abfragen.

Chemiker 22. Aug 2011 19:45

AW: 2. Form schliessen Variable=Nil
 
Hallo,

das Form2 ist in den Optionen auf verfügbar eingestellt?

Bis bald Chemiker

ibp 22. Aug 2011 19:51

AW: 2. Form schliessen Variable=Nil
 
Zitat:

Zitat von Chemiker (Beitrag 1118689)
das Form2 ist in den Optionen auf verfügbar eingestellt?

Ja ... ich kann leider nicht nur mit "Ja" antworten, da es anscheinend eine zu kurze Antwort ist! :roll:

Habe das jetzt so gelöst...

Delphi-Quellcode:
unit1;
..
type
  TForm1 = class(TForm)
    btnCreate: TButton;
    btnTest: TButton;
    procedure FormDestroy(Sender: TObject);
    procedure btnCreateClick(Sender: TObject);
    procedure btntestClick(Sender: TObject);
  private
    { Private-Deklarationen }
    Form2:TForm2;
  public
    { Public-Deklarationen }
  end;

..

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Form2.free;
end;

procedure TForm1.btnCreateClick(Sender: TObject);
begin
  if Assigned(Form2) then
  begin
    Form2.BringToFront;
  end
  else
  begin
    Form2       := TForm2.Create(nil);
    Form2.PFree := @Form2;
    Form2.Show;
  end;
end;

////////////////////////////////////////////////////////

unit2;
..
type
  TForm2 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    PFree: ^TForm; // Adresse von
  end;

..

procedure TForm2.FormCreate(Sender: TObject);
begin
  PFree:=nil;
end;

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

procedure TForm2.FormDestroy(Sender: TObject);
begin
  if Assigned(PFree) then
  begin
    PFree^:=nil;
  end;
end;

jaenicke 22. Aug 2011 19:56

AW: 2. Form schliessen Variable=Nil
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von ibp (Beitrag 1118668)
Zitat:

Zitat von jaenicke (Beitrag 1118664)
Setze Form2 einfach in OnDestroy von TForm2 auf nil. ;-)

haut nicht hin.. Bekomme ich beim Aufruf eine AV. Assigned(Form2)<>Nil!

Keine Ahnung wie du das machst, bei mir geht das problemlos. Siehe Anhang.

Aber eine andere Frage: Wozu zerstörst du das Formular eigentlich immer wieder? Es reicht doch, es bei der ersten Verwendung zu erstellen und danach einfach sichtbar oder unsichtbar zu machen.

Luckie 22. Aug 2011 20:01

AW: 2. Form schliessen Variable=Nil
 
Na ja, wenn ich es schon dynamisch erstelle, dann auch richtig. Ansonsten kann ich in den Projektoptionen ja auch einstellen, dass es gleich erzeugt werden soll. Aber warum den Speicher unnütz belasten, wenn es nicht gebraucht wird?

ibp 22. Aug 2011 20:04

AW: 2. Form schliessen Variable=Nil
 
Zitat:

Zitat von jaenicke (Beitrag 1118697)
Zitat:

Zitat von ibp (Beitrag 1118668)
Zitat:

Zitat von jaenicke (Beitrag 1118664)
Setze Form2 einfach in OnDestroy von TForm2 auf nil. ;-)

haut nicht hin.. Bekomme ich beim Aufruf eine AV. Assigned(Form2)<>Nil!

Keine Ahnung wie du das machst, bei mir geht das problemlos. Siehe Anhang.

Ja, der Unterschied liegt wohl bei den Optionen und den verfügbaren Formularen (Danke @Chemiker!)

Bei mir stehen die Formulare in den Optionen auf verfügbar!

Zitat:

Zitat von jaenicke
Aber eine andere Frage: Wozu zerstörst du das Formular eigentlich immer wieder? Es reicht doch, es bei der ersten Verwendung zu erstellen und danach einfach sichtbar oder unsichtbar zu machen.

Weil sie nicht immer gebraucht werden! Es kann sein, dass jemand das Fenster 10 mal beim arbeiten benutzt oder aber auch überhaupt nicht!

Chemiker 22. Aug 2011 20:13

AW: 2. Form schliessen Variable=Nil
 
Hallo ipg,


reicht es nicht das Form2 statt mit From2.free einfach mit FreeAndNil(Form2) freizugeben?

Bis bald Chemiker


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.
Seite 1 von 4  1 23     Letzte »    

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