Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

Sir Rufo 23. Aug 2011 07:25

AW: 2. Form schliessen Variable=Nil
 
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"

Chemiker 23. Aug 2011 07:31

AW: 2. Form schliessen Variable=Nil
 
Hallo,

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

Bis bald Chemiker

ibp 23. Aug 2011 07:33

AW: 2. Form schliessen Variable=Nil
 
@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

DeddyH 23. Aug 2011 07:36

AW: 2. Form schliessen Variable=Nil
 
Das hat ja nichts damit zu tun, ob es sich um ein Formular handelt oder nicht. Globale Variablen im interface-Abschnitt sind generell von überall erreichbar, sofern die enthaltende Unit eingebunden wird. Willst Du mehrere Instanzen erzeugen, solltest Du Dir diese unbedingt in einer Liste (TObjectList, Array etc.) merken, da die eine Variable ja sonst mit jeder weiteren Instanz überschrieben und die alte Instanz somit unerreichbar wird.

ibp 23. Aug 2011 07:40

AW: 2. Form schliessen Variable=Nil
 
Zitat:

Zitat von DeddyH (Beitrag 1118778)
Das hat ja nichts damit zu tun, ob es sich um ein Formular handelt oder nicht. Globale Variablen im interface-Abschnitt sind generell von überall erreichbar, sofern die enthaltende Unit eingebunden wird. Willst Du mehrere Instanzen erzeugen, solltest Du Dir diese unbedingt in einer Liste (TObjectList, Array etc.) merken, da die eine Variable ja sonst mit jeder weiteren Instanz überschrieben und die alte Instanz somit unerreichbar wird.

Ja schon aber aus verschiedenen units, daher lohnt sich eine Liste nicht, da die unit2 nur temporär und im Bedarfsfall genutzt wird!

DeddyH 23. Aug 2011 07:41

AW: 2. Form schliessen Variable=Nil
 
Dann nimm doch einfach verschiedene Variablen vom Typ TForm2.

Sir Rufo 23. Aug 2011 07:42

AW: 2. Form schliessen Variable=Nil
 
Zitat:

Zitat von Chemiker (Beitrag 1118776)
Hallo,

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

Bis bald Chemiker

Nein, muss nicht ... ist aber bei den meisten Einsatzzwecken schon erforderlich und darum auch als Default so implementiert.
(Zudem die automatische Erstellung des Formulars genau diese Variable benötigt -> s.u. )
Es reicht ja, wenn alle, die darauf zugreifen wollen den Zugriff haben und wenn diese Zugriffe nur innerhalb einer Unit passieren, dann würde ich keine globale Variable benötigen.

Zitat:

Zitat von ibp (Beitrag 1118777)
@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

Die automatisch angelegte globale Variable "Form2" kann genau nur eine Instanz beinhalten.
Wenn du mehrere Instanzen benötigst, dann musst du dich um die Verwaltung dieser selber kümmern.
Und ja, wird die Instanz von TForm2 nicht automatisch beim Start erzeugt, dann ist Form2 NIL.

Delphi-Quellcode:
program Test;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1); // <- da passiert die Zuweisung
  Application.CreateForm(TForm2, Form2); // <- und da auch
  Application.Run;
end.

ibp 23. Aug 2011 07:49

AW: 2. Form schliessen Variable=Nil
 
eben und sie soll ja nicht automatisch erzeugt werden, sondern dynamisch im Bedarfsfall!

Spricht denn etwas gegen die Lösung in Post 6?

Ja ich bekenne mich schuldig, ich hätte die Variablennamen anders benennen sollen!

FaTaLGuiLLoTiNe 23. Aug 2011 07:50

AW: 2. Form schliessen Variable=Nil
 
Wenn von dem Formular tatsächlich immer nur eine Instanz zur gleichen Zeit angezeigt werden soll macht der Vorschlag in Beitrag #19 für mich am ehesten Sinn. Das sieht mir wie eine abgewandelte Form des Singleton-Patterns aus.

Sir Rufo 23. Aug 2011 08:02

AW: 2. Form schliessen Variable=Nil
 
Zitat:

Zitat von FredlFesl (Beitrag 1118767)
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 :thumb: - hat sogar ein Hauch mehr Charme als meine Variante ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:39 Uhr.
Seite 3 von 4     123 4      

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