Delphi-PRAXiS
Seite 2 von 4     12 34      

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 20:22

AW: 2. Form schliessen Variable=Nil
 
Zitat:

Zitat von Chemiker (Beitrag 1118704)
reicht es nicht das Form2 statt mit From2.free einfach mit FreeAndNil(Form2) freizugeben?

unit2 hat keinen Zugriff auf Variablen der unit1!

Schau mal hin wo ich Form2.free ausführe! ;-)

Chemiker 22. Aug 2011 20:44

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

das Problem ist, dass Du in Form2.FormClose mit Action := caFree; den Speicher frei gibst, aber in Form1 noch auf das Form2 zeigt das nicht mehr vorhanden ist. Wenn Du das weglässt kannst Du doch jederzeit in Form1 mit FreeAndNil (Form2) das Form aus dem Speicher löschen und hast Form2 auf Nil gesetzt und kannst es anschließend wieder neu erzeugen.

Bis bald Chemiker

ibp 22. Aug 2011 20:51

AW: 2. Form schliessen Variable=Nil
 
Zitat:

Zitat von Chemiker (Beitrag 1118718)
...das Problem ist, dass Du in Form2.FormClose mit Action := caFree; den Speicher frei gibst, aber in Form1 noch auf das Form2 zeigt das nicht mehr vorhanden ist. Wenn Du das weglässt kannst Du doch jederzeit in Form1 mit FreeAndNil (Form2) das Form aus dem Speicher löschen und hast Form2 auf Nil gesetzt und kannst es anschließend wieder neu erzeugen.

Ja genau das war ja das Problem, wenn Form2 durch den "X"-Button geschlossen wird und nur durch den kann Form2 in diesem Fall geschlossen werden, dann zeigt in unit1 die Variable Form1 natürlich noch auf den Speicherbereich und assigned(Form2) ist dann true!

Lemmy 22. Aug 2011 21:04

AW: 2. Form schliessen Variable=Nil
 
Hi,

Zitat:

Zitat von ibp;1118694
[DELPHI
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;

..
[/DELPHI]

das dürfte das Problem sein - vermutlich hast Du in Unit2 auch Form2:TForm2 irgend wo stehen und dann hast Du an der Stelle in Unit 1 an der du auf NIL testest 2 Variablen mit dem selben Namen. Das kann dann nur schief gehen..

Grüße

Sir Rufo 22. Aug 2011 22:16

AW: 2. Form schliessen Variable=Nil
 
So wie du das machst wird die Form TForm2 immer doppelt im Speicher vorhanden sein.

Einmal automatisch beim Programmstart und dann immer wieder beim Aufruf.
Irgendwie nicht logisch.

Also das Formular nicht automatisch erzeugen lassen.

Um TForm2 Modal aufzurufen folgender Code:
Delphi-Quellcode:
Procedure TForm1.OpenForm2Modal( Sender : TObject );
Var
  ModForm2 : TForm2;
begin
  ModForm2 := TForm2.Create( Self );
  Try
    ModForm2.ShowModal;
  Finally
    ModForm2.Free;
  end;
end;
Um die globale Variable "Form2" aus der Unit2 beim Free auf Nil zu setzen folgender Code
Delphi-Quellcode:
procedure TForm2.FormDestroy( Sender : TObject );
begin
  If Form2 = Self then
    Form2 := nil;
end;

FredlFesl 22. Aug 2011 22:52

AW: 2. Form schliessen Variable=Nil
 
Muss man nicht 'Release' anstelle von 'Free' aufrufen?

Chemiker 22. Aug 2011 23:41

AW: 2. Form schliessen Variable=Nil
 
Hallo,

@Sir Rufo: Soweit ich das Verstanden habe wollte er kein Modal-Form haben.

Ich würde es einfach so machen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(TestForm) then
  begin
    ShowMessage('Schon da');
    TestForm.Show;
  end else
  begin
    TestForm:=TForm2.Create(Self);
  end;
end;
Delphi-Quellcode:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Caption:= 'Form1 - Test';
  Show;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  if Assigned(TestForm) then
  begin
    TestForm:=NIL;
  end;
end;

end.
Bis bald Chemiker

Sir Rufo 23. Aug 2011 03:02

AW: 2. Form schliessen Variable=Nil
 
Zitat:

Zitat von Chemiker (Beitrag 1118747)
Hallo,

@Sir Rufo: Soweit ich das Verstanden habe wollte er kein Modal-Form haben.

Du hast recht ... es war modal und jetzt nicht mehr ... :oops:
Zitat:

Zitat von Chemiker (Beitrag 1118747)
Ich würde es einfach so machen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(TestForm) then
  begin
    ShowMessage('Schon da');
    TestForm.Show;
  end else
  begin
    TestForm:=TForm2.Create(Self);
  end;
end;

öhhm ... würde ich so machen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned( Form2 ) then
    begin
      Form2 := TForm2.Create( Self );
    end
  else
    begin
      ShowMessage( 'Schon da' );
    end;
  Form2.Show;
end;
Zitat:

Zitat von Chemiker (Beitrag 1118747)
Delphi-Quellcode:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  Caption:= 'Form1 - Test';
  Show;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  if Assigned(TestForm) then
  begin
    TestForm:=NIL;
  end;
end;

end.
Bis bald Chemiker

Das kann aber auch ins Auge gehen, wenn es 2 Instanzen von TForm2 gibt. Darum besser so
Delphi-Quellcode:
procedure TForm2.FormDestroy(Sender: TObject);
begin
  // Nur wenn die aktuelle Instanz mit der in der globalen Variablen "Form2" gespeicherten übereinstimmt
  if Form2 = Self then
  begin
    Form2 := NIL;
  end;
end;

FredlFesl 23. Aug 2011 06:40

AW: 2. Form schliessen Variable=Nil
 
Was passiert, wenn Form2 zwischen Close und Destroy angezeigt werden soll?

Wieso nicht Form2 nicht einfach im FormClose auf Nil setzen?

Weiterhin sollte das Anzeigen und die Logik, ob Form2 schon da ist, in TForm2 selbst implementiert werden. Entweder in einer Class Procedure 'ShowNonModal', oder in einer Funktion, die den Zugriff auf Form2 steuert (Ich würde Letzteres vorziehen)
Delphi-Quellcode:
Function Form2 : TForm2;

Implementation
Var
  _Form2 : TForm2;

Function Form2 : TForm2;
Begin
  If _Form2 = Nil Then
    _Form2 := TForm2.Create(Nil);
  Result := _Form2;
End;
...
Procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
Begin
  Action := caFree;
  If Self=_Form2 then
    _Form2 := Nil;
End;
Nun kann ich Form2 auch dann anzeigen, wenn es gerade geschlossen, aber noch nicht freigegeben wurde.

[edit]Oh, die Verfeinerung von Sir Rufo fehlt[/edit]

ibp 23. Aug 2011 07:19

AW: 2. Form schliessen Variable=Nil
 
sehe ich das falsch oder nutzt ihr dazu eine globale Variable um in unit2 die Form beim beenden auf NIL zu setzen damit es dann in unit1 vorhanden ist?

Also bei mir ist das so, dass unit2 keinen Zugang zu unit1 hat.


Wie macht das eigentlich TComponentList? Wenn dort ein Objekt sich selber zerstört, dann löscht sie den Eintrag selber. War spät gestern und bin nicht ganz hinter die Logik gestiegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr.
Seite 2 von 4     12 34      

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