Skip to content

Auf Benutzereingabe warten

Sir Toby edited this page Nov 7, 2020 · 1 revision

Allgemein

In Conspiratio muss häufig auf eine Eingabe des Benutzers gewartet werden. Dazu gibt es im Basisform frmBasis drei Methoden:

  • AufRechtsklickWarten
  • AufButtonKlickWarten (damit sind bestimmte Buttons gemeint, z.B. die blauen Kristalle bei der Wahl eines neuen Amtsträgers)
  • AufEnterdruckWarten

da ein Aufruf dieser Methoden nur in einem Form Sinn macht. Zu beachten ist hier, dass es sich bei den Methoden um asynchrone Methoden handelt, ein Aufruf also immer mit await erfolgen muss, da das Warten auf die Eingabe ansonsten nicht funktioniert.

Benutzung

Soll nun in einem Form auf die Eingabe gewartet werden, dann muss folgendes gemacht werden:

  1. In jedem Eventhandler zu MouseDown, Click und KeyPress wird das TaskResult gesetzt, wenn die Useraktion in diesem Fall die Eingabe auslösen soll. Das ist nicht immer gewünscht und muss individuell im Einzelfall geprüft werden.
  2. An allen Stellen, an denen im Form gewartet werden soll, wird der Aufruf eingefügt, z.B. await AufRechtsklickWarten();. Dabei musss beachtet werden, dass die Methode, in der der Aufruf erfolgt, zu einer async Methode gemacht werden muss.
    Wichtig: async void ist hier nur bei Eventhandlern gestattet, ansonsten muss der Typ immer async Task oder async Task<T> sein, wobei T dem Rückgabetyp der Methode entspricht.

Beispiel

Hier ein komplettes Beispiel:

// Dieser Buttonklick gehört zu den Events, auf die gewartet werden soll
private void btn1_Click(object sender, EventArgs e)
{
	// Code ...
	tcsButtonklick?.TrySetResult(true);
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
	if (e.Button == MouseButtons.Right)
	{
		tcsRechtsklick?.TrySetResult(true);
	}
	// Ggf. weiterer Code ...
}

private void txt1_KeyPress(object sender, KeyPressEventArgs e)
{
	if (e.KeyChar == (char)Keys.Enter)
	{
		// Code zur Prüfung der Eingabe ...
		
		// Wenn Eingabe ok war:
		tcsEnterdruck?.TrySetResult(true);
	}
}

private async void Form1_Shown(object sender, EventArgs e)
{
	// Aktionen durchführen und dem Spieler z.B. eine Auswahl anzeigen ...
	await AufButtonKlickWarten();
	
	// Weiteren Text anzeigen ...
	await AufRechtsklickWarten();
	
	await WeitereUntermethode();
	
	// Weiteren Text anzeigen ...
	await AufRechtsklickWarten();
	Close();  // Nach dem letzten Rechtsklick die Form schließen
}

// Eine Untermethode, die Logik kapselt aber keinen eigenen Rückgabewert hat
private async Task WeitereUntermethode()
{
	// Text und Textbox anzeigen anzeigen ...
	await AufEnterdruckWarten();
}

Siehe auch

Clone this wiki locally