Zweite Form soll bei Start obenauf liegen
-
Wie der Titel schon sagt, ich nutze in meinem Programm zwei Forms. Wird das Programm gestartet, soll die zweite Form gleich über der ersten Form angezeigt werden. Bisher habe ich das nicht hinbekommen; die erste Form erhält immer den Fokus. Der einzige Eventhandler, der mich halbwegs zum Ziel brachte ist "OnActivate", allerdings bekomme ich einen Ausnahmefehler (Cannot change Visible in OnShow or OnHide), sobald ich die zweite Form schließe. Hier der bisherige Quelltext:
Unit1:
void __fastcall TForm1::FormActivate(TObject *Sender) { Form2->Show(); }
Unit2:
void __fastcall TForm2::FormShow(TObject *Sender) { Form1->Enabled = false; } void __fastcall TForm2::FormHide(TObject *Sender) // wenn Form geschlossen wird { Form1->Enabled = true; }
Wie kann ich meinen Gedanken realisieren?
Danke.
-
Zum einen mußt Du ShowModal verwenden, wenn Form1 so lange nicht verwendbar sein soll, wie Form2 geöffnet ist. Zum anderen kannst Du Form2 beim Start des Programmes nicht einfach so darstellen, da es noch nicht existiert.
Mögliche Lösung:
Form2 aus der Liste der autmatisch erzeugten Formulare herausnehmen.
Im Konstruktor von Form1 (nicht vergessen den Header von Form2 zu inkludieren):TForm2* MyForm2 = new TForm2(NULL); // manuell eine Instanz erzeugen MyForm2->ShowModal(); // modal anzeigen delete MyForm2; // Löschen nicht vergessen...
-
Schonmal kein schlechter Anfang, zumal ich mittels ShowModal() die zweite Form ohne Zwischenfälle über OnActivate der ersten Form anzeigen lassen kann. Form2 existiert im Übrigen bereits (wobei ich Deine Zweifel allerdings nachvollziehen kann), mein Programm ist Zeuge dessen. Wenn niemand Einwände dagegen hat (im Sinne von "Zweifel an der Funktionalität" dieser Angelegenheit), werde ich diese Möglichkeit nutzen.
-
Sorry, ich hätte vielleicht erwähnen sollen, dass OnActivate (vermutlich) ein schlechter Platz dafür ist, da OnActivate jedes Mal ausgeführt wird, wenn die Anwendung den Fokus erhält. Wenn das allerdings nicht stört...
Alternativ könntest Du auch ein Flag setzen, dass Form2 bereits angezeigt wurde und dann einfach das Form2 nicht mehr anzeigen. Geht natürlich auch...
-
Das ging mir auch schon durch den Kopf, allerdings ist dies nicht der Fall. OnActivate einer Form ist vermutlich als Eventhandler innerhalb der Applikation gedacht (zwischen verschiedenen Forms); die Applikation selbst hat, wenn ich mich nicht irre, selbst einen eigenen OnActivate Handler.
-
Ja, da hast Du recht, ich habs gerade noch mal nachgelesen und ich hatte das falsch in Erinnerung.
Wenn Dein Programm aber noch weitere Forms hat, wird beim Wechsel zurück auf Form1 OnActivate ausgelöst. Abe wenn das passiert, kannst Du immer noch ein Flag setzen.
-
mal abgesehen davon müsste nicht theoretisch in dem moment wo form2 zugeht sofort wieder form1 onactivate() auslösen ?
ich würde es lieber mit onshow() versuchen, das wird doch nur bei minimize und folgendem restore aufgerufen UND wenn die anwendung startet ...
nochn EDIT: und wenn onshow() kommt einfach auf
Form2 != NULL && Form2->Visible
prüfen und im falle true einfach
return;
das onshow() verlassen.
onactivate() ruft, wenn nicht überschrieben, glaube sogar autofokus auf das letzte showmodal()-objekt auf.
also genauso wie bei einem dialog, wenn du ins hauptfenster klicks klickst, dann blinkt der dialog und wird ontop gesetzt
-
Ja, habe sicherheitshalber mal einen Check in OnActivate eingefügt, damit Form2 nur beim Start des Programms aufgerufen wird - obwohl dies eben nicht notwendig zu sein scheint. Ich tippe mal auf ShowModal() - Form1 verliert dabei evtl. garnicht den Fokus, sondern ist nur temporär deaktiviert.