Laden...

Wieso wirkt ShowDialog nicht mehr richtig?

Erstellt von lowrider vor 18 Jahren Letzter Beitrag vor 18 Jahren 11.499 Views
L
lowrider Themenstarter:in
82 Beiträge seit 2005
vor 18 Jahren
Wieso wirkt ShowDialog nicht mehr richtig?

HI All

Ich habe ein kleines aber Feines Problem....
Bei einem ShowDialog aufruf soll ja der Programmcode im Main solange stehen bleiben bis sich das Fenster schliesst...nun...am Anfang gings auch noch nur jetzt gehts plötzlich nicht mehr.
Bin jetzt schon seit etwa 1h dran rauszufinden wieso?
Aber leider keine Lösung gefunden...

Damit ihr einen wirklichen Überblick habt, habt ihr im Anhang mein gesammtes Projekt...hoffe jemand macht sich die Mühe und schaut es sich mal an...

Wirklich am verzeifeln!

mfg
low

6.862 Beiträge seit 2003
vor 18 Jahren

Und wo tritt dann genau der Fehler auf und wie äußert er sich? Nur mit dem Projekt kann ich auch nichts anfangen, da sind noch andere Fehler drin 😉

Baka wa shinanakya naoranai.

Mein XING Profil.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo lowrider,

mal grundsätzlich: Bei ShowDialog bleibt nichts stehen. Im Gegenteil: ShowDialog verarbeitet weiter munter alle Nachichten. Denn wenn es das nicht täte, wäre der Dialog nicht bedienbar.

herbivore

L
lowrider Themenstarter:in
82 Beiträge seit 2005
vor 18 Jahren

ja mom...ich mach ma das der Code sonst ohne fehler durchläuft...😜

Ja das ist mir schon klar aber wenn ich aber das so mache:

dlg.Showdialog(); //jetzt wird gewartet bis der dialog wieder geschlossen wurde...

6.862 Beiträge seit 2003
vor 18 Jahren

Was ich grad mal noch anmerken wollte...
Der Flashplayer als ActiveX Control eingebunden geht ja wohl mal gar nicht...

Baka wa shinanakya naoranai.

Mein XING Profil.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo lowrider,

es ist richtig, dass die ShowDialog-Methode erst zurückkehrt, wenn der Dialog geschlossen ist. Aber die Nachrichtenverarbeitung geht weiter. Dazu verwendet ShowDialog intern DoEvents.

herbivore

L
lowrider Themenstarter:in
82 Beiträge seit 2005
vor 18 Jahren

So hab jetzt nochmal das ganze so gemacht das eigentlich keine Abstürze mer vorkommen sollten 😛...

Also
Ich habe nun das Problem das beim aufruf der EingabeMaske ja Spielername und Passwort eingegeben wird... Nun wenn jetzt irgendetwas fehlt fange ich dies mit den if / else schleifen ab.
Sprich Nickname oder Pass... und wenn nun die MessageBox kommt das zB kein Nick eingegeben wurde fährt das Programm einfach weiter und es kommt das Hauptfenster....
Wieso das?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo lowrider,

ich habe ja schon eine Vermutung geäußert. Kann kaum was anderes sein. Such mal im Forum nach DoEvents

herbivore

L
lowrider Themenstarter:in
82 Beiträge seit 2005
vor 18 Jahren

Mein Problem ist es ja, das es heute Nachmittag noch funkioniert hat und auf einmal nicht mehr....
Sollte ja eigentlich nicht sein....

564 Beiträge seit 2006
vor 18 Jahren

hi!

Original von lowrider
Mein Problem ist es ja, das es heute Nachmittag noch funkioniert hat und auf einmal nicht mehr....
Sollte ja eigentlich nicht sein....

Ich bin mir sicher, wenn du den Code von jetzt heute Nachmittag ausgeführt hättest, wäre das selbe bei rausgekommen. Von jetzt auf dann wird ja nichts einfach so anders 😉

der Marcel

:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]

L
lowrider Themenstarter:in
82 Beiträge seit 2005
vor 18 Jahren

Ja ich weiss ja auch nicht....aber auf jedenfall ist es extrem seltsam...
Mit den Interenen DoEvents komm ich leider noch nicht so ganz zu recht....kann mir da evt. jemand noch weiterhelfen?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo lowrider,

hast du denn schon im Forum gesucht? Musst du mal ein bisschen forsten. Unter den DoEvents-Beiträgen, sind auch einige, die die Sachlage und die Auswikungen genau erklären.

herbivore

379 Beiträge seit 2004
vor 18 Jahren

Ich habe da so eine Idee.

Ich weiß nicht ob ich es richtig verstanden habe, aber ich denke du meinst es so, das du halt Nutzername und Passwort eingibst und auf "OK" (oder ähnliches) klickst. Wenn alles korrekt eingegeben wurde, soll das Fenster einfach zu gehen, wenn nicht dann soll eine MessageBox aufgehen und der Dialog soll danach noch offen bleiben um z.B. das korrekte Passwort einzugeben. Hab ich das soweit korrekt verstanden?

Bei dir geht aber das Fenster einfach zu, oder? Das liegt dann wahrscheilich daran das bei dir der "OK"-Button auf DialogResult.OK steht und wenn du dann auf das Click-Event reagierst wird am Ende deiner Methode der Dialog geschlossen. Wenn du deine MessageBox mit der Fehlermeldung öffnest musst du noch den DialogResult auf z.B. None setzen und dann sollte der Dialog wieder zu gehen. Kannst es ja mal ausprobieren 😉

ciao Anke

O
23 Beiträge seit 2006
vor 18 Jahren

Ich hab nen ähnliches Problem oder auch dasselbe wie lowrider bereits beschrieben hat.

Aus meiner mainForm ruf ich eine LoginForm mit ShowDialog auf.

Login log = new Login(myconn);
log.ShowDialog();

In der LoginForm gibt es 2 Buttons. Einer zum Connecten, der andere zum Verlassen des Programms. Beim Klicken des ExitButtons erscheint ne Sicherheitsabfrage per MessageBox um nicht beim versehenlichen Klicken des ExitButtons gleich das ganze Programm zu beenden. Klickt man auf "Ja", so wird das Programm beendet. Klickt man jedoch auf "Nein", so wird das LoginForm beendet und man kehrt zurück zum MainForm. So kann man dann den Login umgehen, was ja nicht sein soll. Er sollte eigentlich zum LoginForm zurückkehren.
Hab schon etwas im Forum gesucht, aber bisher noch nichts gefunden.
hurricanes Vorschlag mit DialogResult.None hab ich auch schon probiert, klappt aber net.


private void exitButton_Click(object sender, System.EventArgs e)
{
	DialogResult dr;
	dr = MessageBox.Show("Möchten Sie das Programm wirklich beenden?",
		"Programm Beenden",
		MessageBoxButtons.YesNo,
		MessageBoxIcon.Question);
	switch (dr)
	{
		case DialogResult.Yes:
			Application.Exit();
			break;
		case DialogResult.No:
			textBox2.Clear();
			break;
	}
}
379 Beiträge seit 2004
vor 18 Jahren

Probier doch bitte mal folgendes:


private void exitButton_Click(object sender, System.EventArgs e)
{
    DialogResult dr;
    dr = MessageBox.Show("Möchten Sie das Programm wirklich beenden?",
        "Programm Beenden",
        MessageBoxButtons.YesNo,
        MessageBoxIcon.Question);
    switch (dr)
    {
        case DialogResult.Yes:
            Application.Exit();
            break;
        case DialogResult.No:
            textBox2.Clear();

            this.DialogResult.None;

            break;
    }
}  

Geht jetzt immernoch der Dialog automatisch zu auch enn du Nein geklickt hast?

ciao Anke

O
23 Beiträge seit 2006
vor 18 Jahren

Danke Anke, das wars

Es heißt jedoch

this.DialogResult = DialogResult.None
379 Beiträge seit 2004
vor 18 Jahren

Hmm ja klar, war gerade am Feierabend und habe den Beitrag schnell vor dem losgehen geschrieben 😉 aber du hast es ja selber hinbekommen 👍

4.221 Beiträge seit 2005
vor 18 Jahren

@hurricane

Brauchst Du da wirklich ein Application.Exit ???

Ein this.Close wäre doch schöner... und wenn Du die Anwendung nur mit Application.Exit zu bringst ist das meist ein Hinweis auf nen unsauberen Programmaufbau...

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

379 Beiträge seit 2004
vor 18 Jahren

Ich habe ja nur den Code von orpheus2k genommen und eine Zeile eingefügt 😉

4.221 Beiträge seit 2005
vor 18 Jahren

👍

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

O
23 Beiträge seit 2006
vor 18 Jahren

Original von Programmierhans
@hurricane

Brauchst Du da wirklich ein Application.Exit ???

Ein this.Close wäre doch schöner... und wenn Du die Anwendung nur mit Application.Exit zu bringst ist das meist ein Hinweis auf nen unsauberen Programmaufbau...

Is das denn wirklich so unschön? ich bin noch ziemlicher Anfänger in C# und WindowsForms und kenn mich da mit sauberer Programmierung noch nicht soo aus.

Ich hab nen Mainform und dieses startet das LoginForm. Wenn man dann im LoginForm auf abbrechen bzw beenden klickt, dann soll das ganze Programm, welches im MainForm per Application.Run gestartet wurde beendet werden. Deshalb dachte ich, ich mach das per Application.Exit, da this.Close ja nur das LoginForm schließt. Zudem müsste ich dann noch beim Schließen von LoginForm überprüfen, ob der Login erfolgreich war oder nicht.

4.221 Beiträge seit 2005
vor 18 Jahren

Es gibt diverse schönere Varianten:



//LoginForm in eigenem MessageLoop
/// <summary>
		/// Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		static void Main() 
		{
			//LoginForm instanzieren
			LoginForm login=new LoginForm();
			//Application-Loop nur mit dem LoginForm hochfahren
			Application.Run(login);

			//Wenn LoginOK war die eigentliche Anwendung Starten
			if (login.LoginOK)
			{
				Application.Run(new Form1());
			}
		}


und der Code des Login-Forms




		//Variable und Redonly Property auf dem LoginForm
		//Diese Variable setzt du auf OK wenn der Login ok war
		//resp. auf false wenn der Login in die Hose ging
		private bool _LoginOK=false;

	
		public bool LoginOK
		{
			get{return this._LoginOK;}
		}


		private void btnCheckLogon_Click(object sender, System.EventArgs e)
		{
			try
			{
				//Hier prüfen Du eingeloggt bist
				//Ich nehme hier an, dass die Prüfung eine Exception wirft
				//wenn der User nicht berechtigt ist
				
				//Simuliere geworfenen Fehler
				//throw new Exception("Du kummst hier net rein :-)");
				//
				this._LoginOK=true;
			}
			catch
			{
				this._LoginOK=false;
			}
			
			finally
			{
				this.Close();
			}
		}


Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

O
23 Beiträge seit 2006
vor 18 Jahren

Ich habe das Ganze abgeändert und starte das Programm nun nicht mehr aus der MainForm, sondern aus ner Start-Klasse, die dann die einzelnen Forms aufruft. Ich hoffe nun, das dies "schön" programmiert ist 8)

zurDBverbinden con;
Login login;
Frontend frontend;

con = new zurDBverbinden();
if(con.VerbindungHergestellt)
{
	login = new Login();
	Application.Run(login);
	if (login.LoginOK)
	{
		frontend = new Frontend();
		Application.Run(frontend);
	}
}
else
{
	MessageBox.Show("Es konnte keine Verbindung zur Datenbank hergestellt werden.\n Überprüfen sie ihre Netzwerkverbindung und starten sie die Anwendung erneut!",
		"DB connection error",
		MessageBoxButtons.OK,
		MessageBoxIcon.Error);

}

Und danke Programmierhans für die ganzen Tipps und Anregungen

S
1.047 Beiträge seit 2005
vor 18 Jahren

Nun wenn jetzt irgendetwas fehlt fange ich dies mit den if / else schleifen ab.

[klugscheiß]IF/ELSE Schleifen gibts nicht, das ist eine Verzweigung 😉[/klugscheiß]

O
23 Beiträge seit 2006
vor 18 Jahren

🤔
Was ist denn an if-Anweisungen so schlimm. Ich brauch sie nun mal für die Sicherheitsabfragen.
Ich muss erst überprüfen, ob das Verbinden zur Datenbank und der Login des Benutzers erfolgreich war, bevor man machen kann. Sonst kann ja jeder Chaos in die Datenbank bringen!

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo orpheus2k,

an if-Anweisungen ist gar nichts schlimm. Es gibt nur keine if-Schleifen.

herbivore

O
23 Beiträge seit 2006
vor 18 Jahren

😁
War auch etwas verwundert drüber. Aber nun versteh ich das Ganze. Hatte mich nur angesprochen gefühlt