Hallo Forumianer 😉
Ich bin neue hier und komme gleich mit einem Problem ins Haus getürmt, sorry.
Ich beiße mir bereits seit einiger Zeit die Zähne am folgenden Problem aus.
In einer .NETCF Anwendung werden zwei Fenster erzeugt. Das erstere dient als Splashscreen und als Anmeldeformular, das zweite ist das Hauptformular der Anwendung. Hierzu verwende ich folgenden Code:
private void Run() {
DialogResult loginResult = DialogResult.Abort;
//- Login ----------------------------------------------------
//Login durchführen und anschließend die Daten laden
using (AuthService authService = AuthService.GetInstance()) {
try {
if (!authService.InitializeDriver(settings.AuthDriver.Configuration))
throw new Exception(msgAuthDriverInitializationFailed);
LoginForm frmLogin = new LoginForm();
frmLogin.LoadMethod = new LoginForm.LoadingMethod(this.LoadApplicationData);
loginResult = frmLogin.ShowDialog();
} finally {
//Die vom Treiber beanspruchte Resourcen freigeben
authService.Dispose();
}
}
//- Hauptanwendung -------------------------------------------
if (loginResult == DialogResult.OK) {
//GatheringService initializieren
using (GatheringService gthService = GatheringService.GetInstance()) {
try {
if (!gthService.InitializeDriver(settings.GatheringDriver.Configuration))
throw new Exception(msgGathDriverInitializationFailed);
Application.Run(new MainForm());
} finally {
//Die vom Treiber beanspruchte Resourcen freigeben
gthService.Dispose();
}
}
}
}
Hierbei tritt aber ein merkwürdiges Verhalten auf:
Das Login-Formular wird geschlossen, aber das Hauptformular erscheint nicht.
Erst nach Betätigung der Alt+Tab Tastenkombination wird das Hauptformular angezeigt (scheinbar wird dieser im minimiertem Zustand erzeugt, obwohl WindowState = Maximized ist???). Auch der Versuch in dem Form.OnLoad-Event BringToFront() aufzurufen bzw. WindowState erneut auf Maximized zu setzen brachte keinen Erfolg.
Ist jemandem ein solches Verhalten bereits über den Weg gelaufen, oder kann jemand einen Gedankenfehler entdecken?
Ich danke euch allen im Voraus!
Viele Grüße
Builder
P.S.: Es handelt sich um ein Windows CE .NET 4.2 Device mit .NETCF 1.0.
Das 1.0er Framework ist hier recht radikal und merkwürdig. Die einfachste Möglichkeit wäre IMHO den Login im FormLoad Ereignis der MainForm zu betreiben.
(Der erste Aufruf von ShowDialog läuft AFAIK ohne MessageQueue)
Was passiert wenn Du den Aufruf so machst:
private void Run() {
DialogResult loginResult = DialogResult.Abort;
//- Login ----------------------------------------------------
//Login durchführen und anschließend die Daten laden
using (AuthService authService = AuthService.GetInstance()) {
try {
if (!authService.InitializeDriver(settings.AuthDriver.Configuration))
throw new Exception(msgAuthDriverInitializationFailed);
LoginForm frmLogin = new LoginForm();
frmLogin.LoadMethod = new LoginForm.LoadingMethod(this.LoadApplicationData);
//loginResult = frmLogin.ShowDialog();
} finally {
//Die vom Treiber beanspruchte Resourcen freigeben
authService.Dispose();
}
}
//- Hauptanwendung -------------------------------------------
// if (loginResult == DialogResult.OK)
{
//GatheringService initializieren
using (GatheringService gthService = GatheringService.GetInstance()) {
try {
if (!gthService.InitializeDriver(settings.GatheringDriver.Configuration))
throw new Exception(msgGathDriverInitializationFailed);
Application.Run(new MainForm());
} finally {
//Die vom Treiber beanspruchte Resourcen freigeben
gthService.Dispose();
}
}
}
}
Hallo Knuddlbaer,
die Problematik mit dem ShowDialog ohne Run ist mir bewusst. Allerdings wird
soweit ich weis eine Message-Queue vom SchowDialog selbst erzeugt. Unschön
ist allerdings die Tatsache, dass ohne Application.Run() kein abschließendes
Cleanup vom Program durchgeführt wird, was der Fall währe, wenn der
Benutzer das Login abbricht. Zwar räumt das System hinter mir auf, aber unschön
ist es trotzdem. Daran grüble ich noch.
Deinen Vorschlag werde ich am Montag testen. Danke dir für deine Antwort 😃
In der Dokumentation ist mir nichts bekannt, das ShowDialog eine eigenen Queue anlegt. Hinweise auf den Reflektor in Beiträgen der NewsGroup weisen darauf hin, das ShowDialog auch eine Queue erzeugen kann.
Das Verhalten ist dennoch als Undefiniert anzusehen, erst recht im 1.0er CF das an einigen Stellen ohnehin anders Tickt.
Probleme mit verschwundenen Forms kenne ich ein wenig im 1.0er Framework, vor allem wenn man mit anderen Applikationen interagieren muss. Hier half oft der WorkArround eines Timers mit 100ms, einmaligen Lauf und einem Focus und BringToFront im TimerTick. (Vor allem wenn es ein CF ohne SP ist.)
(Im 2.0er CF gibt es diese Probleme zum Glück nicht mehr 😮)
Hallo Knuddlbaer,
ich bin deinem Rat gefolgt und nun funktioniert ales wie gewohlt! Danke dir 😃
Der Code siet nun volgendermaßen aus:
private void Run() {
//- Hauptprogramm -------------------------------------------
//GatheringService vorbereiten
using (GatheringService gthService = GatheringService.GetInstance()) {
Application.Run(new MainForm());
}
}
private void LoadForm(object sender, EventArgs e) {
Settings settings = Settings.GetInstance();
//- Login ----------------------------------------------------
DialogResult loginResult = DialogResult.Abort;
//Login durchführen und anschließend die Daten laden
using (AuthService authService = AuthService.GetInstance()) {
if (!authService.InitializeDriver(settings.AuthDriver.Configuration))
throw new Exception(msgAuthDriverInitializationFailed);
LoginForm frmLogin = new LoginForm();
frmLogin.LoadMethod = new LoginForm.LoadingMethod(this.LoadApplicationData);
loginResult = frmLogin.ShowDialog();
}
if (loginResult == DialogResult.OK) {
//GatheringTreiber initialisieren
GatheringService gthService = GatheringService.GetInstance();
if (!gthService.InitializeDriver(settings.GatheringDriver.Configuration))
throw new Exception(msgGathDriverInitializationFailed);
this.BringToFront();
} else this.Close();
}
Danke dir Nochmals!