Как сделать прерывание цикла при вводе данных?

Автор Тема: Как сделать прерывание цикла при вводе данных?  (Прочитано 7235 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн StonerАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Здравствуйте.
Вот кусок кода:
Код - C# [Выбрать]
  1. int num;
  2.             bool status;
  3.             do
  4.             {
  5.                 intResult = ed.GetInteger("\nВведите номер точки: ");
  6.                 num = intResult.Value;
  7.                 status = true;
  8.                 try
  9.                 {
  10.                     oPointTMP = oPoints.Find(num);
  11.                 }
  12.                 catch (ArgumentException)
  13.                 {
  14.                     if (num <= 0)
  15.                     {
  16.                         ed.WriteMessage("\nВведённое число должно быть положительным и не равно нулю");
  17.                     }
  18.                     else
  19.                     {
  20.                         ed.WriteMessage("\nВведён отсутствующий номер!");
  21.                     }
  22.                     status = false;
  23.                 }
  24.             } while (status == false);
Как сделать чтобы при желании пользователь мог прервать выполнение кода по нажатии клавиши "ESC"?
Спасибо

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
intResult.Status смотрите. OK - введен номер, None - нажат Enter, Error - нажат Esc. Есть нюансы, но в первом приближении как-то так.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
PromptIntegerOptions

Код - C [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.EditorInput;
  3. using Autodesk.AutoCAD.Runtime;
  4.  
  5. [CommandMethod("GetIntegerOrKeywordFromUser")]
  6. public static void GetIntegerOrKeywordFromUser()
  7. {
  8.   Document acDoc = Application.DocumentManager.MdiActiveDocument;
  9.  
  10.   PromptIntegerOptions pIntOpts = new PromptIntegerOptions("");
  11.   pIntOpts.Message = "\nEnter the size or ";
  12.  
  13.   // Restrict input to positive and non-negative values
  14.   pIntOpts.AllowZero = false;
  15.   pIntOpts.AllowNegative = false;
  16.  
  17.   // Define the valid keywords and allow Enter
  18.   pIntOpts.Keywords.Add("Big");
  19.   pIntOpts.Keywords.Add("Small");
  20.   pIntOpts.Keywords.Add("Regular");
  21.   pIntOpts.Keywords.Default = "Regular";
  22.   pIntOpts.AllowNone = true;
  23.  
  24.   // Get the value entered by the user
  25.   PromptIntegerResult pIntRes = acDoc.Editor.GetInteger(pIntOpts);
  26.  
  27.   if (pIntRes.Status == PromptStatus.Keyword)
  28.   {
  29.       Application.ShowAlertDialog("Entered keyword: " +
  30.                                   pIntRes.StringResult);
  31.   }
  32.   else
  33.   {
  34.       Application.ShowAlertDialog("Entered value: " +
  35.                                   pIntRes.Value.ToString());
  36.   }
  37. }
  38.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
trir, не обрабатывается ситуация нажатия ESC, о которой Stoner спрашивает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн StonerАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Код - C# [Выбрать]
  1.             PromptIntegerResult intResult;
  2.             int num;
  3.             bool status;
  4.             do
  5.             {
  6.                 intResult = ed.GetInteger("\nВведите номер точки [Выход-ESC]: ");
  7.                 num = intResult.Value;
  8.                 status = true;
  9.                 try
  10.                 {
  11.                     oPointTMP = oPoints.Find(num);
  12.                 }
  13.                 catch (ArgumentException)
  14.                 {
  15.                     if (intResult.Status.ToString() == "OK")
  16.                     {
  17.                         if (num <= 0)
  18.                         {
  19.                             ed.WriteMessage("\nВведённое число должно быть положительным и не равно нулю");
  20.                         }
  21.                         else
  22.                         {
  23.                             ed.WriteMessage("\nВведён отсутствующий номер!");
  24.                         }
  25.                     }
  26.                     status = false;
  27.                 }
  28.             } while ((status == false) && (intResult.Status.ToString() == "OK"));
Так пойдёт?
Было бы классно, если бы прерывалось по Enter, не вводя ничего. Но GetInteger требует чтобы я целое число ввёл.
PromtIntgerOptions.AllowNone=true не прокатило

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
intResult.Status.ToString() == "OK"  ;D
intResult.Status == PromptStatus.OK
Код - C# [Выбрать]
  1. if (num <= 0)
  2.                         {
  3.                             ed.WriteMessage("\nВведённое число должно быть положительным и не равно нулю");
  4.                         }
См. перегрузку метода Editor.GetInteger, которая принимает не строку запроса, а опции. В этих опциях можно задать ограничения (PromptIntegerOptions.LowerLimit).

Оффлайн StonerАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
См. перегрузку метода Editor.GetInteger, которая принимает не строку запроса, а опции. В этих опциях можно задать ограничения (PromptIntegerOptions.LowerLimit).
Дык а PromptIntegerOptions.AllowZero и AllowNegative не то самое?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Можно и так. Суть от этого не меняется.

Оффлайн StonerАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Можно и так. Суть от этого не меняется.
У меня не выходило с options.allow просто. Вот доделал:
Код - C# [Выбрать]
  1. PromptIntegerResult intResult;
  2.             PromptIntegerOptions intOption = new PromptIntegerOptions("");
  3.             intOption.AllowNone = true;
  4.             intOption.AllowZero = false;
  5.             intOption.AllowNegative = false;
  6.             intOption.Message = "\nВведите номер точки [Выход - ESC]: ";
  7.             int num;
  8.             bool status;
  9.             do
  10.             {
  11.                 intResult = ed.GetInteger(intOption);
  12.                 num = intResult.Value;
  13.                 status = true;
  14.                 ed.WriteMessage("intResult.Status=" + intResult.Status.ToString());
  15.                 if (intResult.Status == PromptStatus.OK)
  16.                 {
  17.                     try
  18.                     {
  19.                         oPointTMP = oPoints.Find(num);
  20.                     }
  21.                     catch (ArgumentException)
  22.                     {
  23.                         status = false;
  24.                         ed.WriteMessage("\nВведён отсутствующий номер!");
  25.                     }
  26.                 }
  27.             } while ((status == false) && (intResult.Status == PromptStatus.OK));
Спасибо большое