Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557

Статическое событие. Костыль или нет

19.02.2015, 20:50. Показов 5889. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть следующая. Приложение на андроид.
В нем динамически создаются диалоговые окна (класс диалоговых окон Dialog).
В классе Dialog есть статический метод Create , который собственно и создает окна разных типов.
Есть обьект класса Control, который должен по нажатии клавиши back на телефоне закрывать диалог - если он существует.
Control не синглтон, также динамически создается в определенные моменты.
Суть в том - пока он создан - должен выполнять свои действия (обработку клавиши Back)

Что сделал:
Сделал статический event OnCreate и вызываю его в в статическом методе Create класса Dialog
C#
1
2
3
4
5
6
7
8
9
10
public event System.Action<Dialog> OnCreate;
 
public static Dialog Create()
{
Dialog dialog = InstantiateDialog();
if(OnCreate != null){
OnCreate(dialog);
return dialog;
}
}
В класе Control, в момент создание подписываемсь на событие
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
class Control
{
private Dialog  _context;
public Control()
{
Dialog.OnCreate += HandlerOnCreate;
}
public void  HandlerOnCreate(Dialog dialog)
{
_context = dialog;
Dialog.OnCreate -= HandlerOnCreate;
}
 
void Update()
{
if (!pressBack){
return;
}
if(_context != null){
_context.HideDialog();
_context = null;
} else{
QuitProgramm();
}
 
}
 
}
Одновременно может быть открыт только один диалог, если не открыт - нажатие вызывает закрытие программы.
Достоинством способа считаю минимальная связность класса Control c Dialog. Легко можно адаптировать под закрытие нескольких окон, сделать стек контекстов и закрывать по порядку).
Костыльный ли способ? Как по поводу утечки памяти?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2015, 20:50
Ответы с готовыми решениями:

Используя статическое наследование, статическое замещение, виртуальное или динамическое замещение, написать программу-калькулятор
Помогите ребят, препод барыга. пришёл. о языке ни слова. Дал задание и ушёл( это первые две пары такие были(

Программа напоминание: как контролировать, наступило событие или нет?
Добрый день Давно не писал а теперь есть потребность в написание программы, я что то прям растерялся не знаю с чего начать, может...

При срабатывании OnClientRead на стороне ServerSocket это событие обрабатывается в потоке или нет?
Приветствую. Возник вопрос, инфу о котором я так и не смог найти. А вопрос вот в чем: при срабатывании события OnClientRead на стороне...

11
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
24.02.2015, 13:56
) это очень сложный вопрос для этого форума
Собственно зачем делать статический метод и событие? Пусть у каждого экземпляра класса диалог будет свой метод закрытия.
Как я понял один диалог - это одна форма с одним контролом закрытия. Не вижу смысла усложнять логику статическим общим методом закрытия.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
24.02.2015, 14:06  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
Как я понял один диалог - это одна форма с одним контролом закрытия
не совсем так. Есть централизированый компонент Control, который выполняет закрытие активного окна, если окна нет вызывает диалог выхода с приложения, тоесть екземпляр Control не входит в состав диалога.
Смысл в том что диалог может появится в любой момент и про существования екземпляра Control ничего не должен знать. Тоесть если есть екземпляра Control - он обработает нажатие кнопки бек и закрыет диалог, если нет - ничего не сработает.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
24.02.2015, 14:12
Ага. Т.е. контрол - это отдельный объект, тоже неплохо. Не совсем понятно только почему он может быть не создан.
Лично я вижу такую структуру:
Есть какой-то класс программы, пусть он будет коренным;
Есть класс Диалог, есть класс контрол (кнопка);
В коренном классе последовательно создаются экземпляры класса диалог, при этом они заносятся в стек типа диалог;
По клику контрола происходит извлечение элемента стека и выполнение метода закрытия;
Если стек пустой - закрывается программа.

В этой схеме я не вижу необходимости статических методов и событий.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
24.02.2015, 14:18  [ТС]
это сделано для движка Unity3d, там есть понятие сцен, когда мы переходим из сцены в другую - все обьекты текущей сцены удаляются (можно конечно сделать Control компонент и неудаляемым , но это не меняет сути вопроса). Можно конечно при каждом создании диалога искать компонент Control и передавать туда диалог + проверка есть ли Control компонент. Но чем этот вариант будет лучше?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
24.02.2015, 14:48
Я мало знаком с особенностями программирования под андроид в юнити, но мне кажется, ты пошёл по неправильному пути.
Как я понимаю, диалоговые формы (сцены) создаёшь ты. То, что там будет отображаться задаётся параметрами? Создание происходит по какому-нибудь событию? Закрытие происходит по отлавливанию события нажатия кнопки "back"?
Я бы сделал так:
В классе диалог создал бы метод закрытия и формирования экранной формы.
При необходимости создания формы создавал класс диалог. При этом создавал бы экранную форму.
При создании новой сцены, текущий диалог заносится в стек. После чего текущая сцена заменяется новой.
При отлавливании события "back" происходит закрытие текущего диалога, выборка из стека предыдущего и формирование формы.

Добавлено через 1 минуту
Естественно всё это делается в основном классе программы.

Добавлено через 6 минут
И в конце, если по событию "back" стек пуст - закрываем программу.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
24.02.2015, 14:50  [ТС]
Я так понял ты предлагаешь в основном классе программы создать стек диалогов и туда их помещать при создании. А при нажатии кнопки бек, класс Контрол будет обращаться к этому стеку и подчищать его. Так?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
24.02.2015, 14:58
да. также я предлагаю инкапсулировать методы создания и удаления внутри класса диалог. Ибо внешний класс закрытия окна - это даже не костыль, это целый антипаттерн.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
24.02.2015, 15:14  [ТС]
Я понял. Не все так плохо. В класе диалог есть методы закрытие, открытие, установка текста сообщения. На диалогах есть кнопка закрытия при нажатии которой срабатывает метод диалога по закрытию ( все это инкапсулировано). При нажатии кнопки бек
C#
1
2
3
4
5
6
7
8
9
10
11
void Update()
{
if (!pressBack){
return;
}
if(_context != null){
_context.HideDialog();
_context = null;
} else{
QuitProgramm();
}
Просто основной фишкой считал минимальная связность обьектов. У меня ее по сути нет.
В твоем случае получается класс контрол должен существовать в контексте главного класса или должен быть метод получения этого класса (это одна связность). Также в главном классе нужен методы по работе со стеком и это все как то будет запутывать логику основного класса. Это мне так кажется) Хотелось бы услышать плюсы минусы обох вариантов?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
24.02.2015, 15:21
в моём случае класс контрол вообще не нужен, созданием и удалением занимается основной класс программы

Добавлено через 1 минуту
Если у тебя программа сложная, а диалоги намного более функциональны, чем просто отображение пары строк текста, то есть смысл создания класса-диспетчера, который будет отвечать за стек, создание и удаление. Но я сомневаюсь, что у тебя настолько сложный продукт.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
24.02.2015, 15:21  [ТС]
делал отдельный класс для разнесения логики, думаю это правильно
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
24.02.2015, 15:24
разнесение логики - это правильно, но нельзя доводить до абсурда. Создание статического отдельного класса, имеющего только одну функцию - закрытие окошка - это и есть доведение до абсурда.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.02.2015, 15:24
Помогаю со студенческими работами здесь

Если есть форма и есть событие, а процедуры, его обрабатывающей нет в исходниках, то как это событие обрабатывается?
Друзья! Изучаю синтаксис дельфи. Ну то есть к примеру такой код: procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char); ...

Событие при активации textbox. Или событие при изменения фокуса
Здравствуйте. Подскажите можно ли создать свое событие происходящий вовремя активации textbox. Имеется ввиду создать свой класс...

Событие активности системы (или когда пользователь двигает мышкой или нажимает на клавиатуру)
Как отловить событие, когда после простоя компьютера пользователь двинул мышкой или нажал на любую клавишу на клавиатуре? Через...

Можно ли по названию платы,или по чипу,или по соккету,определить,поддерживает плата ХР или нет?
Добрый день всем.Уважаемые знатоки,я заранее прошу у Вас прощенья,если заданный мной вопрос,тупой или глупый. Но поверьте,я уже замучился...

костыль для IE...
Делаю на сайте менюшку с выезжающей панелью. Сбоку видна вкладка, при наведении на которую появляется само меню. Уже сейчас заметил, во...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru