Как перенести консольное приложение в windows forms c
Теперь я хочу, чтобы пользователь мог ввести ответ, выбрав 1 из 4 кнопок (от A до D). Исходя из моего старого кода, я не уверен, как заставить программу ждать, пока пользователь нажмет одну из кнопок. Я предполагаю, что мне нужно изменить природу циклов, но я просто не могу понять, как. Любая помощь приветствуется.
Вот фрагмент моего кода консоли:
1 ответ
Переход от ориентированной на подсказки среды, такой как консольная программа, к среде, управляемой событиями, такой как Winforms, да. это определенно потребует, по крайней мере, некоторых изменений в "природе циклов".:)
В вашем конкретном сценарии у вас есть две разные вещи, с которыми вам нужно иметь дело: запросить пользователя и получить его ввод.
Во-первых, что происходит, когда пользователь запускает процесс? Предположительно, у вас будет форма, где на этой форме есть кнопка (или, возможно, пункт меню), которая при нажатии / выборе запускает все это. Это может выглядеть примерно так:
(Я изменил вашу логику выбора вопроса выше на что-то более эффективное, предполагая, что у вас есть ShuffleQuestions() метод. См. Использование Random и OrderBy хороший алгоритм перемешивания? для деталей о том, как реализовать это).
То, что делает приведенный выше код в ответ на нажатие пользователем button1 Кнопка (которая предположительно содержит текст типа "Пуск" или что-то в этом роде), выполняет цикл, очень похожий на тот, что был в вашей консольной программе. Два основных различия:
- Где в вашей консольной программе вы используете Console.WriteLine() для отображения текста пользователю, здесь я показал использование TextBox элементы управления в вашей форме, которые используются для отображения того же текста.
- Что в вашей консольной программе вы используете Console.ReadLine() чтобы получить ввод от пользователя, этот цикл создает TaskCompletionSource объект для совершенно другого метода для использования. Тот метод, который выполняется с вашим button2 Кнопка (которая предположительно содержит текст типа "Проверить ответ" или что-то в этом роде) будет читать текст, введенный пользователем в текстовое поле (здесь я дал ему имя textBoxUserAnswer ), сравните его с правильным ответом на вопрос (который был предоставлен этому методу другим методом через AsyncState собственность Task созданный TaskCompletionSource объект, который я создал), и установите Task результат к true или же false в зависимости от того, получил ли пользователь правильный ответ или нет.
Сложная часть выше - это то, что "под капотом" этот первый метод фактически возвращается, как только он закончил, заполняя текст первого вопроса, и достигает await Заявление в цикле. Компилятор переписывает весь метод, чтобы облегчить это.
когда button2 толкается и устанавливает результат Task затем фреймворк знает, как возобновить выполнение первого метода, на котором он остановился на await Скажите, продолжая ваш цикл.
Эта последовательность продолжается до тех пор, пока пользователь не ответит на все вопросы.
Глава 2. Hello, Windows Forms
Программы из предыдущей главы, конечно же, не были Windows-программами. Они не создавали свои собственные окна, не выводили графики и ничего не знали про мышь. Весь ввод и вывод пользователя осуществлялся через класс Console . Пришла пора двигаться вперед. В дальнейшем в книге мы не забудем класс Console полностью, но его роль будет сведена к использованию в рутинных операциях вроде ведения журналов или несложной отладки.
Он же действует по умолчанию, если ключ target не указан. Для создания исполняемого файла Windows служит:
Этот ключ компилятора не делает ничего особо сложного. Он лишь устанавливает в исполняемом файле флажок, показывающий, как загружать и запускать программу. Если исполняемый файл помечен как консольное приложение и запускается из Windows, ОС Windows создает окно командной строки, в котором программа запускается и осуществляет вывод на консоль. Если консольное приложение запускается из окна командной строки, то приглашение MS-DOS не появляется снова до тех пор, пока программа не завершится. Если исполняемый файл помечен как приложение Windows, окно командной строки не создается, и программа ничего не выводит на консоль. При запуске такой программы из окна командной строки, приглашение MS-DOS появляется снова сразу же после запуска программы. Таким образом, если скомпилировать приложение Windows Forms как консольное, ничего плохого не случится!
Конечно, я бы не стал поставлять Windows-программу, скомпилированную как консольное приложение, пользователям, не являющимся разработчиками. Их могло бы смутить появление окна командной строки, если только они не имеют опыта работы с UNIX или UNIX-подобными средами. Но это всего лишь ключ компилятора, который можно изменить в любое время.
Настоящее отличие между консольным приложением и Windows-приложением заключается в способе получения программой входных данных от пользователя. В консольное приложение информация вводится с клавиатуры при помощи методов Console.Read или Console.ReadLine; в приложение Windows Forms информация вводится с клавиатуры (и других устройств) при помощи событий (events), которым в этой книге уделено большое внимание.
- System.dll
- System.Drawing.dll
- System.Windows.Forms.dll
У меня есть консольное приложение, которое кое-что делает в фоновом режиме, и я хочу сделать так, чтобы пользователь мог изменять некоторые вещи, которые делает консольное приложение.
Я хочу добавить приложение Windows Form, чтобы просто получать вводимые пользователем данные и отправлять их в консольное приложение для использования. Я искал и не нашел то, что ищу
У меня есть это:
Но я хочу проверить, установлен ли флажок в форме Windows, вместо того, чтобы устанавливать для него значение true следующим образом:
В Windows Form этот флажок называется CheckOnOrOff, и он отмечен.
3 ответа
Я предполагаю, что пользователь может изменять настройки во время работы консольного приложения, и эффект должен быть получен немедленно. Добавление вашего приложения winforms в качестве ссылки в консоли не поможет, поскольку это будет другое приложение. Вот что я предлагаю:
Создайте новое приложение winforms и измените тип вывода с «Windows Application» на «Console Application», чтобы мы могли видеть консоль. Перенесите логический процесс консоли в проект winforms
Добавьте новый статический класс, который будет удерживать флаг между winforms и console. Пример:
- Добавьте флажок в форме Windows Form и добавьте код ниже к событию изменения флажка:
- Добавьте кнопку для запуска консольного процесса и используйте поток для запуска консольного процесса, как показано ниже:
- Это класс ConsoleProcess, который содержит логику вашей консоли.
Если вы хотите, чтобы форма была свернута в область уведомлений, см. свернуть приложение в области уведомлений
Вы можете получить ввод из формы Windows (пользователем), а затем передать его в консольное приложение, используя аргумент параметра в консольном приложении.
Параметр метода Main - это массив String, представляющий аргументы командной строки.
Итак, если бы у меня была консольная программа (MyCApp.exe) вот так:
Это я начал в командной строке так:
MyCApp.exe Arg1 Arg2 Arg3 В метод Main будет передан массив, содержащий три строки: «Arg1», «Arg2», «Arg3».
Если вам нужно передать аргумент, содержащий пробел, заключите его в кавычки. Например:
MyCApp.exe "Arg 1" "Arg 2" "Arg 3" Аргументы командной строки обычно используются, когда вам нужно передать информацию вашему приложению во время выполнения. Например, если вы пишете программу, которая передает основную информацию для копирования файла из одного места в другое, вы, вероятно, передадите два места в качестве аргументов командной строки. Например:
Здесь C: \ file1.txt - первый аргумент, C: \ file2.txt - первый аргумент, Copyit - третий аргумент.
Я думаю, вам следует разработать базу данных для хранения пользовательского ввода. Ваш консольный проект и проект окна будут запускаться и управляться этой базой данных.
Изучив это руководство, вы:
- Добавите второй проект.
- Ссылка на библиотеки и добавление пакетов
- Выполните дополнительную отладку.
- Проверите готовый код.
Предварительные условия
Для работы с этой статьей можно использовать любое из следующих приложений калькулятора.
Добавление еще одного проекта
Реальный код связан с проектами, которые объединены в решение. Вы можете добавить проект библиотеки классов в приложение калькулятора, предоставляющее некоторые функции калькулятора.
В Visual Studio выберите Файл > Добавить > Новый проект, чтобы добавить новый проект. В Обозревателе решений щелкните решение правой кнопкой мыши, чтобы добавить проект из контекстного меню.
В Обозревателе решений щелкните узел решения правой кнопкой мыши и выберите пункты Добавить > Новый проект.
В диалоговом окне Настройка нового проекта введите имя проекта CalculatorLibrary и нажмите кнопку Далее.
Переименуйте файл Class1.cs в CalculatorLibrary.cs. Чтобы переименовать файл, щелкните правой кнопкой мыши имя в Обозревателе решений и выберите команду Переименовать, затем выберите имя и нажмите клавишу F2 либо выберите имя и щелкните еще раз, чтобы ввести его.
Теперь необходимо добавить ссылку на проект, чтобы первый проект мог использовать API, предоставляемые новой библиотекой классов. Правой кнопкой мыши щелкните узел Зависимости в проекте Калькулятор и выберите Добавить ссылку на проект.
Откроется диалоговое окно Диспетчер ссылок. Это диалоговое окно позволяет добавлять ссылки на другие проекты, а также сборки и библиотеки DLL COM, необходимые вашим проектам.
В диалоговом окне Диспетчер ссылок установите флажок для проекта CalculatorLibrary и выберите OK.
Ссылка на проект отображается в узле Проекты в обозревателе решений.
В файле Program.cs выберите класс Calculator и весь его код и нажмите CTRL+X, чтобы вырезать его. Затем в CalculatorLibrary.cs вставьте код в пространство имен CalculatorLibrary .
Добавьте public до класса калькулятора, чтобы предоставить его за пределами библиотеки.
Теперь код в CalculatorLibrary.cs должен выглядеть следующим образом.
Или попробуйте добавить директиву using в начало файла.
Добавление директивы using позволяет удалить пространство имен CalculatorLibrary из места вызова, но это приводит к неоднозначности. Является ли Calculator классом в CalculatorLibrary или Calculator — это пространство имен?
Чтобы устранить неоднозначность, измените имя пространства имен Calculator на CalculatorProgram в файле Program.cs.
В Обозревателе решений щелкните узел решения правой кнопкой мыши и выберите пункты Добавить > Новый проект.
В диалоговом окне Настройка нового проекта введите имя проекта CalculatorLibrary и нажмите кнопку Далее.
Visual Studio создаст новый проект и добавит его в решение.
Переименуйте файл Class1.cs в CalculatorLibrary.cs. Чтобы переименовать файл, щелкните правой кнопкой мыши имя в Обозревателе решений и выберите команду Переименовать, затем выберите имя и нажмите клавишу F2 либо выберите имя и щелкните еще раз, чтобы ввести его.
Теперь необходимо добавить ссылку на проект, чтобы первый проект мог использовать API, предоставляемые новой библиотекой классов. Правой кнопкой мыши щелкните узел Зависимости в проекте Калькулятор и выберите Добавить ссылку на проект.
Откроется диалоговое окно Диспетчер ссылок. Это диалоговое окно позволяет добавлять ссылки на другие проекты, а также сборки и библиотеки DLL COM, необходимые вашим проектам.
В диалоговом окне Диспетчер ссылок установите флажок для проекта CalculatorLibrary и выберите OK.
Ссылка на проект отображается в узле Проекты в обозревателе решений.
В файле Program.cs выберите класс Calculator и весь его код и нажмите CTRL+X, чтобы вырезать его. Затем в CalculatorLibrary.cs вставьте код в пространство имен CalculatorLibrary .
Добавьте public до класса калькулятора, чтобы предоставить его за пределами библиотеки.
Теперь код в CalculatorLibrary.cs должен выглядеть следующим образом.
Или попробуйте добавить директиву using в начало файла.
Добавление директивы using позволяет удалить пространство имен CalculatorLibrary из места вызова, но это приводит к неоднозначности. Является ли Calculator классом в CalculatorLibrary или Calculator — это пространство имен?
Чтобы устранить неоднозначность, переименуйте пространство имен из Calculator в CalculatorProgram в Program.cs и в CalculatorLibrary.cs.
Начните с добавления директив using в начало файла CalculatorLibrary.cs.
Это использование класса Trace должно подразумевать ссылку на класс, который он связывает с файловым потоком. Это требование означает, что калькулятор будет работать лучше в качестве объекта, поэтому добавьте конструктор в начало класса Calculator в CalculatorLibrary.cs.
Также удалите ключевое слово static , чтобы изменить статический метод DoOperation на метод-член.
Добавьте выходные данные журнала для каждого вычисления. DoOperation будет иметь следующий вид.
Также измените место вызова DoOperation , чтобы оно ссылалось на объект с именем calculator в нижнем регистре. Теперь код является вызовом члена, а не вызовом статического метода.
Снова запустите приложение. Когда все будет готово, щелкните правой кнопкой мыши узел проекта Калькулятор и выберите Открыть папку в проводнике.
В проводнике перейдите в папку выходных данных в разделе bin/Debug/ и откройте файл calculator.log. Результат должен выглядеть следующим образом.
Сейчас файл CalculatorLibrary.cs должен выглядеть следующим образом.
Файл Program.cs должен выглядеть как следующий фрагмент кода.
Добавление пакета NuGet: запись в JSON-файл
В Обозревателе решений щелкните правой кнопкой мыши узел Зависимости для проекта CalculatorLibrary и выберите Управление пакетами NuGet.
Откроется диспетчер пакетов NuGet.
Найдите и выберите пакет Newtonsoft.Json и нажмите кнопку Установить.
Visual Studio скачивает пакет и добавляет его в проект. Новая запись отображается в узле "Ссылки" в Обозревателе решений.
Если появится запрос на принятие изменений, нажмите кнопку OK.
Visual Studio скачивает пакет и добавляет его в проект. Новая запись отображается в узле Пакеты в Обозревателе решений.
Добавьте директиву using для Newtonsoft.Json в начало файла CalculatorLibrary.cs.
Создайте объект члена JsonWriter и замените конструктор Calculator следующим кодом.
Измените метод DoOperation , чтобы добавить код JSON writer .
Добавьте метод для завершения синтаксиса JSON после ввода пользователем всех данных для операции.
В конце файла Program.cs перед return; добавьте вызов к Finish .
Выполните сборку приложения и запустите его. Попробуйте выполнить несколько операций и закройте приложение, используя команду n.
Откройте файл calculatorlog.json в проводнике. Выходные данные должны быть примерно следующими.
Отладка. Установка точки останова и попадание в нее
Отладчик Visual Studio — очень эффективное средство. Отладчик может пошагово пройти код, чтобы найти точку, в которой есть ошибка программирования. Затем можно понять, какие исправления необходимо внести, и внести временные изменения, чтобы можно было продолжить работу приложения.
В файле Program.cs щелкните поле слева от следующей строки кода. Можно также выбрать строку и нажать клавишу F9 или щелкнуть правой кнопкой мыши и выбрать Точка останова > Вставить точку останова.
Красная точка указывает на точку останова. Для приостановки приложения и проверки кода можно использовать точки останова. Вы можете установить точку останова в любой исполняемой строке кода.
Выполните сборку и запуск приложения. Введите следующие значения для вычисления.
- Для первого числа введите 8.
- Для второго числа введите 0.
- Давайте поэкспериментируем с оператором. Введите d.
Приложение приостанавливается в созданной точке останова, которая обозначается желтым указателем слева и выделенным кодом. Выделенный код еще не выполнен.
Теперь, когда приложение приостановлено, вы можете проверить его состояние.
Отладка. Просмотр переменных
В выделенном коде наведите указатель мыши на переменные, такие как cleanNum1 и op . Текущие значения этих переменных, 8 и d соответственно, отображаются в подсказках по данным.
При отладке очень важно выполнить проверку переменных на соответствующие значения для устранения проблем.
В нижней области просмотрите окно Локальные. Если оно закрыто, выберите Отладка > Окна > Локальные, чтобы открыть его.
В окне Локальные отображаются все переменные, находящиеся в области, а также их значения и типы.
Взгляните на окно Видимые.
Окно "Видимые" аналогично окну Локальные, но отображает переменную непосредственно перед текущей строкой кода и после строки, в которой приостановлено приложение.
Далее можно поочередно выполнить код в отладчике по одной инструкции за раз. Это называется пошаговым выполнением.
Отладка. Пошаговое прохождение кода
Нажмите клавишу F11 или выберите Отладка > Выполнять по шагам.
С помощью команды "Выполнять по шагам" приложение выполняет текущий оператор и переходит к следующему исполняемому оператору. Как правило, это следующая строка кода. Желтый указатель слева всегда указывает на текущий оператор.
Вы только что выполнили по шагам метод DoOperation в классе Calculator .
Чтобы получить иерархический обзор выполнения программы, просмотрите окно Стек вызовов. Если оно закрыто, выберите Отладка > Окна > Стек вызовов, чтобы открыть его.
В этом представлении показан текущий метод Calculator.DoOperation , обозначенный желтым указателем. Во второй строке показана функция, которая вызвала метод из метода Main в Program.cs.
В окне Стек вызовов показан порядок вызова методов и функций. Это окно предоставляет доступ ко многим функциям отладчика, таким как Перейти к исходному коду, из контекстного меню.
Нажмите клавишу F10 или выберите Отладка > Шаг с обходом несколько раз, пока приложение не остановится в операторе switch .
Команда "Шаг с обходом" аналогична команде "Выполнять по шагам", за исключением того, что если текущий оператор вызывает функцию, то отладчик выполняет код в вызываемой функции и не приостанавливает выполнение до возврата функции. Команда "Шаг с обходом" выполняется быстрее, чем "Выполнять по шагам", если вас не интересует определенная функция.
Нажмите клавишу F10 еще раз, чтобы приложение приостанавливалось на следующей строке кода.
Этот код проверяет деление на нуль. Если приложение продолжит работать, оно вызовет общее исключение (ошибку), но вы можете выполнить другое действие, например просмотреть фактическое возвращаемое значение в консоли. Один из вариантов — использовать функцию отладчика Изменить и продолжить, чтобы внести изменения в код и продолжить отладку. Тем не менее мы покажем другой метод для временного изменения потока выполнения.
Отладка. Тестирование временного изменения
Выберите желтый указатель, который в данный момент приостановлен на операторе if (num2 != 0) , и перетащите его в следующий оператор.
Если перевести указатель сюда, приложение полностью пропускает оператор if , чтобы вы могли увидеть, что происходит при делении на ноль.
Нажмите клавишу F10, чтобы выполнить строку кода.
Нажмите клавишу F5 или выберите Отладка > Продолжить отладку.
Символ бесконечности отображается в консоли как результат математической операции.
Закройте приложение должным образом с помощью команды n.
Полный код
Ниже приведен полный код для файла CalculatorLibrary.cs после выполнения всех шагов.
А вот код для файла Program.cs:
Следующие шаги
Поздравляем с завершением этого учебника! Для получения дополнительных сведений изучите следующие ресурсы.
Читайте также: