![]() |
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:
Wenn ich mir Form1.Name anzeigen lasse, heißt es mit dem ersten Aufruf Form1, mit dem zweiten Aufruf Form1_1, Form1_2, ...
Form1 := TForm1.Create(nil):
try Form1.Showmodal; finally Form1.Free; Form1:=nil; end; 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 |
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; |
AW: TForm.Name bekommt fortlaufende Nr angehängt
Dann vergib doch dem Formular einen Namen. Das sollte dann doch reichen.
|
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 |
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:
|
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. |
AW: TForm.Name bekommt fortlaufende Nr angehängt
Zitat:
Ich habe auch probiert
Delphi-Quellcode:
Damit bin ich sicher, dass Form correct genillt wurde und damit sollte ja auch der Name frei sein
if not assigned(Form1) then
Form1 := TForm1.Create(nil); try Form1.Showmodal; finally Form1.Free; Form1:=nil; end; |
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 |
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
|
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. |
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:
Könnte auch schreiben
Form1 := TForm1.Create(nil);
try Form1.Showmodal; finally Form1.Free; Form1:=nil; end;
Delphi-Quellcode:
Aber welchen Sinn macht es, dass Free nicht automatisch Nillt?
FreeAndNil(Form1)
|
AW: TForm.Name bekommt fortlaufende Nr angehängt
Welche Referenz soll denn genilt werden? Das kann der Compiler nicht wissen.
|
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 ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 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