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

ADN Club => AutoCAD .NET API => Тема начата: simson43 от 11-10-2018, 18:09:09

Название: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 18:09:09
Добрый вечер!
Такая проблема: вызываю я форму модально
Код - C# [Выбрать]
  1. Application.ShowModalDialog(form);
затем на время выполнения кода (по нажатию кнопки ОК) скрываю
Код - C# [Выбрать]
  1. this.Hide();
(внеочередной вопрос: нужно ли ее по завершению кода дополнительно закрывать? )

так вот, как только начинает выполняться код форма то скрывается, но еще и всплывает предыдущее активное окно виндоус (например проводник, visual studio и тд) поверх собственно автокада, а затем снова возвращается автокад.
в чем дело?
при чем если вызвать просто
Код - C# [Выбрать]
  1. form.Show();
то такого не происходит
а если
Код - C# [Выбрать]
  1. form.ShowDialog();
то происходит та же ситуация
Название: Re: странное поведениt WinForm
Отправлено: Александр Пекшев aka Modis от 11-10-2018, 18:14:08
внеочередной вопрос: нужно ли ее по завершению кода дополнительно закрывать?
метод Hide() - это тоже самое, что Visibility.Hide. Так что да - закрывать нужно.

И если у вас форма скрывается и больше не появляется, то может стоит её просто закрыть перед выполнением кода? Тогда и проблем не будет =)
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 18:16:12
да тоже об этом подумал и проверил. но тогда при нажатии форма почему то висит открытой до окончания выполнения кода.. тоже неприятно.
просто она разве сама не закрывает когда код завершен?
Название: Re: странное поведениt WinForm
Отправлено: Александр Пекшев aka Modis от 11-10-2018, 18:18:36
да тоже об этом подумал и проверил. но тогда при нажатии форма почему то висит открытой до окончания выполнения кода.. тоже неприятно.
просто она разве сама не закрывает когда код завершен?
Просто код, выполняемый в автокаде, не должен находится в классе окна!
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 18:20:00
а я всегда так делал. чем это чревато? какие на то причины?
Название: Re: странное поведениt WinForm
Отправлено: Александр Пекшев aka Modis от 11-10-2018, 18:23:29
а я всегда так делал. чем это чревато? какие на то причины?
Это нарушение принципов SOLID, а в особенности принципа единой ответственности.
Самый простой пример - если вы будете работать над кодом, выполняющимся в автокаде, а другой человек будет работать над GUI (вашим окном) - как вы будете работать?

Ну или другой пример - какие-то моргания окна при работе кода  :D
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 18:25:21
Хорошо. Так и читабельнее будет, думаю. не надо залазить в окно чтоб увидеть код.
Спасибо
Название: Re: странное поведениt WinForm
Отправлено: Александр Пекшев aka Modis от 11-10-2018, 18:26:03
Попробуйте после скрытия окна вызвать метод
Код - C# [Выбрать]
  1. Autodesk.AutoCAD.Internal.Utils.SetFocusToDwgView();
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 18:29:09
меня устроит вариант с закрытием окна и перенесением кода
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 19:19:53
Просто код, выполняемый в автокаде, не должен находится в классе окна!
вынес код из формы в отдельный метод. закрываю окно вызываю этот метод и все равно окно висит пока не выполнится код
Название: Re: странное поведениt WinForm
Отправлено: Александр Пекшев aka Modis от 11-10-2018, 19:25:58
Метод вызываете либо в обработчике нажатия кнопки?)))
Название: Re: странное поведениt WinForm
Отправлено: Александр Ривилис от 11-10-2018, 19:27:10
Просто код, выполняемый в автокаде, не должен находится в классе окна!
вынес код из формы в отдельный метод. закрываю окно вызываю этот метод и все равно окно висит пока не выполнится код
Какое окно висит? Запиши видеоролик, как у меня написано в подписи - тогда будет понятно о чем идёт речь. И вообще ты запускаешь код из под отладчика?
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 19:27:47
Ну конечно. Это ничего не изменило по факту? А как я ещё вызову его?
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 19:31:04
окно формы. нажимаю на кнопку ОК в форме и оно не исчезает до тех пор пока не выполнится полностью код
Какое окно висит?
Название: Re: странное поведениt WinForm
Отправлено: Александр Пекшев aka Modis от 11-10-2018, 19:33:34
Конечно ничего не изменило! Окно-то закроется только после завершения кода! Должно быть типа того:
Код - C# [Выбрать]
  1. public class MySuperClass {
  2. var win = new MySuperWindow();
  3. win.ShowDialog();
  4. MySuperClass2.StartWorkInCad();
  5. }
P.s. Писал с телефона...
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 19:50:04
код от SuperMan ;D ;D ;D
это даже не гуглится
а superclass2 это что за класс?
и как работает собственно сама команда?
Название: Re: странное поведениt WinForm
Отправлено: Александр Ривилис от 11-10-2018, 19:53:38
Внутри своего обработчика:

Код - C# [Выбрать]
  1.  using (EditorUserInteraction UI =  ed.StartUserInteraction(this))
  2.     {
  3.        // Здесь твоя работа с AutoCAD
  4.     }

ed - это Editor
Название: Re: странное поведениt WinForm
Отправлено: Дмитрий Загорулькин от 11-10-2018, 20:01:16
Что писать в методе отклика на нажатие кнопки:

Ну и далее там есть как правильно вызывать форму из команды:
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 20:21:06
вот это было очень полезное видео! спасибо
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 20:25:29
я так понял это разные способа? тот что в видео -понятен
а вот с этим не совсем
public class MySuperClass {
var win = new MySuperWindow();
win.ShowDialog();
MySuperClass2.StartWorkInCad();
}
Внутри своего обработчика:

Код - C# [Выбрать]
  1.  using (EditorUserInteraction UI =  ed.StartUserInteraction(this))
  2.     {
  3.        // Здесь твоя работа с AutoCAD
  4.     }

ed - это Editor
Название: Re: странное поведениt WinForm
Отправлено: Александр Ривилис от 11-10-2018, 20:35:49
а вот с этим не совсем
Александр Пекшев aka Modis предложил сделать обращение к AutoCAD после завершения диалога. Т.е. в диалоге у пользователя ты спрашиваешь все данные, а по завершении диалога выполняешь работу с AutoCAD. Я же предложил работу внутри диалога.
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 20:37:23
а последний вариант(от Дмитрия Загорулькина) не лучше?
Название: Re: странное поведениt WinForm
Отправлено: Александр Ривилис от 11-10-2018, 20:38:49
а последний вариант не лучше?
Последний - это какой? Сформулируй.
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 20:43:44
почти успел дополнить свое сообщение
тот что в видео
Название: Re: странное поведениt WinForm
Отправлено: Александр Ривилис от 11-10-2018, 20:49:14
почти успел дополнить свое сообщение
тот что в видео
Сформулируй в чем ты видишь разницу между тем что каждый из нас троих написал. Пример Дмитрия более полный - фактически урок использования модальных форм.
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 20:53:52
я ж сказал что мне понятен только тот что предложил Дмитрий Загорулькин.
про первый ничего не гуглится.
а про ваш вот пытаюсь что то найти
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 20:57:19
Я же предложил работу внутри диалога.
выше говорили что лучше не производить операций с автокадом внутри диалога
Название: Re: странное поведениt WinForm
Отправлено: Александр Ривилис от 11-10-2018, 21:02:54
выше говорили что лучше не производить операций с автокадом внутри диалога
Да. Но иногда приходится.
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 21:04:37
Внутри своего обработчика:

Код - C# [Выбрать]
 using (EditorUserInteraction UI =  ed.StartUserInteraction(this))
    {
       // Здесь твоя работа с AutoCAD
    }
Т е так же каак было весь код внутри обработчика нажатия только дополнительно обернуть его в этк конструкцию?
Название: Re: странное поведениt WinForm
Отправлено: Александр Ривилис от 11-10-2018, 21:07:58
Т е так же каак было весь код внутри обработчика нажатия только дополнительно обернуть его в этк конструкцию?
Именно. this.Hide() насколько я помню в этом случае не нужен.
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 11-10-2018, 21:10:21
ну я тоже так понял что в этом случае этот класс сам скрывает форму.
спасибо
Название: Re: странное поведениt WinForm
Отправлено: Дмитрий Загорулькин от 12-10-2018, 01:14:17
Насколько я понимаю, класс EditorUserInteraction создан специально для того, чтобы скрыть форму на то время, пока пользователь что-то выбирает на чертеже. А по окончании выбора - снова отобразить. В других случаях его применение не совсем уместно. Поэтому, если есть на форме какие-то кнопки, которые отправляют нас на чертёж что-то выбрать а потом возвращают в форму - то надо использовать EditorUserInteraction. Но это не значит, что EditorUserInteraction заменяет полностью тот сценарий использования WinForm диалогов, что показан в моём видео. Не знаю, понятно я объяснил или нет... Хоть ещё одно видео снимай :)
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 12-10-2018, 03:12:47
Вполне понятно.
Ваш метод в видео мне по крайней мере больше всего приглянулся. Его я и использую.
Спасибо.
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 12-10-2018, 11:06:44
Что писать в методе отклика на нажатие кнопки:
В вашем видео сказано, что порой ссылка на форму может навредить.
В каких случаях необходимо "убивать" форму методом Dispose?
Название: Re: странное поведениt WinForm
Отправлено: Дмитрий Загорулькин от 12-10-2018, 18:36:21
В каких случаях необходимо "убивать" форму методом Dispose?
Я с таким однажды только сталкивался. Мне нужно было поменять картинку в диалоге, но при попытке замены выскакивало исключение. Точного сообщения исключения не помню, но содержание примерно такое, что мол данный ресурс используется и не может быть заменён. Проблема пропала только после того, как диалог был не просто закрыт, но и "отдиспозен".
В большинстве же случаев это делать не обязательно.
Название: Re: странное поведениt WinForm
Отправлено: simson43 от 12-10-2018, 18:56:18
Понятно. Спасибо.