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

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

23.07.2017, 08:04. Показов 3219. Ответов 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
5966 / 4542 / 1094
Регистрация: 29.08.2013
Сообщений: 28,151
Записей в блоге: 3
23.07.2017, 08:27
Цитата Сообщение от Bretbas Посмотреть сообщение
просто перед каждым вызовом MessageBox проверять условие...глупо
почему глупо?
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.07.2017, 08:39  [ТС]
qwertehok,
Цитата Сообщение от qwertehok Посмотреть сообщение
почему глупо?
Ну во-первых, потому что в кодовой базе очень много MessageBox, и они раскиданы по всей кодовой базе.
Во-вторых, представим такую ситуацию, что в новой версии программы какой-то тип оповещаний стал не нужен, и его нужно удалить...опять придется по всей кодовой базе рыскать, чтобы найти те оповещения, которые относятся к тому типу.

Нужно что-то такое, чтобы все было в одном месте, чтобы было удобно...
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,168
23.07.2017, 08:43
Цитата Сообщение от Bretbas Посмотреть сообщение
Нужно что-то такое, чтобы все было в одном месте, чтобы было удобно...
Класс-хелпер для показа MessageBox, в котором и будет сокрыта проверка разшенности MB?

Добавлено через 1 минуту
Или такие вещи можно перетащить в базовый класс, от которого наследовать все формы (но это уже спорная вещь).
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.07.2017, 08:53  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Класс-хелпер для показа MessageBox, в котором и будет сокрыта проверка разшенности MB?
Ну а что в нем долго описано быть? Все оповещения?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,168
23.07.2017, 08:58
Bretbas, в нем должен быть спрятан MessageBox и логика проверки разрешения показа MB. Везде нужно будет ипользовать данный хелпер, а не MB напрямую.
2
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.07.2017, 09:12  [ТС]
Usaga, При инициализации этого хелпера, можно передать в него все checkBox'ы, чтобы он следил за ними, и в зависимости выключен/включен тот или иной checkBox, оповещаем или нет?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
public class NotifyMessage
{
    private CheckBox checkBoxAdvice;
    private CheckBox checkBoxError;
 
    public void notifyAdvice( string message )
    {
        if( checkBoxAdvice.Checked )
            MessageBox.Show( message );
    }
 
    public void notifyError( string message )
    {
        if( checkBoxError.Checked )
            MessageBox.Show( message );
    }
}
...
Вы имели ввиду так?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,168
23.07.2017, 09:14
Bretbas, передавать нужно значение настроек, а не сами чекбоксы. И класс можно сделать полностью статичным.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.07.2017, 09:21  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
передавать нужно значение настроек
Лучше определить еще один класс, который будет отвечать за все настройки программы? И переключение CheckBox'ов будет отражаться на нем? А класс NotifyMessage, который я определил выше, имеет ссылку на экземпляр класса настроек, и будет читать оттуда только значения CheckBox'ов
Вы это имели ввиду?

Цитата Сообщение от Usaga Посмотреть сообщение
И класс можно сделать полностью статичным
Согласен

Ну, хорошо, а если в дальнейшем будут добавляться новые типы оповещений? Наследование?
0
5966 / 4542 / 1094
Регистрация: 29.08.2013
Сообщений: 28,151
Записей в блоге: 3
23.07.2017, 09:24
все оповещения должны быть в базе по типам
пользователь в настройках ставит - не показывать тип "Подтверждения"
программа и не показывает

новый тип - соответственно настройки у пользователя динамически создают еще один чекбокс
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.07.2017, 09:32  [ТС]
qwertehok,
Цитата Сообщение от qwertehok Посмотреть сообщение
все оповещения должны быть в базе по типам
пользователь в настройках ставит - не показывать тип "Подтверждения"
программа и не показывает
Ну этого я и хочу достичь

Цитата Сообщение от qwertehok Посмотреть сообщение
новый тип - соответственно настройки у пользователя динамически создают еще один чекбокс
Пользователь не будет сам определять новые типы оповещений, поэтому это лишнее
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,168
23.07.2017, 09:41
Лучший ответ Сообщение было отмечено Bretbas как решение

Решение

Bretbas, настройки представлены отдельным классом. Форма настроек меняет содержимое этого класса. В момент изменения, мы задаём значения и классу-хелперу. Новая настройка - новое свойство в классе настроек, наследование не причём.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.07.2017, 09:45  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Новая настройка - новое свойство в классе настроек, наследование не причём.
Я имел ввиду, если программа будет расширяться в дальнейшем
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,168
23.07.2017, 09:49
Bretbas, вам нужно будет просто добавить новую настройку в класс настроек. Точно так же у вас оповещения в одном классе находятся, можно будет заменить MessageBox на свистелку-перделку или добавть 100500 типов извещений - всё в одном месте. Просто и удобно.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.07.2017, 09:56  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Точно так же у вас оповещения в одном классе находятся
Вот это не совсем понял. Оповещения - это же просто текст, определенный в ресурсах. Я вызываю метод класса хелпера для вывода того или иного оповещения в контексте программы. В плане "оповещения в одном классе находятся"?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,168
23.07.2017, 10:21
Bretbas, конечно же я имел в виду сам механизм вывода извещений, а не их текст.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.07.2017, 10:42  [ТС]
Спасибо, буду делать.

Usaga, Вы бы также решали поставленную задачу, или есть еще способы?

Добавлено через 13 минут
Usaga, Извините, за столь глупые вопросы, с C# пока что на Вы.
Допустим я объявил класс Settings со всеми свойствами, которые присутствуют в настройках. Допустим в настройках есть текстовые поля, куда пользователь вводит путь до определенных файлов, нужных программе.
Мне проверку на существования файла, синтаксиса правильности пути и тд определять лучше в свойствах в setter'е ?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static class Settings
{
    static private string pathToDB;
 
    public static string PathToDB
    {
        get
        {
            return pathToDB;
        }
        set
        {
            if (SyntaxCheck.CheckRootedPath(value))
                pathToDB = value;
            else
                // Вот тут уже можно использовать хелпер, о котором мы говорили, да?
                MessageBox.Show( "Неверный путь" ); 
 
            if (...)
                pathToDB = value;
            else
                // Вот тут уже можно использовать хелпер, о котором мы говорили, да?
                MessageBox.Show( "Еще какая-то ошибка" ); 
            }
        }
С свойствами первый раз работаю, в C++ в стандарте их нет, поэтому не приходилось сталкиваться
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,168
23.07.2017, 17:04
Цитата Сообщение от Bretbas Посмотреть сообщение
Вы бы также решали поставленную задачу, или есть еще способы?
Я бы рассматривал именно тот вариант, что вам предложил. Он самый простой и эффективный.

Цитата Сообщение от Bretbas Посмотреть сообщение
Мне проверку на существования файла, синтаксиса правильности пути и тд определять лучше в свойствах в setter'е ?
Нет. Класс настроек - тупое, безмозглое хранилище (как правило). Валидацией лучше заниматься стороннему классу. Лучше, чтобы этот процесс (валидация) вызывался по окончании получения настроек от пользователя (нажатие кнопки "Сохранить") и исполняся сторонним классом (который может быть частью класса настроек и извне не виден).
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.07.2017, 19:44  [ТС]
Короче переписал весь код. Оказывается, мне вообще не нужно разделять оповещения какие-то по типу и т.п. Все это бред
Вы мне скажите, вот так писать можно, правильный ли это тон в программировании на C#?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
...
        static private string pathToDB;
 
        public static string PathToDB
        {
            get
            {
                string path = (string)Registry.GetValue(@"HKEY_CURRENT_USER\Software\PROGOVRO", "PathToDB", null);
                if (path != null)
                    PathToDB = path;
 
                if (!SyntaxCheck.CheckRootedPath(path))
                    throw new ErrorPathException( Properties.Resources.ErrorPath + " до базы данных" );
 
                if ( !(File.Exists(path + Properties.Resources.PathCard)) || 
                     !(File.Exists(path + Properties.Resources.PathNation)) || 
                     !(File.Exists(path + Properties.Resources.PathObrazov)) || 
                     !(File.Exists(path + Properties.Resources.PathGosud)) ||
                     !(File.Exists(path + Properties.Resources.PathOblast)) || 
                     !(File.Exists(path + Properties.Resources.PathGorod)) || 
                     !(File.Exists(path + Properties.Resources.PathStat)) || 
                     !(File.Exists(path + Properties.Resources.PathSud)) ||
                     !(File.Exists(path + Properties.Resources.PathSudimost)) || 
                     !(File.Exists(path + Properties.Resources.PathPooshren)) || 
                     !(File.Exists(path + Properties.Resources.PathVidpoosh)) || 
                     !(File.Exists(path + Properties.Resources.PathDistipl)) ||
                     !(File.Exists(path + Properties.Resources.PathViddist)) || 
                     !(File.Exists(path + Properties.Resources.PathPrichdist))
                   )
                   throw new ErrorPathException( Properties.Resources.ErrorTablePath );
 
                return pathToDB;
            }
            set
            {
                if (!SyntaxCheck.CheckRootedPath(value))
                    throw new ErrorPathException( Properties.Resources.ErrorPath + " до базы данных" );
 
                if ( !(File.Exists(value + Properties.Resources.PathCard)) || 
                     !(File.Exists(value + Properties.Resources.PathNation)) || 
                     !(File.Exists(value + Properties.Resources.PathObrazov)) || 
                     !(File.Exists(value + Properties.Resources.PathGosud)) ||
                     !(File.Exists(value + Properties.Resources.PathOblast)) || 
                     !(File.Exists(value + Properties.Resources.PathGorod)) || 
                     !(File.Exists(value + Properties.Resources.PathStat)) || 
                     !(File.Exists(value + Properties.Resources.PathSud)) ||
                     !(File.Exists(value + Properties.Resources.PathSudimost)) || 
                     !(File.Exists(value + Properties.Resources.PathPooshren)) || 
                     !(File.Exists(value + Properties.Resources.PathVidpoosh)) || 
                     !(File.Exists(value + Properties.Resources.PathDistipl)) ||
                     !(File.Exists(value + Properties.Resources.PathViddist)) || 
                     !(File.Exists(value + Properties.Resources.PathPrichdist))
                   )
                   throw new ErrorPathException( Properties.Resources.ErrorTablePath );
 
                Registry.SetValue(@"HKEY_CURRENT_USER\Software\PROGOVRO", "PathToDB", value);
                pathToDB = value;
            }
        }
...
Это одно из свойств класса настроек. Всю проверку я возложил на него, и в принципе все работает...даже больше скажу, код стал более понятный и не такой запутанный, как был раньше.
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,168
24.07.2017, 05:56
Bretbas, так не делается.
* у тебя голимая копипаста, неужели нельзя было проверку в отдельный метод вынести?
* почему свойство статическое?
* почему свойство не свойство, а метод чтения\записи?
* может быть проверку путей можно было сделать через цикл?
* почему часть строковых литералов забита в виде ресурсов, а остальная - прямо в коде?
* почему в геттере ты проверяешь значение в ключе реестра, а возвращаешь значение статической переменной?
* зачем тебе две проверки, ты думаешь, что кто-то полезет в реестр руками что-то менять?

Добавлено через 4 минуты
Корректным вариантом будет разделение этого бардака на две части - сам класс с настройками (без логики, просто контейнер) и класс поставщика настроек, который будет читать\сохранять настройки. Последний может выступать и валидатором, но я бы вынес это в отдельный, третий класс.

Судя по использованию (не очень хорошему) статических полей, с архитектурой у тебя всё плохо. Потому можно (хуже точно не будет) сделать класс настроек синглтоном (что бы был везде доступен), заполнять его на старте программы, сохранять и обновлять из формы редактирования настроек.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2017, 05:56
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru