AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

2. Form schliessen Variable=Nil

Ein Thema von ibp · begonnen am 22. Aug 2011 · letzter Beitrag vom 28. Aug 2011
Antwort Antwort
Seite 4 von 4   « Erste     234
Benutzerbild von ibp
ibp

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

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 11: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
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.323 Beiträge
 
Delphi 10.3 Rio
 
#32

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 12:03
Hi,

Alternative zu deiner Zeiger-Geschichte wäre das OnDestroy-Event von Form2 auf eine Methode in Form1 umzuleiten und dort das Feld zu nillen:

Delphi-Quellcode:

  if not Assigned(TestForm) then
    TestForm:=TForm2.Create(self);
  TestForm.OnDestroy:=TestFormDestroy;
  TestForm.Show;
...
procedure TForm1.TestFormDestroy(Sender: TObject);
begin
  TestForm:=nil;
end;
Nachteil an der Geschichte wäre, wenn die OnDestroy schon durch was anderes belegt ist - hier könnte man diese Wert allerdings "zwischenspeichern" und dann im TEstFormDestroy aufrufen...

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.855 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#33

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 12:24
Hallo ibp,

nur wie willst Du das lösen, wenn Du von Form3 auf das Form2 zugreifen willst und das Form2 noch vorhanden ist?

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
 
#34

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 13:06
nur wie willst Du das lösen, wenn Du von Form3 auf das Form2 zugreifen willst und das Form2 noch vorhanden ist?
Als eigene Instanz. Es geht nicht darum, dass mehrere units auf die gleiche Instanz zugreifen, jede bekommt dann seine eigene.
  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
 
#35

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 13:18
Also bei der Aufgabenstellung sollte man das vielleicht so lösen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Unit2;

type
  TForm1 = class( TForm )

  private
    PrivateForm : TForm2;
    procedure SubFormDestroy( Sender : TObject );
    procedure ErzeugeSubForm( Sender : TObject );
...

implementation

procedure TForm1.ErzeugeSubForm( Sender : TObject );
begin
  PrivateForm := TForm2.Create( Self );
  PrivateForm.OnDestroy := SubFormDestroy;
end;

procedure TForm1.SubFormDestroy( Sender : TObject );
begin
  PrivateForm := nil;
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
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.855 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#36

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 13:20
Hallo ibp,

Zitat:
Form2 darf, wenn nur einmal existieren.
dann habe ich das falsch verstanden.

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

Registriert seit: 13. Okt 2010
Ort: Bayern
440 Beiträge
 
Delphi 10.3 Rio
 
#37

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 13:23
Ich weiss zwar nicht mehr, wo die Idee her ist, aber bei mir funktioniert das so: das bewusste Fenster bekommt einen wohldefinierten Namen - am Besten in einer Konstanten hinterlegt.

Diese Funktion findet ein Fenster mit einem bestimmten Namen:
Delphi-Quellcode:
function FindFormByName(AFormName: string): TForm;
var
  li: integer;
begin
  Result := nil;

  for li:= 0 to Screen.FormCount-1 do
  begin
    if (Screen.Forms[li].Name = AFormName) then
    begin
      Result := Screen.Forms[li];
      break;
    end;
  end;
end;
Diese Funktion aktiviert das Fenster, wenn bereits vorhanden, ansonsten wird es erzeugt:
Delphi-Quellcode:
const
  FORMNAME = 'MeinSuperFenster';
var
  lfrm : TMyForm; // das zu zeigende Fenster
begin
  lfrm := TMyForm(FindFormByName(FORMNAME));
  if Assigned(lfrm) then
  begin
    lfrm.Show;
    lfrm.BringToFront;
  end
  else
  begin
    lfrm := TMyForm.Create(Application);
    lfrm.Name := FORMNAME;
    lfrm.Show;
  end;
Hoffe, das hilft.
Nr.1 Delphi-Tool: [F7]
  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
 
#38

AW: 2. Form schliessen Variable=Nil

  Alt 23. Aug 2011, 13:28
@ConnorMcLeod

ich wollte keine Funktion à la FindXYZ nutzen!
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
440 Beiträge
 
Delphi 10.3 Rio
 
#39

AW: 2. Form schliessen Variable=Nil

  Alt 28. Aug 2011, 17:18
nächste Variante:
das zweite Fenster sendet eine userdefined message an seinen Owner (das erste Fenster) im OnDestroy und der Owner reagiert auf diese Message mit dem Nilen der Variable.
Nr.1 Delphi-Tool: [F7]
  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 08:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf