Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Отключение/включение MessageBox, разбросанных по кодовой базе

23.07.2017, 08:04. Показов 3420. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Даже не знаю, как правильно тему назвать по этому поводу. Вообщем, попробую описать то, что я хочу.

Допустим есть программа, которая при различных манипуляций пользователя с ней, может выкидывать всякие разные оповещения
C#
1
MessageBox.Show( "Не верно задан путь" );
Таких MessageBox очень много, и они раскиданы по всех кодовой базе.

Суть в том, что нужно организовать CheckBox в меню настроек программы, который может включать/выключать такого рода оповещения, причем скорее всего нужно будет оповещения по типу различать, и таких CheckBox будет несколько, которые будут включать/отключать только свои оповещения.

Я знаю, как решить такую задачу, но мой подход не очень мне нравится, да и вообще он ущербский - это просто перед каждым вызовом MessageBox проверять условие...глупо

Мне интересно Ваше мнение, как Вы бы сделали эту задачу. Мне бы хотелось услышать правильное решение проблемы, чтобы больше к таким видам задач не возвращаться.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.07.2017, 08:04
Ответы с готовыми решениями:

Отключение / включение функций
У меня на локалхосте, я так подозреваю, отключена функция flush(). Подскажите кк её включить? Заранее благодарен!

Отключение / включение USB
есть usb прибор ,есть прога. Дык вот когда все подключаю в первый раз. то норм работает. когда вырубаю прогу а потом опять включаю -...

Отключение\Включение дисководов
Как программно включить/выключить дисководы? Хоть дайте какую-нубудь информацию.:-[

33
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
24.07.2017, 21:44  [ТС]
Студворк — интернет-сервис помощи студентам
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
у тебя голимая копипаста, неужели нельзя было проверку в отдельный метод вынести?
Да я знаю, я уже сам замудохался, не могу сделать так, чтобы все было более менее безопасно.

1.0 Первый запуск программы
1.1 Проверяет есть ли в реестре путь до БД
1.2 Если есть, и все нужные для программы таблицы на месте идем на пункт 2.0
1.3 Если нет, то вызываем окно с настройками и просим ввести путь до БД, если пользователь вводит правильный путь и таблицы нужные программе на месте, записываем путь в реестр и идем на пункт 2.0
2.0 Грузим базу

В принципе все просто, но всю эту хрень я написал для таких ситуаций:
1. Может кто-то удалить/переместить базу данных, а путь в реестре уже прописан
2. Стереть значение в реестре
3. Удалить некоторые таблицы из базы данных, которые нужны программе.

Из-за этого и получается вся эта фигня
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
25.07.2017, 05:27
Цитата Сообщение от Bretbas Посмотреть сообщение
1. Может кто-то удалить/переместить базу данных, а путь в реестре уже прописан
Этот факт вскроется при первом же обращении к базе данных. Перепроверять настройки в этом случае не имеет особого смысла.

Цитата Сообщение от Bretbas Посмотреть сообщение
2. Стереть значение в реестре
3. Удалить некоторые таблицы из базы данных, которые нужны программе.
В таком случае пользователь - сам себе злобный Буратино. Эти факты так же вскроются во время работы приложения. Отдельно проверять всё это смысла никакого не имеет. Так вы только переусложняете свою программу.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
25.07.2017, 08:13  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Так вы только переусложняете свою программу
Изначально программу я написал быстро. Там ничего сложного, просто есть база данных, программа ее читает, и может по отдельным выбранным строкам создавать и заполнять Word документы. Все!
Как только я начал возиться с всякими исключительными ситуациями(стирания значения в реестре), то моя программа стала темным лесом. Я уже сам запутался в ней.

Вы мне предлагаете, перед тем как выполнить обращение к базе данных, проверять реестре, читать из него путь до бд, и уже пытаться обратиться к базе данных, и если выпадет исключение, ловить его и все? Я правильно Вас понял? А в Settings просто у свойство PathToDB установить автоматические акссесоры?
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
25.07.2017, 08:24
Bretbas, вам и так нужно из реестра путь к базе читать)

Я вам предлагаю навешивать обработчики исключений в нужных местах. И одни, глобальный, вообще на всё (на случай совсем уж непредвиденной ситуации).

Не имеет смысла делать проверку пути к базе, которую вы тут же попытаетесь открыть. Ошибку-то вы гарантированно получите.

Проверки имеют смысл там, где некорректность данных проявится не сразу. У вас же, насколько я понял, такого нет. Ну и всю схему базы проверять тоже смысла особого нет. Во-первых, это конская работа, во-вторых, изменения схемы базы тоже не останутся незамеченными во время работы приложения.

Оборачивайте важные места в try\catch, извещайте пользователя об ошибках по мере их появления. Не пытайтесь предугадать все ошибочные ситуации, это тупо невозможно, но времени займёт массу.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
25.07.2017, 08:42  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Не пытайтесь предугадать все ошибочные ситуации, это тупо невозможно, но времени займёт массу
что я и делаю уже 3 день

А что Вы скажете по поводу этого:
Программа работает с несколькими шаблонами Word. Я расскажу про один, остальные аналогичные.
Итак есть в настройках textBox, где можно задать путь до шаблона. Этот путь также записывается в реестр, и при новом открытии программы читается из него. Также, если не указан путь в настройках, то шаблон распаковывается из ресурсов программы в определенную папку и записывается в реестр путь до него. Тоесть логика такова, что путь до шаблона должен быть всегда указан, если он не указан, программа укажет его сама + шаблон должен присутствовать по пути по любому. Я сделал это так, поправьте пожалуйста, как правильно:
В Settings есть свойство PathToDescription. Оно отвечает за путь до шаблона. Я инкапсулировал в нем все проверки.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static string PathToDescription
{
    get
    {
        string pathToDescriptionWordDocument = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Software\PROGOVRO", "PathToDescription", null);
        if ((pathToDescriptionWordDocument != null) && (File.Exists(pathToDescriptionWordDocument)))
            pathToDescription = pathToDescriptionWordDocument;
        else
        throw new NotExistFileException( "Не найден шаблон Характеристика.");
                
        return pathToDescription;
    }
    set
    {
        if (SyntaxCheck.CheckRootedPath(value) && (File.Exists(value)) && (isWordDocument(value)) )
        {
            Registry.SetValue(@"HKEY_CURRENT_USER\Software\PROGOVRO", "PathToDescription", value);
            pathToDescription = value;
        }
        else
            throw new NotExistFileException( "Не найден шаблон Характеристика."); 
    }
}
Так же в Settings есть свойство StandardPathToDescription, которые отвечает за стандартный путь до шаблона, и за распаковку из ресурсов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public static string StandardPathToDescription
{
    get
    {
        Registry.SetValue(@"HKEY_CURRENT_USER\Software\PROGOVRO", "PathToDescription", standardPathToDescription);
        createWordDocumentFromResource(standardPathToDescription, Properties.Resources._1);
        return standardPathToDescription;
    }
    private set
    {
    }
}
В форме настроек при загрузке формы пишу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void SettingForm_Load(object sender, EventArgs e)
{ 
...
    try
    {
        this.textBox2.Text = Settings.PathToDescription;
    }
    catch( NotExistFileException )
    {
        this.textBox2.Text = Settings.StandardPathToDescription;
    }
...
}
А при нажатии на кнопку Ok в настройках пишу вот что:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void buttonOk_Click(object sender, EventArgs e)
{
...
    try
    {
        Settings.PathToDescription  = this.textBox2.Text;
    }
    catch(NotExistFileException p)
    {
 
        this.textBox2.Text          = Settings.StandardPathToDescription;
        MessageBox.Show( p.Message );
    }
...
}
Это ужас...я знаю...но такой код предотвращает все исключительные ситуации, о которых я сказал выше. Пользователь не сможет никак сделать так, чтобы пути до шаблона, и даже самого шаблона по этому пути, не было.
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
25.07.2017, 09:25
Bretbas, это правда ужас. Лютый.

Настройки должны быть пассивным механизмом. Один механизм (класс) должен их просто считывать откуда-то в другой класс, а третий уже выполнять разные телодвижения, по доведению состояния приложения до ума (копирование шаблонов, если есть и т.д).

Не используйте static никак, кроме для хелперов и синглтонов!

Должно быть так: настройки должны быть инициализированы и готовы к работе перед инициализацией формы и вообще не должны иметь отношения к UI!
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
25.07.2017, 09:56  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Один механизм (класс) должен их просто считывать откуда-то в другой класс, а третий уже выполнять разные телодвижения, по доведению состояния приложения до ума (копирование шаблонов, если есть и т.д).
Ну один класс как я понял, это просто Настройки. Там просто будут свойства с автоматическими акссесорами, так? Второй класс, который читает из настроек, проверяет всю хрень в них, создает, если нужно, пути по умолчанию, распаковывает ресурсы и тд. Так? А третий класс зачем?

Цитата Сообщение от Usaga Посмотреть сообщение
настройки должны быть инициализированы и готовы к работе перед инициализацией формы и вообще не должны иметь отношения к UI!
Как они могут быть инициализированы, если к примеру человек, после первого запуска приложения удалил путь до шаблона в реестре? Или инициализация будет проходить через второй класс?
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
25.07.2017, 10:14
Цитата Сообщение от Bretbas Посмотреть сообщение
Ну один класс как я понял, это просто Настройки. Там просто будут свойства с автоматическими акссесорами, так? Второй класс, который читает из настроек, проверяет всю хрень в них, создает, если нужно, пути по умолчанию, распаковывает ресурсы и тд. Так? А третий класс зачем?
Класс (или группа классов) с настройками, класс поставщика настроек (читает\сохраняет настройки) и класс с некой бизнес-логикой, который предпринимает какие-то действия, если настройки ему не понравятся. Строгое разделение обязанностей.

Цитата Сообщение от Bretbas Посмотреть сообщение
Как они могут быть инициализированы, если к примеру человек, после первого запуска приложения удалил путь до шаблона в реестре? Или инициализация будет проходить через второй класс?
Если это требуется логикой программы, то выполняйте проверку настроек. Но этим должна заниматься отдельная логическая единица в программе. Отдельный класс.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
25.07.2017, 10:36  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Класс (или группа классов) с настройками, класс поставщика настроек (читает\сохраняет настройки) и класс с некой бизнес-логикой, который предпринимает какие-то действия, если настройки ему не понравятся. Строгое разделение обязанностей.
Я с Вами согласен. Так будет удобно. Но я уже чувствую, что когда я начну это воплощать в жизнь на практике сегодня у меня снова появятся проблемы. Проблемы появятся из-за того, что я не понимаю:
1. Кем у меня в программе будет выступать в роли класса-бизнес логики, который будет смотреть настройки, и будет говорить нравятся ему они или нет
2. Почему нельзя в классе поставщика выяснять при чтении настроек - нормальные они или нет. И также при записи настроек, проверять всякие условия, такие как - путь должен быть правильным, по этому пути должен быть файл, этот файл должен быть .doc или .docx.
3. Все эти классы должны быть синглтонами? Я думаю, да, так как мне не нужно несколько экземпляров этих классов.

Пока вопросов нет, но они могут возникнуть по мере написания кода
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
25.07.2017, 10:59
Цитата Сообщение от Bretbas Посмотреть сообщение
1. Кем у меня в программе будет выступать в роли класса-бизнес логики, который будет смотреть настройки, и будет говорить нравятся ему они или нет
Это будет нечто вроде OptionsManager или SettingsManager.

Цитата Сообщение от Bretbas Посмотреть сообщение
2. Почему нельзя в классе поставщика выяснять при чтении настроек - нормальные они или нет.
Это не его задача. Задача поставщика схожа с ролью грузчика: ему сказали коробку с настройками со склада притащить - он побежал, сказали назад унести - понёс. А вот менеджер настроек - хорошее место для таких проверок.

Цитата Сообщение от Bretbas Посмотреть сообщение
3. Все эти классы должны быть синглтонами? Я думаю, да, так как мне не нужно несколько экземпляров этих классов.
Это уже как вам удобнее. Я бы сделал синглтоном только менеджер, который бы выступал единой точкой доступа к настройкам: и читал бы\писал бы (через поставщика) и валидировал бы и всё остальное делал, связанное с настройками (кроме UI, ибо это уже обязанность другого класса).
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
25.07.2017, 13:35  [ТС]
Usaga, В класс-менеджер настроек будет в себе хранить экземпляр класса-поставщика настроек, который в свою очередь хранит в себе экземпляр класса-настроек. Так? Все остальные классы приложения будут обращаться только с классом менеджером, запрашивать у него те или иные настройки. Этот класс-менеджер перед запросом будет проверять всякие условия, обращаться к классу-поставщику, а класс-поставщик будет запрашивать у класса-настроек. И аналогично для обновления данных настроек. Все будет проходить через менеджер. Я Вас правильно понял?
Если да, то неясно следующее:
Если будут добавляться новый пункт в настройках, то мне нужно обновлять 3 класса получается?
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
25.07.2017, 14:19
Bretbas, поставщик будет только читать настройки. Хранить их вообще никто не обязан. Но, если нужно, то это может делать менеджер.

Цитата Сообщение от Bretbas Посмотреть сообщение
Если будут добавляться новый пункт в настройках, то мне нужно обновлять 3 класса получается?
Обновлять нужно поставщика и сам класс с настройками. Если нужна будет дополнительная логика, то и менеджер тоже нужно будет обновить.

Всё ровно тоже самое пришлось бы сделать и в случае с одним единственным классом. Разница только в том, что я рекомендую разделить работу с настройками на три простые части, нежели держать всё в одной куче.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
25.07.2017, 14:45  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Хранить их вообще никто не обязан
Е-мое, опять запутался. Как никто не должен? А как же класс настроек? Он же их хранит, а класс-поставщик читает/записывает из/в него. А класс менеджер настроек запрашивает/записывает у/в поставщика, с предварительными проверками, данные, который в свою очередь читает/записывает их в класс настроек. Получается 3 класса.
1. Класс настроек(там только данные)
2. Класс поставщик настроек(является прослойкой между классом настроек и классом менеджером. Умеет только читать/записывать в класс настроек данные)
3. Класс менеджер(является синглтоном, владеет поставщиком настроек, и с предварительными проверками, записывает/читает через поставщика настройки. В программе вся работа с настройками будет происходить через этот менеджер)
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
25.07.2017, 16:12
Bretbas, ни кто не обязан хранить в том смылсе, что если настройки нужны только для некоторых отдельных задач (типа подключения к БД), то их (настройки) можно получить, использовать и потом "потерять" до следующего раза. Но если они постоянно нужны, то можно их и хранить. Но не обязательно в менеджере. Настройки из менеджера бизнес-логика запрашивает (если таковая есть), вот они и может хранить.

Но если вам будет проще, то просто в менеджере храните, он у вас всё равно синглтоном планируется быть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.07.2017, 16:12

Включение/отключение сопроцессора
Доброго времени суток. Подскажите, как можно выполнить включение и выключение арифметического сопроцессора ассемблерными командами?

Включение / отключение прокси
Добрый день! Постоянно требуется вкл./откл. прокси в LAN Settings -> use a proxy server for your lan. Создал батник, где в реестре...

Отключение и включение меню
Здравствуйте! Подскажите, пожалуйста, как отключить меню со всеми подменю сразу, а не по отдельности? Имеется: файл с ресурсами ...

Включение/отключение сайта
Здравствуйте, прошу вашей помощи :) Есть мой сайт, нужна возможность включать/отключать его Выключение уже сделал через .htaccess,...

Отключение и включение картинок
Есть такой переключатель (см. картинку) ее описание в index.php: <div class="switch1"> <input type="checkbox"> ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru