Positionierung einer Form / poOwnerFormCenter unklar



  • Hallo,
    ich habe Verständnisschwierigkeiten bei der Erzeugung von Forms.

    Erstes Phänomen
    ich habe zwei Forms. Im Konstruktor der ersten Form (Form1), newe ich die zweite (Form2) und zeige sie modal auch direkt an. Wenn ich nun als Ower (Form2) hier NULL angebe, wird die Form2 auf der Mitte des Bildschirm gezeigt, nicht zentriert über der ersten Form1. Sehe ich auch so als korrekt an.

    Erzeuge ich nun die zweite Form (auf ein Button Event), wenn die erste Form schon komplett erzeugt wurde, wird die 2. Form mittig zur ersten gezeigt, obwohl ich als Owner NULL angegeben habe -> verstehe ich nicht. Owner ist doch beiden Fällen NULL.

    Zweites Phänomen
    Wenn ich bei angezeigtem Form2 mit der TAB Taste zu einer anderen Anwendung schalte, so das sie meine Anwendung überdeckt und danach wieder zurückschalte, ist das Verhalten Unterschiedlich.

    Variante 1 : Es wird nur Form2 angezeigt, bei Click auf die Taskleiste erscheint auch Form1, aber im Vordergrund. Ein Click auf Form1 holt nun Form2 in dern Vordergrund.

    Variante 2 : Es erscheinen beide Forms gleichzeitig.

    Warum verhalten sich nicht beide Varianten gleich?

    Die Form2 soll angezeigt werden, bevor der Benutzer die Form1 bedienen kann, daher im Konstruktor. Ist evtl. Form1 noch nciht vollständig angelegt, so das es zu diesen Problemen kommt? An welche Stelle baut man geschickterweise die Form2? Nach dem Konstruktor auf das OnIdle Event setzen? Oder am Ende des Konstrukors mit einer Timerroutine?

    Gruss

    Jörn



  • Sieht so aus, als bräuchtest du ein Splash-Formular.

    Das wird, soweit ich in Erinnerung habe, direkt in der Projekt-cpp erzeugt.
    Schau mal ins Archiv/FAQ.



  • Danke, da werde ich mal nachsehen....für mich beleibt aber noch offen welche Stelle ich benutze um Aktionen auszuführen, die direkt nach dem vollständigen Erzeugen der Form ablaufen sollen, also der Konstruktor durchgelaufen ist.

    OnIdle fällt mir hier ein oder als letzte Zeile im Konstruktor einen Timer starten und dann in der Timerroutine. Wie wird sowas gewöhnlich gelöst?

    Jörn



  • Das kommt sicher auf den Anwendungsfall an.

    Im nachfolgenden Beispiel wird das Form2 dynamisch erzeugt und zusammen mit dem Form1 angezeigt.
    Die Positionen lassen sich festlegen.

    Anm.: Natürlich kodiert man Passworte und andere Werte nicht hart, eher holt man zB. Werte aus der Registry oder einer DB.

    //Projekt-cpp
    #include <vcl.h>
    #pragma hdrstop
    #include <Dialogs.hpp>
    #include <tchar.h>
    #include "formular1.h"
    #include "formular2.h"
    //---------------------------------------------------------------------------
    USEFORM("formular1.cpp", Form1);
    USEFORM("formular2.cpp", Form2);
    //---------------------------------------------------------------------------
    WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
    {
    	try
    	{
    		Application->Initialize();
    		Application->CreateForm(__classid(TForm1), &Form1);
    		Form1->Show();
    		Form1->Position = poDesigned;
    		Form1->SetBounds(300, 300, Form1->Width, Form1->Height);
    		Form2 = new TForm2(Application);
    		Form2->Position = poDesigned;
    		Form2->SetBounds(300, 300, Form2->Width, Form2->Height);
    		Form2->ShowModal();
            Form2->BringToFront();
    		String strName = Form2->Edit1->Text;
    		String strPW   = Form2->Edit2->Text;
    		delete Form2;
    		if (strName == "user" && strPW == "123456")
    			Application->Run();
    
    		else
    			ShowMessage("Name oder Passwort falsch...");
    	}
    	catch (Exception &exception)
    	{
    		Application->ShowException(&exception);
    	}
    	catch (...)
    	{
    		try
    		{
    			throw Exception("");
    		}
    		catch (Exception &exception)
    		{
    			Application->ShowException(&exception);
    		}
    	}
    	return 0;
    }
    

    Es ist zu sehen, dass man Form1 zunächst garnicht erzeugen müsste und es auch in den if-Loop legen kann, nachdem
    richtige Werte in Form2 eingetragen sind. Man kann also die Formularerzeugung auf diese Weise sehr gut steuern.


Anmelden zum Antworten