Form verhält sich komisch
-
Ups, sorry , hab das mit der FAQ übersehen.
Wenn Du das fertig hast, kannst Du da mal ne kleine Lösung als Übersicht posten ?
-
Macht ja nix Aber das bringt mich wirklich auch auf eine Frage:
Ich meine, es sieht ja schon komisch aus, wenn in MainWin.h (und, von mir aus auch .cpp) soviel Code steht. Darum fand ich diesen Ansatz auch ganz schön. Wie müsste man denn sein Programm designen, damit es wirklich alle Forms quasi gleichberechtigt behandelt und man zwischen diesen einfach mittels eben diesem Context oder sogar einfacher, also mittels switch, etc. wechseln kann?
Ich meine, man braucht ja wohl Application::Run und Freunde - ohne Application::Exit und Freunde will ich kein Programm beenden, da mit ja abort, etc. nicht .net konform erscheint.
-
Was meinst Du mit gleichberechtigt ?
-
Gleichberechtigt im Sinne von Application::Run ohne Kontext auf das erste (eben das Haupt-) Form.
Ich habe das auch schon so versucht, dass ich einfach in main die Forms erstellt und ge-show()-t habe. Somit habe ich dann wenigstens auch den Code in main und muss nicht soviel auf die einzelnen .h Dateien aufpassen (extern, etc.).Es scheint mir eigentlich so alles sinnvoller, wenn nicht soviel Code so dezentral in den Form Klassen liegt. Andererseits verstehe ich schon, dass wir hier über Eventgesteuertes programmieren reden.
Und mit obigem Ansatz - also einfach kein Application::Run in main, dafür aber dort die Forms erstellen, zeigen und in einen eigenen mainloop einbetten, da fehlt mir dann eben die Funktionalität von Application::Exit, etc.
Ich kämpfe also noch mit der Art und Weise oder suche, anders ausgedrückt, noch das schönste, einfachste Design (auch für spätere Programme verwendbar).
-
Vielleicht macht es auch Sinn, jedes Form in einen eigenen Thread zu packen, aber das ist wohl ein bisschen übertrieben. Es ist eben wegen diesem ApplicationContext.
-
Ups - und klar - ich poste dann die Lösung
-
Ich hab leider zu wenig Ahnung von , aber was ist denn das Problem mit dem ApplicationContext ? Aus den Diskussionen im Originalthread werde ich nicht so recht schlau und nachvollziehen kann ich die Probleme wegen MessageBox und SafgeDialog nicht:
http://www.rothmichael.de/cpp/SplashTest2.zip
Gibst mir mal nen schubs in die richtige Richtung ?
-
Also .net ist für mich ja auch neu, aber es scheint wohl einfach um einige Context-Verknüpfungen zu gehen, die threadspezifisch sind. Also wenn man dieses Application::Run ausführt (oder eben auch die ApplicationContext Geschichte aus dem Thread so verwendet), dann ist es anscheinend nicht damit getan, dass man die Verweise innerhalb dieser Context-Klasse einfach ändert und somit den Gesamt-Thread-Context geändert hat. Ist auch irgendwie logisch, denn Application::Run erstellt ja auch einen neuen Thread und genau der lässt sich nicht einfach mal so seinen Context verschieben.
Ich versuch's mal mit neuen Threads oder einfach mit dem Backgroundworker und poste dann meine Erfahrungen.
-
Eigentlich geht es ja nur darum, dass nicht immer das Update() ausgeführt werden muss... quasi...
-
Komisch - bei mir funktioniert das Beispielprogramm auch ohne Probleme und eben ohne diese, im Original-Thread, beschriebene Fehlermeldung.
-
So - jetzt bin ich auch angemeldet
Bei Splash2 verstehe ich nicht, warum beim Load-Event eben die MessageBox nicht angezeigt wird, sondern erst nach Ablauf der Zeit oder schliessen des Fensters. Das ändert sich auch nicht, wenn man aus dem Load-Event ein Show-Event macht.
Normalerweise müssten diese beiden Events ja sofort ausgeführt werden, das hängt wohl mit ApplicationContext zusammen - also irgend etwas läuft da auch so nicht rund.
-
Wieso ? Das Verhalten ist gewünscht.
if(sender->Equals(splashForm)) { ApplicationContext::MainForm = mainForm; ApplicationContext::MainForm->Show(); } else if(sender->Equals(mainForm)) { ApplicationContext::OnMainFormClosed(sender,e); }
Erst wenn SPlashScreen zu geht und das CloseEvent feuert wird die Form getauscht und die Mainform angezeigt.
-
Irgendwie war das Forum weg. Aber das war wohl nur ein Schnellschuss von mir *g*
Ich hatte natürlich nicht gelesen, welches Form zuerst erscheint... dachte Form1.private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { MessageBox::Show("Test"); }
Das meinte ich (aber hatte da eben die Forms verwechselt - so ist klar, dass da diese MessageBox erst nach schliessen des ersten Fensters auftaucht.
-
Ah jetzt ja
Vllt. hat ja noch jemand einen Hinweis auf die Problematik mit dem AppContext - ich hab nun das Gefühl das die Lösung "dirty" ist und hab (noch) nicht das know how das zu beurteilen :o(
-
Ich bin nun nicht auf meinem PC, also kann ich den Link nicht posten, aber da ist sehr aufschlussreiches Material in der Visual Studio Hilfe - speziell unter Klassen ApplicationContext (hätte ich auch früher drauf kommen können). Sieht genauso aus, wie ich mir das erhofft hatte und scheint doch ziemlich clean zu sein. Mehr noch... das Beispiel mit dem Splash-Screen kompliziert das Ganze irgendwie *g*
Vereinfacht: Man muss keine Form-Klasse in Application::Run starten... es genügt ein Kontext... also eine von ApplicationContext abgeleitete Klasse, in der man dann seine Forms erstellen, verwalten, etc. kann
EDIT: ... und natürlich diese dann mit Application::Run starten.Heute Nacht hatte ich da noch einen unsinnigen Fehler (irgendwie hat VS wohl ein Problem), aber wenn das heute Abend clean funktioniert, dann poste ich das mal.
-
Macht das die Klasse aus der FAQ nicht ?
-
Sie macht das schon, nur etwas komplizierter (nach meinem Verständnis), da hier die Forms noch im Konstruktor angegeben werden. Aber im Endeffekt kann man in diese abgeleitete Klasse soviele Forms integrieren, wie man will (sowieso) und diese müssen dann nicht zugewiesen werden, etc. Der Context ist die Klasse und nicht, wie ich annahm, das MainForm (war dumm, ich weiss). Innerhalb der Klasse müssen dann einfach die Show/Close-Events so abgefangen werden, dass die Klasse weiss, ob nun wirklich alles geschlossen ist und diese dann eben terminieren kann.
Und somit ist man doch völlig frei in der Handhabe. Nur habe ich das eben noch nicht getestet und weiss nicht, ob nun auch Update() noch nötig ist, oder eben nicht.
-
Ok, sehe ich noch nicht so den Unterschied
Ich habs im Konstruktor lieber weil ich die Klassen dann besser für viele Projekte nehmen kann Wäre prima wenn Du den Link posten könntest am abend, in der MSDN verläuft man sich manchmal ober findet die passende stelle einfach nicht
-
Kenne ich *g*
Und mache ichUnd ansonsten hatte ich da nur den Denkfehler (oder auch /pure Dummheit), indem ich mir den überladenen Konstruktor nicht genauer angesehen hatte (naja... den hätte ich auch nicht wirklich zuordnen können). Denn Application::Run gibt es einmal mit einer Form und einmal eben mit einem Kontext. Da ich nur die Forms als Parameter gesehen hatte... dummer Fehler eben
-
So - hier mal der Link:
ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.de/cpref17/html/T_System_Windows_Forms_ApplicationContext.htm