Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/313: Рейтинг темы: голосов - 313, средняя оценка - 4.52
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34

Создание программы - ООП модель, MVP

30.10.2018, 11:10. Показов 73016. Ответов 100

Студворк — интернет-сервис помощи студентам
Пример разработки приложения с нуля под WinForms

Рассматриваются такие аспекты разработки как:
  • Создание ООП модели предметной области.
  • Разработка Unit-тестов.
  • Архитектура приложения под WinForms.
  • Разработка пользовательского интерфейса с разделением модели и представления (MVP).
  • Разработка UserControl для построения пользовательского интерфейса.
  • Рефакторинг, непрерывная интеграция.
  • Организация проекта в VisualStudio.

В этом примере НЕ рассматриваются шаблоны типа фабрик, не рассматривается внедрение зависимостей (DI).
Используется простой вариант шаблона Model-View-Presenter, адаптированный под специфику WinForms.

Этот топик перекликается с этим FAQ, и является практическим примером к нему.
Комментарии и вопросы - приветствуются.

Постановка задачи

Требуется создать приложение - опросник.

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

Приложение должно состоять из двух частей - конструктора опросника и приложения в котором респондент может ответить на вопросы готового опросника.

Результаты опроса должны выгружаться в виде, пригодном для дальнейшей обработки.
19
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.10.2018, 11:10
Ответы с готовыми решениями:

Встраивание Google RESTful pattern A в модель MVP
Доброго дня. Всем известна модель MVC и её разновидность MVP, достаточно подробную статью по реализации MVP можно посмотреть здесь А...

Создание дочернего окна в MVP
Продолжаю разбираться с MVP. Не знаю, как правильно в данном шаблоне сделать работу с дочерним окном. Есть главное окно MainForm,...

ООП. Переделать фрагмент программы под ООП
Есть небольшой фрагмент из программы, который необходимо перестроить под ООП(создать класс), для удобного испольщования. Можно ли изменить...

100
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
19.11.2018, 09:32  [ТС]
Студворк — интернет-сервис помощи студентам
umatkot,
Ок, отправьте на pull request на github, я посмотрю изменения и приму запрос.
0
#MRoose
 Аватар для MIRAMIX
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
20.11.2018, 01:50
Storm23,
Позвольте задать последние 2 вопроса по ядру :
1. Можно на этапе прохождения опросника вернуться на шаг назад?
То есть выбрал/ввел ответ на вопрос 2 - вышел вопрос 3 - нажал Назад - вопрос 3 пропадает и опять задается 2й вопрос.

2. Как можно реализовать возможность установки зависимости для AlternativePanel/QuestPanel от значения текста в textBox на форме конструктора?
В чем суть дополнения к ТЗ - в оригинальном экселе (откуда черпается вся инфа о пользователях) есть столбец с датой трудоустройства в формате дд.мм.гггг.
Так вот, для сотрудников опросник будет считываться из одного файла.
Тот же вопрос про режим (5/2, 2/2..) зависит от стажа и вариант с 2/2 не должен показываться новичкам.

textBox нужен на каждом QuestPanel/AlternativePanel. В него админ вписывает число (кол-во месяцев). Если после установки кол-ва полных месяцев работы сотрдудника < чем в textBox - вопрос не задается. Если ничего не указать в textBox-е - ничего не прятать от новичков.

Давно выяснил, что если три вопроса A1, A2, A3 и два последних из них зависят от выбора в A1 - при записи в эксель, даже при наличии столбцов A1...A3 - выдаст ошибку.
Не критично, поэтому, хотя бы textBox на каждой AlternativePanel.

Только в таком случае придется и числа сохранять в .q.
При считывании опросника уже сравнивать с реальным стажем.
Впринципе это можно конструктору Интервью передать.

Много вопросов уже задал, понимаю, но еще до углубленного изучения ядра не дошел.
Спасибо заранее.
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
20.11.2018, 06:19
Цитата Сообщение от MIRAMIX Посмотреть сообщение
Если после установки кол-ва полных месяцев работы сотрдудника < чем в textBox - вопрос не задается.
Это можно использовать как в Condition, так и глобальной переменной сотрудника - встроить в логику проверку. Тогда нужно добавлять класс - Испытуемый или респондент - брать информацию из него.

Например, начинается опрос и сразу же форма выбора респондента, например.

Добавлено через 2 минуты
Цитата Сообщение от MIRAMIX Посмотреть сообщение
но еще до углубленного изучения ядра не дошел
как раз можете изучить, как работают Condition и логика выбора вопроса по Condition. Там калькулятор используется как раз для этого дела.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
20.11.2018, 06:22
Цитата Сообщение от Storm23 Посмотреть сообщение
Внимательно посмотрим на постановку задачи (которое также называется техническим заданием - ТЗ)
Постановка задачи и ТЗ - это две абсолютно разные книженции. Если на пальцах - то ТЗ это краткая формулировка (спецификация) того что прога должна уметь. Т.е. список что надо реализовать. А постановка это толмуд в котором описано как это реализовывать. Т.е. детально разобранные мат методы адаптированные к данной предметной области, c доказательством применимости, схемы структур данных и их взаимосвязи и т.д. и т.п. т.е детальное описание как реализовать то что указано в ТЗ.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
20.11.2018, 10:47  [ТС]
Цитата Сообщение от MIRAMIX Посмотреть сообщение
1. Можно на этапе прохождения опросника вернуться на шаг назад?
Можно.
Для этого в классе InterviewManipulator создаете метод GoToPrevQuestion, по аналогии с GoToNextQuestion.
В этом методе нужно:
1) удалить последний Answer из Anketa
2) удалить тот же Answer из Interview.PassedAnswers
3) последний установить Answer как currentAnswer в Interview

Цитата Сообщение от MIRAMIX Посмотреть сообщение
2. Как можно реализовать возможность установки зависимости для AlternativePanel/QuestPanel от значения текста в textBox на форме конструктора?
Не нужно никаких textBox на форме конструктора.
Если у вас есть некая информация, которую вы берете из внешнего источника, и от этой информации зависит прохождение интервью, то нужно:
1) Создать в анкете фейковый вопрос. Например с именем F1.
2) В вопросе F1 установить условие, которое никогда не будет выполняться. Например 1=2. Тогда вопрос F1 никогда не будет показываться респонденту.
3) Перед началом интервью, занести в Anketa данные для вопроса F1 (создав Answer для F1) из вашего внешнего источника.
4) Далее, в остальных вопросах опросника, вы сможете ссылаться на F1 в ваших условиях, и таким образом показывать/скрывать вопросы и альтернативы, в зависимости от F1.

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Постановка задачи и ТЗ - это две абсолютно разные книженции
Да, хорошо. Но во фрилансе это одно и то же.
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
20.11.2018, 12:27
Fulcrum_013, прошу прощения, что намерен оспорить Ваше мнение - это наоборот вообще-то. ТЗ - ниболее полное описание спецификации практически со всеми деталями. Постановка же задачи - это более общая и глобальная цель, которую можно разбить на подзадачи и, в итоге, составить ТЗ.
В самом талмудном ТЗ есть такая глава даже - постановка задачи - более общее представление.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
20.11.2018, 16:59
Цитата Сообщение от umatkot Посмотреть сообщение
Постановка же задачи - это более общая и глобальная цель, которую можно разбить на подзадачи и, в итоге, составить ТЗ.
Даже вики говорит совсем наоборот.https://ru.wikipedia.org/wiki/... 1%87%D0%B8

А ЕСПД тем более.
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
21.11.2018, 01:15
Fulcrum_013, там непроверенная и не достоверная информация.

Добавлено через 7 минут
здесь читайте, что откуда выходит - https://studfiles.net/preview/2038443/, вообще ТЗ может содержать более точную спецификацию по входным и выходным параметрам системы и её компонентов, чего нет в постановке - возможно, в постановке идёт более полное описание архитектуры и бизнес процессов, но не наоборот. С одним ТЗ я могу полностью описать всю структуру данных - а постановка - это вообще обычно всегда было введением перед определением бизнес процессов и проработки архитектуры с моделями https://lektsii.org/7-60695.html. Постановка как бы определяет что мы хотим получить.
В википедию кто-то откуда-то скопипастил бездумно, тот кто не делал ничего подобного.

Добавлено через 5 минут
Более близкий к теме дам пример - постановкой задачи мы могли бы назвать описание "хотелки" заказчика. Он говорит - я хочу опросник, чтобы он мог создавать опросы и проводить анкетирование. Каждый вопрос может быть зависим от ответа предыдущего вопроса. Анкеты должны сохраняться в БД, ФАЙЛЫ, читаться также. И ещё некоторые детали глазами заказчика, но уже более продуманные. А ТЗ бы описывало нам, какие формы что содержат, какие поля, какие форматы в файлах и БД, колонки и типы данных. Потом прорабатывается архитектура и бизнес процессы. Примерно так.

Добавлено через 1 минуту
ТЗ может идти и после проработки архитектуры - это уже по ситуации смотришь. Программист берёт ТЗ и клепает тупо код не думая. По постановке идёт работа как по основному заданию.

Добавлено через 1 минуту
Вообще, я работал в отделе постановке программного обеспечения - мы там вообще всё делали, но в основном клепали ТЗшки. После института пришёл и несколько удивился, что они весь этот процесс называют постановкой а не разработкой. В итоге мы занимались переводом хотелок специалистов в более полную документацию в виде ТЗ. Бизнес модели уже дорабатывали программисты.

Добавлено через 56 секунд
Но это не совсем корректное было определение, всё-таки мы там больше пили чай и ели торты.

Добавлено через 4 минуты
Возможно, я подзабыл, да, постановка может иметь более насыщенную работу, но обычно это дело или обозначается как видение или уже является всем процессом разработки. Короче, постановки тоже бывают разные - всё зависит от смысла, который в него, в этот термин вкладывают.

Добавлено через 1 минуту
Я скинул два источника, чтобы можно было увидеть, что в одном месте это этап разработки, а в другом - это весь процесс.
0
#MRoose
 Аватар для MIRAMIX
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
21.11.2018, 01:38
Цитата Сообщение от Storm23 Посмотреть сообщение
Можно.
Для этого в классе InterviewManipulator создаете метод GoToPrevQuestion, по аналогии с GoToNextQuestion.
В этом методе нужно:
1) удалить последний Answer из Anketa
2) удалить тот же Answer из Interview.PassedAnswers
3) последний установить Answer как currentAnswer в Interview
Доброй ночи. Вот что получилось :
Кликните здесь для просмотра всего текста
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
public void GoToPrevQuestion()
        {
            if (interview.IsFinished) return;//интервью уже завершено
 
            //получаем индекс текущего вопроса
            var currentQuestIndex = interview.CurrentAnswer == null ? -1 : interview.questionnaire.FindIndex(q => q.Id == interview.CurrentAnswer.QuestId);
 
            //ищем следующий вопрос, у которго выполняется условие показа
            for (int i = currentQuestIndex - 1; i < interview.questionnaire.Count; i++)
            {
                //получаем условие отображения вопроса
                var condition = interview.questionnaire[i].Condition;
 
                //условие выполняется?
                var clalculator = new ConditionCalculator();
                if (clalculator.Calculate(interview.anketa, condition))
                {
                    //нашли
                    var quest = interview.questionnaire[i];
 
                    //добавляем текущий ответ в список отвеченных вопросов
                    if (interview.CurrentAnswer != null)
                        interview.PassedAnswers.Remove(interview.CurrentAnswer);
 
                    //создаем новый Answer для нового вопроса
                    interview.CurrentAnswer = new Answer { QuestId = quest.Id };
                    interview.anketa.Add(interview.CurrentAnswer);
                    //
                    return;
                }
            }
 
            //нет следующего вопроса, анкета завершена
            if (interview.CurrentAnswer != null)
            {
                interview.PassedAnswers.Add(interview.CurrentAnswer);
                interview.CurrentAnswer = interview.CurrentAnswer;
            }
            interview.IsFinished = true;
        }


Под 1м пунктом подразумевалось currentQuestIndex - 1;?

В результате лишь на месте активного вопроса появляется предыдущий (при нажатии на кнопку Назад разумеется).
Удалить (визуально ответ) невозможно, да?
0
187 / 100 / 19
Регистрация: 15.09.2011
Сообщений: 801
21.11.2018, 01:47
Цитата Сообщение от MIRAMIX Посмотреть сообщение
if (interview.IsFinished) return;//интервью уже завершено
это можно было бы использовать уже для подстраховки. Дело в том, что это условие не должно отрабатывать в этом методе.

Добавлено через 5 минут
вчера весь вечер потратил на то, что у меня форма вопроса в дизайнере схлопывается в узкую полоску - а понять почему- не могу. Или студия глючит или я в лыжах на асфальте. Устанавливаю окно - запускаю, а там полоски вместо вопросов. Устанавливаю обратно размер, закрываю студию - открываю - снова полоски. капец. так из-за дизайна, бывает время теряешь впустую.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.11.2018, 02:34  [ТС]
Цитата Сообщение от MIRAMIX Посмотреть сообщение
Вот что получилось
Да нет. Что это вы делаете? Я же четко сказал что нужно сделать.
Вот как должен выглядеть этот метод:
C#
1
2
3
4
5
6
7
8
9
10
11
        /// <summary>
        /// Возврат к предыдущему вопросу
        /// </summary>
        public void GoToPrevQuestion()
        {
            var prevAnswer = interview.PassedAnswers.Last();
            interview.anketa.Remove(prevAnswer);
            interview.PassedAnswers.Remove(prevAnswer);
            interview.CurrentAnswer = prevAnswer;
            interview.IsFinished = false;
        }
Обновил на github.
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
21.11.2018, 04:02
Цитата Сообщение от umatkot Посмотреть сообщение
чего нет в постановке
В постановке есть все по определению постановки. А все эти студопедии - бред сивой кобылы. Если реально то в проектной документации раздел "постановка задачи" занимает 60-70%. а там у них спутано с "формулировкой задачи".
1
#MRoose
 Аватар для MIRAMIX
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
21.11.2018, 21:04
Цитата Сообщение от Storm23 Посмотреть сообщение
Что это вы делаете? Я же четко сказал что нужно сделать.
Ахахах)))
Ну я как обычный человек подумал, что если одно увеличивает -надо подправить немного и будет в обратную сторону.
К тому же :
Цитата Сообщение от Storm23 Посмотреть сообщение
по аналогии с GoToNextQuestion
Но в итоге коряво, но работало. Спасибо, элементарно оказывается.
Ядрышко-то огонь, позже разобрать и open-source dll-ку запилить можно. Спасибо)

Интересный момент - когда удаляешь альтернативу, она остается визуально неактивной, словно картинка, когда новую добавляешь - пропадает и появляется активная новая.
От чего так?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.11.2018, 22:09  [ТС]
Цитата Сообщение от MIRAMIX Посмотреть сообщение
Интересный момент - когда удаляешь альтернативу, она остается визуально неактивной, словно картинка, когда новую добавляешь - пропадает и появляется активная новая.
Просто не обновляется панель.
В метод UpdateInterface добавьте pnMain.Invalidate():
C#
1
2
3
4
5
        private void UpdateInterface()
        {
            btSave.Enabled = changed;
            pnMain.Invalidate(false);
        }
0
#MRoose
 Аватар для MIRAMIX
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
29.12.2018, 14:33
Storm23, давно не отвечал, ждал испытаний своего проекта.
Всего 3 выявились ошибки в проекте :
-как сделать неактивной/спрятать кнопку Назад при прохождение 1го вопроса в опроснике?
Если нажать назад - на 1м вопросе - выходит ошибка

-если вернуться назад и выбрать другой ответ из выпадающего списка - не подгружаются варианты в следующем вопросе, даже если опять вернуться и выбрать ранее выбранный ответ - все, следующие вопросы не подгружаются

-если ответ с ручным вводом и пользователь при прохождении опросника не ввел туда текст - тоже ошибка.
Можно как-нибудь хотя ввести проверку на пустое поле?

Добавлено через 14 секунд
С наступающим всех, форумчане)
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
29.12.2018, 20:15  [ТС]
MIRAMIX,
у вас есть полный исходный код, у вас есть полное объяснение каждого метода, у вас проект хорошо структурирован.
Что мешает вам самому исправить ошибки?
Возникают проблемы - пробуйте их решить самостоятельно.

Цитата Сообщение от MIRAMIX Посмотреть сообщение
-как сделать неактивной/спрятать кнопку Назад при прохождение 1го вопроса в опроснике?
Если нажать назад - на 1м вопросе - выходит ошибка
Ну это же элементарно - проверяйте не пуст ли interview.PassedAnswers. Если он пуст - то понятное дело, что вернуться нельзя. И в таком случае кнопку Назад нужно заблокировать.

Остальные проблемы - я не вникал. Я думаю это чисто технические вопросы и вы можете сами с ними справиться.
0
30.12.2018, 17:07

Не по теме:

Storm23, А почему на хабре не хотите подобное публиковать?

0
30.12.2018, 22:32  [ТС]

Не по теме:

Цитата Сообщение от sldp Посмотреть сообщение
Storm23, А почему на хабре не хотите подобное публиковать?
А почему вы думаете что у меня нет статей на хабре?
Были у меня и на хабре статьи. Но совсем по другой тематике.
Мне кажется архитектура ПО это не совсем тематика хабра.

0
30.12.2018, 23:05

Не по теме:

Storm23, Речь то про подобные шла.
Зря Вы так думаете. Очень даже подходящая тематика. Многим была бы крайне полезна подобная инфа.

0
#MRoose
 Аватар для MIRAMIX
8 / 9 / 3
Регистрация: 22.02.2013
Сообщений: 416
02.01.2019, 00:36
Storm23, с новым годом.
Вы правы, обленился что-то я. Еще несколько раз перечитал ваши шаги. Структуру все же полноценно не переварил, но уже легче ориентироваться в ядре)

Так, что в итоге :

1. блокировка кнопки Назад для 1го вопроса :
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
private void btBack_Click(object sender, EventArgs e)
        {
            if (interview.PassedAnswers.Count != 0)
            {
                interviewManipulator.GoToPrevQuestion();
                Build();
            }
            else return;
        }


2. Если в следующих вопросах список ответов зависел от ответа в предыдущих вопросах - варианты ответов у следующих вопросов вообще не появлялись - выходил пустой comboBox :
В методе GoToPrevQuestion из класса InterviewManipulator убрал строчку interview.anketa.Remove(prevAnswer);
Не понимаю почему, но все работает теперь вроде корректно))

3. Как запретить проходить опрос без ввода чего-нибудь в поле ручного ввода пока не разобрался(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.01.2019, 00:36
Помогаю со студенческими работами здесь

Модель ООП
Помоги сделать, пожалуйста работу! Возможно у кого нибудь есть примеры работы с классами! БУду рада всему, что есть! У меня тема...

Закрепить модель ООП
Добрый день. Ситуация такая: Я знаю и представляю себе модель ООП, классы, объекты, наследование и т.д. Но так как до чисто...

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

ООП модель системы спама
Срочно нужна помощь! Помогите пожалуйста реализовать программу с помощью классов. Спамер рассылает по сети Internet недобросовестную...

Ооп модель телефонного справочника
Нужен код на тему в заголовке с добавлением классов.Га с++ Буду очень благодарна!!


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru