![]() |
Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Hallo zusammen,
ich erzeuge mit folgenden Code Formulare
Delphi-Quellcode:
Jetzt möchte ich an einer anderen Stelle überprüfen ob das das Formular erzeugt ist. Das mache ich so
if not assigned(frmContentMantel) then
Application.CreateForm(TfrmContentMantel, frmContentMantel);
Delphi-Quellcode:
Das komische ist, das funktioniert unter Windows und OS X wunderbar. Nur unter iOS wird das
if not assigned(Application.FindComponent(formListe[n]) as TForm) then
begin continue; end;
Delphi-Quellcode:
ausgeführt.
continue;
Kann mir jemand helfen? Gruß Philip |
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Vermutlich wurde
![]() |
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Warum benutzt du Application.CreateForm?
Ich würde das niemals für dynamische Forms benutzen. Und was passiert wohl, wenn Embarcadero mal auf die Idee kommt diesen Forms z.B. einen anderen Owner verpasst? :roll: [edit] Zitat:
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Wieso "Hmmm?" ?
Ach dort steht "Tipp: CreateForm erstellt das angegebene Formular nicht sofort." . |
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Verstehe noch nicht warum man Application.CreateForm nicht nehmen sollte.
Folgender Code ändert leider auch nix an dem Problem...
Delphi-Quellcode:
if not assigned(frmContentMantel) then
begin Application.CreateForm(TfrmContentMantel, frmContentMantel); //frmContentMantel := TfrmContentMantel.Create(Application); Application.RealCreateForms; end; |
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Zitat:
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
In der Hilfe von
![]() Um zur Laufzeit weitere Formulare zu erstellen, verwenden Sie FMX.Forms.TForm.Create, FMX.Forms3D.TForm3D.Create oder TForm1.Create. |
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Delphi-Quellcode:
Habe probiert das Form automatisch erzeugen zu lassen. Da funktioniert das
implementation
uses contentMantel{frmContentMantel};
Delphi-Quellcode:
auch nicht.
Application.FindComponent('frmContentMantel')
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Wie Maverik schon schrieb. Wenn das Form lokal erzeugt wird und du dann von einer anderen Stelle versuchst darauf zuzugreifen, ist es von ARC möglicherweise schon wieder zerstört worden. Darum wird es mit FindComponent auch nicht gefunden.
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Zitat:
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Zitat:
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Zitat:
Delphi-Quellcode:
und gut ist...
Foo := TFoo.Create(NIL);
Foo := TFoo.Create(Application); Warum überhaupt ein Find? |
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Muss mir wohl eingestehen dass hier ein Designfehler vorliegt den ich mir nicht wieder gerade basteln kann... auf alle Fälle nicht crossplatform.
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Du kannst die aktuell vorhandenen Forms auch über
Delphi-Quellcode:
/
Screen.Forms
Delphi-Quellcode:
durchwandern und schauen ob du was passendes findest.
Screen.FormCount
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Ich zeige die Forms nicht an. Ich hole mir nur Panels aus den Forms auf mein Mainform um Eingaben zu verwalten.
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Und warum nicht Frames?
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Zum Zeitpunkt der Entwicklung hatte Frames nicht den besten Ruf, geprüft hatte ich es selber nicht.
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Zitat:
In Deiner Form, Formulare zu erstellen?
Delphi-Quellcode:
Hiermit kann man ein Formular erstellen, soweit es noch nicht existiert.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } f : TForm2; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if not Assigned(f) then begin f := TForm2.Create(Application); f.Name := 'Hugo'; end; f.Show; // oder mach sonstwas mit dem Formular, ohne es anzuzeigen. end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if Assigned(f) then f.Free; end; procedure TForm1.Button2Click(Sender: TObject); var k : TComponent; begin k := Application.FindComponent('Hugo'); if Assigned(k) then begin if k is TForm2 then begin TForm2(k).Show; // oder sonstwas, es muss nicht zwingend angezeigt werden, um damit zu arbeiten. end end; end; end. Wenn es existiert, kann man es freigeben. Man kann es über Application.FindComponent finden und damit arbeiten. Was funktioniert nicht bzw. wo ist der Designfehler? Uwes Vorschlag funktioniert, unabhängig davon, ob die Formulare angezeigt werden oder nicht. Das Vorhandensein von Formularen hat nichts mit der Sichtbarkeit auf dem Bildschirm zu tuen. Wie "holst" Du denn die Panels (oder was auch immer) auf "Dein" Formular? Änderst Du dann den Parent? War passiert eigentlich dann mit diesen Teilen, wenn Du Dein Formular schließt? Oder wenn eines der Formulare, von denen Du sie holst, freigegeben wird? Die Verwendung von Frames dürfte da deutlich besser sein und auch wohl eher designkonform. Designfehler liegen nicht vor, wenn man etwas nicht designkonform nutzt, man sollte hier die Form der Nutzung lieber designkonform gestalten. Bei mir funktionieren Frames seit ca. 20 Jahren unter Delphi problemlos, wie alt ist denn das Design der von Dir gewarteten Software? |
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Warum FindComponent, wenn man
Delphi-Quellcode:
hat?
f
Zitat:
Zitat:
|
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Nur so am Rande bemerkt:
Mit ARC reicht ein simples
Delphi-Quellcode:
oder
Free
Delphi-Quellcode:
bei einer Komponente nicht mehr aus. Da muss man schon mit
FreeAndNil
![]() Um die Instanz-Variable für die Komponente auf
Delphi-Quellcode:
zu setzen überschreibt man
nil
![]()
Delphi-Quellcode:
.
opRemove
Die Notification wird für alle Komponenten automatisch aufgerufen, wo man
Delphi-Quellcode:
oder
Owner
Delphi-Quellcode:
ist. Alle anderen Komponenten müssen mit
Parent
![]() |
AW: Form zur Laufzeit erzeugen und mit assigned prüfen ob vorhanden
Zitat:
Delphi-Quellcode:
funktioniert, ohne zu wissen, wie die weitere Programmlogik des Threaderstellers aussieht.
if not assigned(Application.FindComponent(formListe[n]) as TForm) then
begin continue; end; Und ja, es heißt natürlich f.Destroy :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 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