C#. Остановка программы по результатам проверки модели.

Автор Тема: C#. Остановка программы по результатам проверки модели.  (Прочитано 10030 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Здравствуйте, уважаемые форумчане. Извините за беспокойство, я понимаю, что вопрос мой лишь очень косвенно относится к Inventor API (но все же относится :) ), просто мне не у кого больше спросить. Если можете, помогите пожалуйста решить такую задачу:
У меня внутри конструктора формы организована проверка того, нужная ли деталь открыта в инвенторе. В случае отрицательного результата мне нужно, чтобы программа дальше не выполнялась. Не могу разобраться как это сделать. Процедура проверки записана в конструкторе формы. Т.е. она выполняется в рамках работы "Application.Run(new TS_Form());". Использовать this.close() не получается, так как форма еще не загружена. Пытался организовать свою проверку на событие Form_Show , где прописал this.close() - форма закрывается, но процедура выполняется дальше, где происходит ошибка (из за несоответствия детали программе). Application.Extit() тоже не сработал, как я понял он работает после получения сигнала, что выполнен весь код. В общем я ищу команду, которая бы останавливала процесс создания формы. Если можете подскажите пожалуйста, где мне искать.
П.С. Нашел свойство "Application.AllowQuit" , быть может, если ему временно присвоить значение true, то можно будет выходить посредством "return" в подпроцедуре?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Т.к. форма унаследована от класса form, то просто добавляем свойство в форму
Конструктор формы:
Код - C# [Выбрать]
  1.    public partial class Form1 : Form {
  2.  
  3.         /// <summary>
  4.         /// Условие показа формы
  5.         /// </summary>
  6.         public bool Condition { get;}
  7.  
  8.         public Form1 ( ) {
  9.             InitializeComponent();
  10.             bool test = true;
  11.  
  12.             if (test) {
  13.                 this.Condition = true;
  14.                 return;
  15.             }
  16.             this.Condition = false;
  17.         }

Потом тупо после создания класса формы проверяем это свойство
Код - C# [Выбрать]
  1.    [STAThread]
  2.         static void Main ( ) {
  3.  
  4.             Form1 frm = new Form1();
  5.             if (!frm.Condition) return;
  6.             Application.EnableVisualStyles();
  7.             Application.Run(frm);
  8.         }


Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Спасибо, Михаил, за ваш ответ. Я думал об этом... У меня проблема заключается в том, что переменные (связанные с инвентором) и процедура подключения к инвентору находятся в конструкторе формы), т.е. я не могу организовать проверку свойств детали до запуска Application.Run(frm) из вашего примера. Правильно ли я понимаю, что мне надо реорганизовать всю структуру, чтобы обращение к инвентору и проверка условий осуществлялись до создания формы? Нельзя ли остановить выполнение процедуры Application.Run(frm) изнутри?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Нельзя ли остановить выполнение процедуры Application.Run(frm) изнутри?
Конструктор класса формы в любом случае должен выполнится.
И лишь только потом подключается цикл обработки сообщений Application.Run вот в нем уже можно остановить работу формы, кликнув на красный крестик закрытия формы или по какйо нибудь кнопке.

Зачем впихивать половину программы в конструктор несчастной формы? Форма должна отвечать за взаимодействие с пользователем, все остальное там лишнее. Объект инвентора проще передать в конструктор формы.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Конструктор класса формы в любом случае должен выполнится.

Спасибо за ответ, но что-то я запутался. :( Может я неправильно употребляю термин "конструктор формы". Внутри  Application.Run есть процедура InitializeComponent() и лишь после нее у меня идет обращение к инвентору и последушая проверка.


И лишь только потом подключается цикл обработки сообщений Application.Run вот в нем уже можно остановить работу формы, кликнув на красный крестик закрытия формы или по какой нибудь кнопке.

Т.е. по сути у меня в рамках выполнения  Application.Run() выполняется проверка, внутри которой мне надо остановить выполнение кода. Я не совсем понял, можно ли это сделать.


П.С. Прошу прощения, если мои вопросы нелепы. К сожалению, мое начальство гонится за результатом, в связи с чем нет времени изучить мат часть должным образом :( Зачастую приходится работать опытным путем - "методом инженерного тыка".
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 13-04-2016, 17:02:24

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Прошу прощения, если мои вопросы нелепы.
Совершенно согласен с этим утверждением :)
К сожалению, мое начальство гонится за результатом, в связи с чем нет времени изучить мат часть должным образом
Я просто понять не могу как связано ваше начальство и использование API инвентора?

Больше скажу, понимание некоторых вещей без изучения С++ для NET программистов будет всегда непонятно. Такие вещи например как COM-технология с его интерфейсом IUnknown, без знания С++ просто кажется глубинами вселенной. Так суть строчки Application.Run() не понять пока не разберешься в создании форм на С++ через Win32. Если, я скажу что это просто обертка для процедуры приема сообщений запущенной формы это что то прояснит? Боюсь, что нет.  Форма может начинать принимать сообщения только после того как создана, т.е. конструктор уже выполнен к этому времени.

Внутри  Application.Run есть процедура InitializeComponent()
Внутри Application.Run() нет и не может быть вызовы процедуры InitializeComponent(). Вызов процедуры InitializeComponent(). То что вы инициализируете форму в сигнатуре Application.Run() это не значит что форма завернута в Application.Run(). Это просто сокращение синтаксиса программы. Компилятор все равно первым делом запустит конструктор формы и лишь только потом запустит прием сообщений Application.Run(). Компилятору без разницы заранее в программе форма  была описана или в Application.Run(). Единственное отличие это то что при описании создания формы в Application.Run() больше вы к ней из функции Main обратиться не сможете, но зато код покороче. Но еще раз говорю что это одно и тоже.

Процедура InitializeComponent() запускается только в конструкторе формы.
Резюме: конструктор формы всегда выполняется перед Application.Run() и остановить выполнение конструктора из Application.Run() невозможно, т.к. Application.Run() при этом еще не работает. Поэтому никаких проверок в рамках Application.Run() выполнить никогда не получится.

А мат. часть учить все равно придется потому как либо изученная мат. часть либо говнокод на 50 тысяч строк в одном файле.

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Резюме: конструктор формы всегда выполняется перед Application.Run() и остановить выполнение конструктора из Application.Run() невозможно, т.к. Application.Run() при этом еще не работает. Поэтому никаких проверок в рамках Application.Run() выполнить никогда не получится.
Спасибо за развернутый ответ. Основную суть, что я сморозил чушь - я вроде бы понял, в смысле остальной части сообщения буду разбираться! :)

А мат. часть учить все равно придется потому как либо изученная мат. часть либо говнокод на 50 тысяч строк в одном файле.
Тут я вообще не спорю, и трачу на это все время, какое только могу.


просто понять не могу как связано ваше начальство и использование API инвентора?
Тут как раз все просто: стоит задача,мол получить "такой вот" результат  и сроки. Так что использование API это уже не личный интузиазм, а линия партии! :)
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Так что использование API это уже не личный интузиазм, а линия партии!
Я думал что в вашем случае инвенторовское API это хобби. Немного странно слышать, что руководители пытаются заставить сотрудника делать то, что требует освоение значительно объема информации и не хилого опыта, еще требовать какие то сроки. А что бы сразу не заставить изобретать вакцину от СПИДа. На что они надеются, мне не понятно.
Интересно, что из себя представляет воркфлоу задачи? Что в конечном итоге должно получится?

И еще вопрос, а основная профессия у вас какая?

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Я думал что в вашем случае инвенторовское API это хобби. Немного странно слышать, что руководители пытаются заставить сотрудника делать то, что требует освоение значительно объема информации и не хилого опыта, еще требовать какие то сроки.
Годами это было хобби, пока я не убедил начальство, что это нужно... Получились сроки :) Насчет абсурдности сроков на (по сути) НИР я с вами солидарен , но есть, что есть! Моя профессия инженер - конструктор.

В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
НИР??? Что ж тут научного?
Не цепляйтесь за словам!  :) Писал в метро за минуту до отключения интернета-спешил. Ну назовём это "созданием ноу хау"! :) Имел ввиду, что сроки на "интеллектуальный труд" ставить бессмысленно априори.
В программировании я новичок...но ненадолго! ;)