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

ADN Club => AutoCAD .NET API => Тема начата: Андрей Лаврентьев от 01-11-2017, 16:18:10

Название: Работа с диалоговыми окнами
Отправлено: Андрей Лаврентьев от 01-11-2017, 16:18:10
Добрый день!
Прошу сильно не ругать, за возможно примитивные вопросы, я новичок в net, да и в C#.
Но на форуме не нашел, подобную тему, возможно не там искал.
Как в AutoCAD сделать запрет повторного вызова диалогового окна?
В C# есть класс Mutex, но он не работает под AutoCAD.
Или может использовать обработчик событий? Если да, то поделитесь кусочком кода.
Пример
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using System.Windows.Forms;
  5.  
  6. namespace _65_Пример
  7. {
  8.     public class Class1
  9.     {
  10.         [CommandMethod("techno_trub")]
  11.         public void rashet()
  12.         {
  13.             DBConnect connect = new DBConnect();
  14.             if (connect.con_flag)
  15.             {
  16.                 Form1 MForm = new Form1();
  17.                 MForm.Show();
  18.             }
  19.  
  20.             else
  21.             {
  22.                 MessageBox.Show("Нет связи с сервером БД");
  23.             }
  24.         }
  25.     }
  26. }
Название: Re: Работа с диалоговыми окнами
Отправлено: Александр Ривилис от 01-11-2017, 16:36:20
Не понятно о чем речь. Можешь сделать статическую переменную и проверять её. Можешь сделать диалог модальным  и тогда пока ты его не закроешь второй раз ты его открыть не сможешь. Вообще непонятно что ты хочешь получить.
Название: Re: Работа с диалоговыми окнами
Отправлено: Дмитрий Загорулькин от 01-11-2017, 16:41:48
Не понятно о чем речь.
Мне, честно говоря, тоже. Но попробую угадать:
Код - C# [Выбрать]
  1. MForm.Show();
Не используйте в AutoCAD. Есть специальный метод у Application: ShowModalDialog. Если его использовать, то проблема отпадёт сама собой, скорее всего.
Название: Re: Работа с диалоговыми окнами
Отправлено: Александр Пекшев aka Modis от 01-11-2017, 18:14:10
То, что хочет ТС делается вот так:
Код - C# [Выбрать]
  1. public class MpTotalsFunction
  2.     {
  3.         // Вызов функции
  4.         MpTotalsWindow _mpTotals;
  5.         [CommandMethod("ModPlus", "mpTotals", CommandFlags.Modal)]
  6.         public void Main()
  7.         {
  8.             if (_mpTotals == null)
  9.             {
  10.                 _mpTotals = new MpTotalsWindow();
  11.                 _mpTotals.Closed += win_Closed;
  12.             }
  13.  
  14.             if (_mpTotals.IsLoaded)
  15.                 _mpTotals.Activate();
  16.             else
  17.                 //AcApp.ShowModelessWindow(AcApp.MainWindow.Handle, _mpTotals);
  18.                 _mpTotals.Show();
  19.         }
  20.         void win_Closed(object sender, EventArgs e)
  21.         {
  22.             _mpTotals = null;
  23.             Utils.SetFocusToDwgView();
  24.         }
  25.     }
Использовать _mpTotals.Show(); или AcApp.ShowModelessWindow(AcApp.MainWindow.Handle, _mpTotals); - я так и не увидел особой разницы ))
Использование Mutex - это для приложений под Windows. Всякие там события и прочее - это излишки и усложнения. В контексте автокад все решается просто
Название: Re: Работа с диалоговыми окнами
Отправлено: Александр Пекшев aka Modis от 01-11-2017, 18:16:33
namespace _65_Пример
А вот этого не стоит делать ) Кириллицу не стоит использовать в коде
Название: Re: Работа с диалоговыми окнами
Отправлено: Дмитрий Загорулькин от 01-11-2017, 18:34:51
Использовать _mpTotals.Show(); или AcApp.ShowModelessWindow(AcApp.MainWindow.Handle, _mpTotals); - я так и не увидел особой разницы ))
Однако, она есть.В первом случае, AutoCAD ничего не знает об этом окошке, что может вызывать различные проблемы. Ну и красивой иконки в уголочке у него не будет ;)
Название: Re: Работа с диалоговыми окнами
Отправлено: Александр Пекшев aka Modis от 01-11-2017, 18:38:41
В первом случае, AutoCAD ничего не знает об этом окошке, что может вызывать различные проблемы
Ни одной проблемы за годы я так и не словил))
Ну и красивой иконки в уголочке у него не будет
Благо, в моих окошках нет иконок в углу вообще  ;)

(https://modplus.org/images/ScreenShots/mpStandards/1.png)
Название: Re: Работа с диалоговыми окнами
Отправлено: Дмитрий Загорулькин от 01-11-2017, 18:40:25
Благо, в моих окошках нет иконок в углу вообще
А это не WPF?
У автора темы речь идёт про WinForms, поэтому, я на автомате писал про его поведение. А тут-то WPF. Возможно, что там и нет проблем. Я после того, как в WinForms их словил, в WPF уже не экспериментировал.
Название: Re: Работа с диалоговыми окнами
Отправлено: Александр Пекшев aka Modis от 01-11-2017, 18:45:46
А это не WPF?
Конечно это WPF
Название: Re: Работа с диалоговыми окнами
Отправлено: Александр Пекшев aka Modis от 01-11-2017, 19:22:35
Благо, в моих окошках нет иконок в углу вообще
А это не WPF?
У автора темы речь идёт про WinForms, поэтому, я на автомате писал про его поведение. А тут-то WPF. Возможно, что там и нет проблем. Я после того, как в WinForms их словил, в WPF уже не экспериментировал.
Тут я спорить не буду. При переходе на .Net я сразу миновал win forms. Возможно с ними и есть проблемы в автокаде, но с WPF, повторюсь - не встречал. А вот что забавно - при «правильном» использовании как раз были какие-то проблемы, поэтому я наоборот перешёл на Show()
Название: Re: Работа с диалоговыми окнами
Отправлено: Дмитрий Загорулькин от 01-11-2017, 19:38:15
А вот что забавно - при «правильном» использовании как раз были какие-то проблемы
С большой долей вероятности - из-за использования метода в таком виде:
Код - C# [Выбрать]
  1. AcApp.ShowModelessWindow(AcApp.MainWindow.Handle, _mpTotals);
Вроде бы, я на этом тоже спотыкался.
У меня сейчас везде либо так:
Код - C# [Выбрать]
  1. AcApp.ShowModelessWindow(_mpTotals);
либо так:
Код - C# [Выбрать]
  1. AcApp.ShowModelessWindow(null, _mpTotals, false);
Название: Re: Работа с диалоговыми окнами
Отправлено: Андрей Лаврентьев от 02-11-2017, 14:28:30
Всем огромное спасибо за подсказки, грех при такой поддержке не развиваться.   :)
Я ведь искал слово Form на форуме, а надо было ShowModelessWindow.  ???
Сегодня наткнулся на видео Дмитрия "Использование диалогов Windows Forms",
хочется сказать ему огромное спасибо за такой бесценный материал для начинающих.
С помощью него сформировал модальную форму диалога, далее буду причесывать ее.