AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

2. Form schliessen Variable=Nil

Ein Thema von ibp · begonnen am 22. Aug 2011 · letzter Beitrag vom 28. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#1

AW: 2. Form schliessen Variable=Nil

  Alt 22. Aug 2011, 22:52
Muss man nicht 'Release' anstelle von 'Free' aufrufen?
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: 2. Form schliessen Variable=Nil

  Alt 22. Aug 2011, 23:41
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 03:02
Hallo,

@Sir Rufo: Soweit ich das Verstanden habe wollte er kein Modal-Form haben.
Du hast recht ... es war modal und jetzt nicht mehr ...
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;
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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 06:40
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]
Das Bild hängt schief.

Geändert von FredlFesl (23. Aug 2011 um 06:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#5

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 07:19
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 07:25
Ich weiß ja nicht mit welchem Delphi du programmierst, aber wenn ich einfach mal ein Formular neu erstelle, dann habe ich da folgenden Code
Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.
und nun rat mal, was die Variable "Form2" ist ... ein globale

Und um von einer anderen Form diese steuern zu können muss ich ja idR dort die Unit einbinden:
Delphi-Quellcode:
unit Unit1;

interface

...

implementation

uses
  Unit2;

...

end.
und somit kennt die Unit1 auch die Variable "Form2"
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 07:31
Hallo,

für nichtmodale Forms müssen meiner Meinung eine globale Variabel erzeugt werden, wie soll das sonst funktionieren?

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#8

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 07:33
@Sir Rufo,

die 2. Form soll dynamisch erzeugt werden und steht in den Optionen nicht unter automatisch erzeugen. Ist es dann wirklich so, dass dann die Variable Form2 in der unit1 direkt ansprechbar ist und wenn sie nil ist dass dann in unit1 übergibt? Was ist mit mehreren Instanzen von der Form2, wenn diese auch aus anderen Units genutzt wird?

@Chemiker habe das ja auch schon gelöst, siehe Post 6
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 08:02
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)
<CODE>
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]
Damit kann ich auch leben - hat sogar ein Hauch mehr Charme als meine Variante
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#10

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 10:51
so nun fasse ich zusammen...

Aufgabenstellung:

Aus Unit_x wird zu Laufzeit eine Form_Y aus Unit_y erzeugt. Form_Y wird nicht automatisch erzeugt. Aus unit_x kann auf die Form_Y über eine private Variable zugegriffen werden. Die Form_Y kann durch den Schließen-Button nach Bedarf beendet werden, dabei wird die Variable in Unit_x auf Nil gestzt. Unit_y kennt nicht Unit_x. Es können mehrere Instanzen von Form_y aus anderen Units erzeugt werden.

Meine Lösung:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Unit2,

...

type
  TForm1 = class(TForm)
    btnCreate: TButton;
    btnTest: TButton;
    procedure FormDestroy(Sender: TObject);
    procedure btnShowTestFormClick(Sender: TObject);
    procedure btntestClick(Sender: TObject);
  private
    { Private-Deklarationen }
    TestForm:TForm2;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

...

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

procedure TForm1.btnShowTestFormClick(Sender: TObject);
begin
  TestForm.DoShow(@TestForm);
end;

procedure TForm1.btnTestClick(Sender: TObject);
begin
  if Assigned(TestForm) then
    ShowMessage('TestForm existiert')
  else
    ShowMessage('TestForm nicht existent')
end;
Delphi-Quellcode:
unit Unit2;

type
  TForm2 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    PCallVarAdr:^TForm;
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent; const SelfVarAdr:Pointer); overload;
    procedure DoShow(const SelfVarAdr:Pointer);
  end;

implementation

{$R *.dfm}

constructor TForm2.Create(AOwner: TComponent; const SelfVarAdr:Pointer);
begin
  inherited Create(AOwner);

  PCallVarAdr := SelfVarAdr;

  Show;
end;

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

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

procedure TForm2.DoShow(const SelfVarAdr:Pointer);
begin
  if Assigned(TForm(SelfVarAdr^)) then
  begin
    BringToFront;
  end
  else
  begin
    TForm2.Create(nil,SelfVarAdr);
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:16 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