ShowModal funktioniert nicht

Hallo zusammen,

ich will ein Login-Fenster mit folgendem Code aufrufen

begin

Application.CreateForm(TFLogin, FLogin);
FLogin.ShowModal;

Bei dem Aufruf FLogin.ShowModal; kommt die Fehlermeldung „Aus einem sichtbaren Fenster kann kein modales gemacht werden.“
Das seltsame ist, daß das OnShow-Eregnis von FLogin NACH der Anweisung Application.CreateForm aufgerufen wird! Was mache ich falsch???

Grüße
Wolfgang

Application.CreateForm(TFLogin, FLogin);
FLogin.ShowModal;

Hi Wolfgang,

Bei dem Aufruf FLogin.ShowModal; kommt die Fehlermeldung „Aus
einem sichtbaren Fenster kann kein modales gemacht werden.“
Das seltsame ist, daß das OnShow-Eregnis von FLogin NACH der
Anweisung Application.CreateForm aufgerufen wird! Was mache
ich falsch???

gehe ich recht in der Annahme, daß das Formular „FLogin“ das „erste“ des Projekts ist? Es ist so geregelt, daß das „erste“ Formular eines Projekts (= dasjenige, das durch den ersten Aufruf von „Application.CreateForm()“ erzeugt wird) zum Hauptformular der Anwendung wird. Dieses Hauptformular genießt einen gewissen Sonderstatus, in dem Sinne, daß 1. es automatisch beim Programmstart angezeigt wird, und 2. bei seiner Schließung das Programm beendet wird. Punkt 1 würde dann auch die Auslösung des „OnShow“-Events erklären.

Universelle Voraussetzung dafür, daß man ein Formular modal anzeigen lassen kann, ist nun aber, daß es un sichtbar ist.

Ich würde einfach alle Formulare einschließlich „FLogin“ wie gewohnt automatisch erzeugen lassen, das echte Hauptformular Deiner Anwendung gleich nach dem Start durch ein simples „Visible := FALSE“ unsichtbar machen, und dann ganz normal das „FLogin“ per „ShowModal“ auf den Schirm bringen. Bei positivem Login schließt Du es und machst das Hauptformular wieder sichtbar, bei negativem Login schließt Du sowohl FLogin als auch das Hauptformular.

Ich hoffe, ich konnte Dir weiterhelfen.

Mit freundlichem Gruß
Martin

Servus Martin,

gehe ich recht in der Annahme, daß das Formular „FLogin“ das
„erste“ des Projekts ist?

Nein, FLogin wird vom Hauptformular mit dem oben angegebenen Code aufgerufen.

Ich würde einfach alle Formulare einschließlich „FLogin“ wie
gewohnt automatisch erzeugen lassen, das echte Hauptformular
Deiner Anwendung gleich nach dem Start durch ein simples
„Visible := FALSE“ unsichtbar machen, und dann ganz normal das
„FLogin“ per „ShowModal“ auf den Schirm bringen.

Schlecht, da ich sehr viele Formulare habe, die ich gerne nur dynamisch erzeugen würde. Ich werde aber mal das mit visible=flase versuchen, hätte ich ja auch selbst drauf komen können :wink:));

Danke!
Wolfgang

Hi Wolfgang,

Nein, FLogin wird vom Hauptformular mit dem oben angegebenen
Code aufgerufen.

aha, damit wäre die Ausgangslage etwas anders, als ich vermutet habe (trotzdem kein Grund zur Panik :wink:).

Schlecht, da ich sehr viele Formulare habe, die ich gerne nur
dynamisch erzeugen würde.

OK, das ist auch die richtige Handhabungsweise.

Ich werde aber mal das mit
visible=flase versuchen, hätte ich ja auch selbst drauf komen
können :wink:));

Nein, tu’s besser nicht, denn das wäre nur „geknaubt“. Die richtige Lösung ist folgende: Erzeuge das FLogin-Formular nicht mit Application.CreateForm(…). Die Methode Application.CreateForm ist nur für die Erzeugung der Formulare beim Start der Anwendung gedacht und deshalb hat sie außerhalb des Projektquelltextes (= das, was beim Aufruf des Menüpunkts „Project/View Source“ erscheint) eigentlich nichts verloren. Es gibt z. B. auch kein „Gegenstück“ „Application.DestroyForm“ oder ähnliches.

Nimm als Lebenslauf Deines „FLogin“-Formulars diesen:

 IF NOT Assigned(FormLogin) THEN
 begin
 FormLogin := TFormLogin.Create(Application);
 FormLogin.ShowModal;
 FormLogin.Destroy;
 FormLogin := NIL
 end

Nach dem Aufruf von „FormLogin := TFormLogin.Create(Application)“ ist das Formular auf jeden Fall unsichtbar, so daß der anschließende ShowModal-Aufruf mit Sicherheit problemlos funktioniert.

Mit freundlichem Gruß
Martin

Hallole Martin,

auch wenn’s Dich nervt, ich habe beide Möglichkeiten zur Erzeugung von FLogin (application.CreateForm und TFLogin.Create) schon ausprobiert und es hat nix gebracht! In einem leeren Projekt habe ich dann ShowModal mit beiden Funktionen erfolgreich getestet. Es liegt also definitiv an meinem Projekt.

Ich habe jetzt die Formulareigenschaft Visible im Objektinspektor auf false gesetzt. Damit funzt es ganz gut.

Was mir aber immer noch nicht klar ist, weshalb der Aufruf in meinem Projekt solche Probleme macht.

Danke für Deine Hilfe!

Wolfgang

Pfüati Wolfgang,

nach einem ebensolchen Test meinerseits glaube ich jetzt, daß die Ursache des Problems tatsächlich ganz einfach im Visible-Property liegt (wieder was dazugelernt…:wink:). Wenn Du einem Projekt ein neues Formular hinzufügst, steht dessen Visible-Property immer auf FALSE. Sobald Du es bei irgendeinem Formular im Objektinspektor auf TRUE setzt und dann die ShowModal-Methode aufrufst, kommt die Fehlermeldung (desgleichen, wenn Du vor den ShowModal-Aufruf die Zeile „FLogin.Visible := TRUE“ setzt).

Trotzdem würde ich Dir raten, die dynamische Formularerzeugung über TFLogin.Create zu bewerkstelligen, statt über Application.CreateForm(…).

Tschüssi
Martin
*keineswegsgenervtsonderninteressiert*

Hallo Martin,

den Code mit Application.create habe ich deshalb gepostet, weil das der letzte Code war, mit dem ich experimentiert habe. Meine Formulare erzeugt ich schon über den „Normalen“ Konstruktor-Aufruf.

Das mit der Visible-Eigenschaft hat sich inzwischen auch wieder in Luft aufgelöst. Beim Loginfenster gehts noch, aber ich habe bemerkt, daß mein Entiwcklungspartner die Applikation als MDI aufgebaut hat, und ich so diese Eigenschaft bei den MDIChilds nicht auf false setzen darf!
Wie gesagt wenn ich ein leeres Projekt hernehme und dort ShowModal ausführe klappt alles wunderbar. Ich vermute, daß Delphi sich irgendwo mal verschluckt hat, bzw. ich auf den falschen Knopf gedrückt habe.
Seis drum. Ich werde halt das ganze jetzt von MDI wieder zurückstellen und mit der Visible-Eigenschaft die ShowModal-Aufrufe verwirklichen.

Vielen Dank für die „Seelsorge“ :wink:)

Wolfgang