Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TForm.Name bekommt fortlaufende Nr angehängt (https://www.delphipraxis.net/204614-tform-name-bekommt-fortlaufende-nr-angehaengt.html)

norwegen60 11. Jun 2020 17:56

TForm.Name bekommt fortlaufende Nr angehängt
 
Hallo zusammen,

ich habe mit einem Formulat das Phänomen, dass dieses bei jedem Aufruf zu seinem Namen eine Nr. angehängt bekommt. Ich erzeuge und öffne das Fenster ganz normal über
Delphi-Quellcode:
   Form1 := TForm1.Create(nil):
  try
    Form1.Showmodal;
  finally
    Form1.Free;
    Form1:=nil;
  end;
Wenn ich mir Form1.Name anzeigen lasse, heißt es mit dem ersten Aufruf Form1, mit dem zweiten Aufruf Form1_1, Form1_2, ...

Das stelle ich bei keinem anderen Formular fest. Ich speichere beim Schließen die Position unter Form.Name und das nutzt natürlich wenig, wenn das Form beim nächsten Aufruf einen anderen Namen hat.

Weiß jemand woher das kommt?

Problem tritt mit Delphi XE auf

Danke
Gerd

mmw 11. Jun 2020 18:59

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
hallo,
das liegt daran, das Tform1 automatisch erzeugt wird. Project/Optionen/Anwendung/Formulare

so funkioniert es

Delphi-Quellcode:
var
  frm: TForm1;
begin

  try
    frm := Tform1.Create(nil);
    frm.ShowModal;

  finally
    frm.Free;
  end;
end;

zeras 11. Jun 2020 19:28

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Dann vergib doch dem Formular einen Namen. Das sollte dann doch reichen.

norwegen60 11. Jun 2020 19:28

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Nein, automatisch wird es sicher nicht erzeugt. Aber trotzdem: Mit der lokalen Variablen habe ich ein Workaround das funktioniert.

Verstehen tu ich es trotzdem nicht, denn ich verwende in der Regel immer die bei TForm automatisch erstellte globale Variable Form1 und habe das noch nie festgestellt. Sonst würde die Wieder-Positionierung öfters nicht funktionieren.

Dadurch dass ich Form.ShowModal aufrufe und danach Free und = NIL setze, sollte es auch nicht als Folge Instanz gedeutet werden.

Danke
Gerd

Redeemer 11. Jun 2020 21:07

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Hast du Application.CreateForm() aus dem Projekt-Quelltext entfernt? Das kann man auf bei dem von mmw geposteten Menüpfad einstellen, funktioniert bei komplexeren Projekten mit Startparametern aber eher schlecht als recht.

Zitat:

Zitat von mmw (Beitrag 1467091)
hallo,
das liegt daran, das Tform1 automatisch erzeugt wird. Project/Optionen/Anwendung/Formulare

so funkioniert es

Delphi-Quellcode:
var
  frm: TForm1;
begin

  try
    frm := Tform1.Create(nil);
    frm.ShowModal;

  finally
    frm.Free;
  end;
end;

Keinen Code posten, wo der Compiler meckert.

himitsu 11. Jun 2020 21:13

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Ja klar, der ist ja auch syntaktisch total falsch.

Variable im Finally nicht initiailisiert, ist noch das gerinngste Problem.
Das Create gehört vor das TRY, denn wenn es da knallt, dann darf auf keinen Fall das Free ausgeführt werden, weil (A) die Variable nicht initialisiert ist und (B) das Objekt bereits im Create freigegeben wurde, da der Zeiger des Result der Variable ganricht zugewiesen werden konnte, weil es knallte.

Formularnamen sind global eindeutig,
und wenn sowas bereits existiert, dann wird nunmal der Name so geändert, dass es passt.

norwegen60 11. Jun 2020 21:40

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Zitat:

Zitat von himitsu (Beitrag 1467098)
Formularnamen sind global eindeutig,
und wenn sowas bereits existiert, dann wird nunmal der Name so geändert, dass es passt.

Wieso wird der Name aber nicht "freigegeben"? Wie gesagt, beim ersten Create ist der Name noch "Form1". Wenn ich dann Form1 schließe und gleich wieder Öffne ist er Form1_1 usw.

Ich habe auch probiert
Delphi-Quellcode:
  if not assigned(Form1) then
    Form1 := TForm1.Create(nil);
  try
    Form1.Showmodal;
  finally
    Form1.Free;
    Form1:=nil;
  end;
Damit bin ich sicher, dass Form correct genillt wurde und damit sollte ja auch der Name frei sein

himitsu 11. Jun 2020 22:17

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Dann machst du wohl was falsch?

* entweder der Name steht so in der DFM
* oder es gibt bereits ein globales Objekt mit diesem Namen (z.B. TForm, TDataModule oder TService)

siehe TReader.ReadRootComponent->FindUniqueName in System.Classes

norwegen60 11. Jun 2020 23:01

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Ja, und ich habe den Fehler auch gefunden. Im OnClose des Formulars stand
Delphi-Quellcode:
Form1 := nil

himitsu 12. Jun 2020 09:40

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
In dem Fall kann ich nur das sagen, das ich hier immer sage:
Schmeiß diese globale Variable weg.

Auch bau automatisch erzeigten Formularen kann man diese Variable entfernen und in die DPR verschieben.

norwegen60 12. Jun 2020 10:42

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Dann hätte ich ja gar nicht gemerkt, dass dem Form in OnClose der Boden weg gezogen wird :wink:

Gibt es eigentlich eine sinnvolle Erklärung, warum ein Free nicht automatscih nillt?
Obiger Fehler kam nur, weil nach dem externen Form1.Free ein folgender check über assigned(Form1) immer noch true meldet, was vielleicht theoretisch erklärbar ist, praktisch aber Mist ist.

Somit bedeutet das, dass jeder Aufruf so aussehen muss:
Delphi-Quellcode:
  Form1 := TForm1.Create(nil);
  try
    Form1.Showmodal;
  finally
    Form1.Free;
    Form1:=nil;
  end;
Könnte auch schreiben
Delphi-Quellcode:
FreeAndNil(Form1)
Aber welchen Sinn macht es, dass Free nicht automatisch Nillt?

DeddyH 12. Jun 2020 10:54

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Welche Referenz soll denn genilt werden? Das kann der Compiler nicht wissen.

himitsu 12. Jun 2020 11:13

AW: TForm.Name bekommt fortlaufende Nr angehängt
 
Doch, das hättest du gemerkt, da in der Form nicht auf "deine" Varialbe zugegriffen werden kann, außer du baust es selbst so, dass die eigene Variable auch global ist, was man nicht sollte.
Bzw. es hätte dort der Compiler geknallt, wenn er die Variable nicht findet, nachdem zu sie global entfernt hast.

Beim Aufruf von der Methode Free wird nur die Objekt-Referenz reingegeben, also der Wert der Variable ins Self kopiert.
Die Variable ist der Methode also nicht bekannt.

Darum ist Delphi-Referenz durchsuchenFreeAndNil auch eine Prozedure, welche die Variable als Speicher-Referenz (VAR) rein bekommt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr.

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