Funktion nach ProgStart aufrufen



  • Geht leider net.

    am besten in der Datei "{ProjectName}.cpp" und vor "Application->Run();".

    Application->CreateForm(__classid(TParametereingabe), &Parametereingabe);
        Application->CreateForm(__classid(TAusgabe), &Ausgabe);
        Application->CreateForm(__classid(TCorrevit), &Correvit);
    
        Parametereingabe->AutoRun();
        Application->Run();
    

    Erzeugt die Fehlermeldung

    [C++ Fehler] Einspurmodell.cpp(20): E2315 'AutoRun' ist kein Element von 'TParametereingabe', weil der Typ nicht definiert ist
    [C++ Fehler] Einspurmodell.cpp(36): E2451 Undefiniertes Symbol 'exception'

    Anscheinend kann er damit nicht arbeiten, da das Programm noch nicht vollständig da ist.

    Mit den Ereignissen von TForm komme ich auch nicht ran.
    OnActivate greift immer, nicht nur beim ersten erzeugen.
    OnShow hat den Nachteil, das nach dem Programmstart die StartForm vorne ist. Leider müsste dann aber ein anderes Form oben sein. Wenn ich das ändern könnte, wäre mir schon geholfen.



  • Schonmal OnCreate probiert?



  • hallo,

    du musst natürlich "AutoRun();" im public-bereich der klasse deklariert haben, dann dürfte das auch kein problem darstellen...

    mfg
    murph



  • OnCreate geht nicht, da die Funktion auf Code der anderen Forms zugreift. Diese müssen daher vorher vollständig initialisiert sein. Da sie jedoch erst nach der Start-Form erzeugt werden, gibst ne Zugriffsverletzung.

    AutoRun() steht im Public-Bereich.



  • chris_f schrieb:

    OnCreate geht nicht, da die Funktion auf Code der anderen Forms zugreift. Diese müssen daher vorher vollständig initialisiert sein. Da sie jedoch erst nach der Start-Form erzeugt werden, gibst ne Zugriffsverletzung.

    AutoRun() steht im Public-Bereich.

    Ich würde es mit OnShow() versuchen, da müssten zumindest alle Elemente initialisiert sein.

    Wenn deine Funktion allerdings eine Endlosschleife beinhaltet, könnte ich mir vorstellen, dass OnShow nie fertig wird, da dort gewartet wird, bis deine Funktion fertig ist. Die Lösung könnte dann das auslagern der Funktion in einen eigenen Thread sein.

    Gruß

    Martin



  • Nö.
    Mit onShow gehts auch nicht. Gleiches Problem. Sobald auf Code eines anderen Forms zugegriffen wird, kachelt er ab.

    Es geht, wenn ich den Aufruf in den Konstruktor eines Forms stelle, welches nach den anderen initialisiert wird, und keine benötigten Funktionen enthält.

    Ist zwar ehr der Holzhammer, aber manchmal hilft Gewalt eben...

    Danke an alle!

    Gruß

    chris_f



  • Du koenntest eventuell auch die Erstellungsreihenfolge der Forms aendern...
    MfG Aoeke



  • Das erste erstellte Formular wird zur Programm- Hauptform!

    Probier's mal in OnActivate!

    (Da musste aber 'ne Static- Variable mit einbauen. Standardwert=true;
    Die setzt Du am Ende auf false. Dein Code darf nur bei true ausgefuehrt werden - bei erster Aktivierung!)



  • Das mit der Erstellungsreihenfolge kann ich leider nicht machen, da der beschriebene Fall nur in Ausnahmesituationen auftritt (Parameter beim ProgStart).

    Den Trick mit der Static-Variable merk ich mir. Manchmal ist das sinnvolle so einfach... 😮

    Jetzt lass ich es erstmal so. Im Moment sehe ich keine Probleme. Vielleicht ändere ich das später noch.

    Danke



  • chris_f,

    chris_f schrieb:

    [C++ Fehler] Einspurmodell.cpp(20): E2315 'AutoRun' ist kein Element von 'TParametereingabe', weil der Typ nicht definiert ist

    Anscheinend kann er damit nicht arbeiten ...

    natürlich mußt Du auch die Unit inkludieren, in der Du die Formular-Klasse "Tparametereingabe" definiert hast.

    OnActivate greift immer, nicht nur beim ersten erzeugen.

    Da gibt es eine Holzhacker-Methode, falls Du das Ereignis wirklich nur genau einmal brauchst:

    void __fastcall TForm1::FormActivate(TObject *Sender)
    {
        //tu was einmaliges
        OnActivate = 0;    //Ereignis-Handler abkoppeln
    }
    

    Das mit der Erstellungsreihenfolge kann ich leider nicht machen, da der beschriebene Fall nur in Ausnahmesituationen auftritt (Parameter beim ProgStart).

    Wenn Du die Parameter schon in "Einspurmodell.cpp" prüfst, kannst Du die Erstellungsreihenfolge der Formulare in Abhängigkeit von den Parametern festlegen.


Anmelden zum Antworten