Отличие WindowsForms от простого консольного приложения - PullRequest
2 голосов
/ 05 мая 2010

В настоящее время я начал «переносить» свои консольные проекты на WinForms, но, похоже, мне это не удается.

Я просто привык к консольной структуре:

Мои классы взаимодействовали друг с другом в зависимости от ввода, поступающего с консоли. Простой поток:

Input -> ProcessInput -> Execute -> Output -> wait for input

Теперь я получил этот большой Form1.cs (и т. Д.) И "Application.Run (Form1);" Но я действительно понятия не имел, как мои классы могут взаимодействовать с формой и создавать поток, как я описал выше.

Я имею в виду, у меня просто есть эти "...._ Click (object sender ....)" для каждого "элемента" внутри формы. Теперь я не знаю, где разместить / запустить мой поток / цикл и как мои классы могут взаимодействовать с формой.

Ответы [ 2 ]

5 голосов
/ 05 мая 2010

На самом деле довольно просто (хотя я могу сочувствовать вашему замешательству) ...

1. Входной
Иметь TextBox и Button. Когда пользователь нажимает кнопку, воспринимайте все, что находится в вашем TextBox, как ввод.

2. Ввод процесса
В консольном приложении пользователь не может ничего делать во время обработки ввода. Аналогом этого в приложении Windows Forms является отключение механизма, с помощью которого пользователь может вводить данные. Итак, установите ваши TextBox.Enabled = false и Button.Enabled = false.

3. Выполнить
Запустите любой метод, который вы хотите выполнить.

4. Выход
Имейте какое-то сообщение, отображаемое в форме. Это может быть просто другой TextBox или RichTextBox ... как хотите.

5. Ожидание ввода
Как только ваш метод из шага 3 выполнен, вы отобразили вывод в части 4, вы можете продолжить и повторно активировать свой механизм для приема ввода: TextBox.Enabled = true и Button.Enabled = true.

Так что в основном ваш код должен выглядеть примерно так:

void myButton_Click(object sender, EventArgs e) {
    try {
        myInputTextBox.Enabled = false;
        myButton.Enabled = false;

        var input = ParseInput(myInputTextBox.Text);

        var output = ExecuteMethodWithInput(input);

        myOutputTextBox.Text = FormatOutput(output);

    } finally {
        myInputTextBox.Enabled = true;
        myButton.Enabled = true;
    }
}
3 голосов
/ 05 мая 2010

По сути, ваша форма может предоставлять набор элементов управления для ввода данных (т. Е. Один или несколько элементов управления TextBox). Если у вас есть кнопка, которую пользователь нажимает, и вы хотите ее обработать, просто дважды нажмите на кнопку. Это даст вам обработчик событий, такой как:

private void button1_Click(object sender, EventArgs e)
{
     // Process Input from TextBox controls, etc.
     // Execute method
     // Set output (To other controls, most likely)
}

Вот и все - «петля» исчезает, так как на ее место приходит стандартный насос сообщений Windows.

...