kp, warum da ein Fehler ist! - verschiedeneForm zusammengeführt



  • Existieren die Formulare ? mit new erstellt ? oder fest eingebunden?



  • Anzuraten ist in deinem Fall, dass du alle 5 Formalare automatisch erstellen lässt.

    Dann kannst du getrost die Routinen den einzelnen Formularen bei deren OnCreate zuordnen.

    Anders wirst du erstmal nicht weiterkommen trotz aller Hinweise bisher.

    MfG
    kpeter



  • Wenn es noch so ist, wie im ersten Posting, werden die Formulare weder automatisch erzeugt (in der Project.cpp sind keine CreateForm-Anweisungen für die Formulare), noch erstellt er sie manuell. Kann also nichts anderes geben als eine Access-Violation, weil er zwar Zeiger deklariert, aber keine Instanzen erzeugt.

    Aber selbst wenn er sie automatisch erstellen läßt, nützt ihm das nichts, das sie zu dem Zeitpunkt, wo der Konstruktor des Hauptforms aufgerufen wird, noch nicht erzeugt wurden. Dies würde aber auch in OnCreate nicht funktionieren...

    Meiner Meinung nach ist der einzige sinnvolle Weg, die abhängigen Formulare komplett dynamisch zu erzeugen.

    Auf jeden Falls sollte er erstmal alles wieder löschen, was er da manuell 'reingefrickelt' hat. So ist das nämlich nichts halbes und nichts ganzes...

    Dann einfach nur die Header einbinden und die Instanzen manuell erzeugen.



  • @Joe_M.

    Joe_M. schrieb:

    Wenn es noch so ist, wie im ersten Posting, werden die Formulare weder automatisch erzeugt (in der Project.cpp sind keine CreateForm-Anweisungen für die Formulare), noch erstellt er sie manuell.

    Das Hauptformular wird , wenn es noch wie im ersten Posting ist, dort in Listing 1, Zeile 16 erzeugt.

    Während sich Form1 erstellt, soll es (nach Listing 2, Zeile 34) das form_fileshare erstellen und anzeigen. Bumm...

    Da der Autor diesen Zusammenhang bisher nicht erkannt hat, mein vorheriges Posting.

    MfG
    kpeter



  • Ich erzeuge alle Forms ganz am Anfang:

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	try
    	{
    		Application->Initialize();         
    		Application->CreateForm(__classid(TForm1), &Form1);
    		Application->CreateForm(__classid(Tform_configure), &form_configure);
    		Application->CreateForm(__classid(Tform_fileshare), &form_fileshare);
    		Application->CreateForm(__classid(Tneu_ordner), &neu_ordner);
    		Application->CreateForm(__classid(Tform_start), &form_start);
    		Application->Run();
    	}
    	catch (Exception &exception)
    	{
    		Application->ShowException(&exception);
    	}
    	return 0;
    }
    

    Hab den Teil, der die Forms bei Parametern zeigen soll, in OnActivate gepackt. So funzt das. 🙂
    Aber jetzt gibt es beim Aufruf vom Form1->Hide(); nen Fehler, dass das nicht verändert werden darf. 😞 Hab den Aufruf überall ausprobiert. 😞



  • So funktioniert es:

    void __fastcall TForm1::FormActivate(TObject *Sender)
    {
     	String params;
    	for (int i=1;i<=ParamCount();i++){
    		params += ParamStr(i);
    	}
        fileshare_close = true;     
    
    	if(strcmp(params.c_str(),"tausch")==0){     
            SetWindowPos(Handle,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_HIDEWINDOW);
        	fileshare_var = "tausch";
    		form_fileshare->Show();
    	}
        else if(strcmp(params.c_str(),"sichern")==0){  
            SetWindowPos(Handle,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_HIDEWINDOW);
        	fileshare_var = "sichern";
    		form_fileshare->Show();
        }
        else if(strcmp(params.c_str(),"uninstall")==0){  
            SetWindowPos(Handle,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_HIDEWINDOW);
        	fileshare_var = "uninstall";
    		form_fileshare->Show();
        }
    	else if(strcmp(params.c_str(),"configure")==0){   
            SetWindowPos(Handle,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_HIDEWINDOW);
    		form_configure->Show();
    	}
    	else if(strcmp(params.c_str(),"start")==0){
            SetWindowPos(Handle,NULL,0,0,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_HIDEWINDOW);
    		form_start->Show();
    	}
    }
    

    THX für eure Bemühungen



  • Hallo

    strcmp(params.c_str(),"tausch")==0
    

    Dann doch lieber

    params.Pos("tausch")==1
    

    bis bald
    akari



  • Wenn schon, dann noch einfacher mit

    if(params == "tausch")
    

    Aber warum werden zuerst alle Parameter wieder zu einem String 'params' zusammengefügt und dann abgefragt? Es reicht doch, einfach ParamStr(1) abzufragen...



  • Hallo

    Deine Version vergleicht ob params genau "tausch" entspricht. Ich habe die Überprüfung so übernommen wie es im Original ist : ob params mit "tausch" anfängt.

    Ich bin davon ausgegangen das mehr als nur dieses Codewort in den Parametern übergeben wird, deshalb auch die Zusammenfassung in einem AnsiString. Wenn allerdings nur genau ein Codewort ohne weitere Daten übergeben wird ist natürlich deine Version besser.

    bis bald
    akari



  • Nur so als Klarstellung:

    if(strcmp(params.c_str(),"tausch")==0)
    

    Hier wird auch nur verglichen, ob in der Variablen 'params' genau der String "tausch" steht, d.h. inclusive des abschließenden Null-Zeichens.
    Ansonsten müßte man in C strncmp benutzen.

    Aber in C++ und mit Mittels der VCL bzw. des Datentyps AnsiString sollte sowieso keine reine C-Funktion aufgerufen werden.

    Ich persönlich finde den Vergleich mit Pos() nicht so schön, da bei einem langen String erst der gesamte String durchsucht wird (wenn der Teilstring NICHT zu Beginn enthalten ist). Dann lieber SubString() benutzen...



  • Ich hatte den Quelltext für die Params einfach hier im Forum gefunden und benutzt. Darum hatte ich mich halt noch nicht gekümmert. Ich werd eure Tipps aber beachten 😃 .


Anmelden zum Antworten