Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Stoner от 24-04-2015, 13:39:56

Название: Как сделать прерывание цикла при вводе данных?
Отправлено: Stoner от 24-04-2015, 13:39:56
Здравствуйте.
Вот кусок кода:
Код - 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"?
Спасибо
Название: Re: Как сделать прерывание цикла при вводе данных?
Отправлено: Дмитрий Загорулькин от 24-04-2015, 14:04:52
intResult.Status смотрите. OK - введен номер, None - нажат Enter, Error - нажат Esc. Есть нюансы, но в первом приближении как-то так.
Название: Re: Как сделать прерывание цикла при вводе данных?
Отправлено: trir от 24-04-2015, 14:12:45
PromptIntegerOptions (http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer's%20Guide/index.html?url=WS1a9193826455f5ff2566ffd511ff6f8c7ca-422c.htm,topicNumber=d0e10522)

Код - 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.  
Название: Re: Как сделать прерывание цикла при вводе данных?
Отправлено: Александр Ривилис от 24-04-2015, 14:43:42
trir, не обрабатывается ситуация нажатия ESC, о которой Stoner спрашивает.
Название: Re: Как сделать прерывание цикла при вводе данных?
Отправлено: Stoner от 24-04-2015, 14:59:08
Код - 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 не прокатило
Название: Re: Как сделать прерывание цикла при вводе данных?
Отправлено: Дмитрий Загорулькин от 24-04-2015, 15:01:02
intResult.Status.ToString() == "OK"  ;D
intResult.Status == PromptStatus.OK
Код - C# [Выбрать]
  1. if (num <= 0)
  2.                         {
  3.                             ed.WriteMessage("\nВведённое число должно быть положительным и не равно нулю");
  4.                         }
См. перегрузку метода Editor.GetInteger, которая принимает не строку запроса, а опции. В этих опциях можно задать ограничения (PromptIntegerOptions.LowerLimit).
Название: Re: Как сделать прерывание цикла при вводе данных?
Отправлено: Stoner от 24-04-2015, 15:08:34
См. перегрузку метода Editor.GetInteger, которая принимает не строку запроса, а опции. В этих опциях можно задать ограничения (PromptIntegerOptions.LowerLimit).
Дык а PromptIntegerOptions.AllowZero и AllowNegative не то самое?
Название: Re: Как сделать прерывание цикла при вводе данных?
Отправлено: Дмитрий Загорулькин от 24-04-2015, 15:24:58
Можно и так. Суть от этого не меняется.
Название: Re: Как сделать прерывание цикла при вводе данных?
Отправлено: Stoner от 24-04-2015, 15:31:19
Можно и так. Суть от этого не меняется.
У меня не выходило с 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));
Спасибо большое