-
Notifications
You must be signed in to change notification settings - Fork 0
Auf Benutzereingabe warten
Sir Toby edited this page Nov 7, 2020
·
1 revision
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.
Soll nun in einem Form auf die Eingabe gewartet werden, dann muss folgendes gemacht werden:
- In jedem Eventhandler zu
MouseDown
,Click
undKeyPress
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. - 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 einerasync
Methode gemacht werden muss.
Wichtig:async void
ist hier nur bei Eventhandlern gestattet, ansonsten muss der Typ immerasync Task
oderasync Task<T>
sein, wobeiT
dem Rückgabetyp der Methode entspricht.
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();
}
- Details zu async und await: https://docs.microsoft.com/de-de/dotnet/csharp/async
- Ursprüngliches Issue: https://github.com/DerEinzehnte/Conspiratio-Programm/issues/68