Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
WPF

Модальное Окно для выбора операции с файлами без зависаний при выполнении цикла

30.03.2021, 15:31. Показов 4996. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
К слову и весь вопрос. Как можно передать окну которое будет находятся в другом потоке главное окно.
Окно будет запускать через отдельный класс который и будет создавать второстепенное окно в другом потоке.
Хотя вот функция которая вызывает окно:
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
private CheckBox templateCheckBox(string text)
        {
            return new CheckBox
            {
                Margin = new Thickness(8),
                VerticalAlignment = VerticalAlignment.Top,
                HorizontalContentAlignment = HorizontalAlignment.Center,
                VerticalContentAlignment = VerticalAlignment.Center,
                Style = (Style)Resources["StyleCheckBox"],
                Content = text
            };
        }
 
        public bool? ShowDialogControlSave(MainWindow mainWindow, string caption, int selectIndexSave = 0, int selectIndexOperation = 0)
        {
            this.Owner = mainWindow;
 
            this.Title = caption;
 
            this.Width = mainWindow.Width - 10;
            this.Height = mainWindow.Height - 10;
 
            this.WindowStartupLocation = WindowStartupLocation.CenterOwner;
 
            System.IO.Directory.GetFiles(SGeneral.settings.pathSaves, "*.map").ToList().ForEach(x =>
            {
                listSaves.Items.Add(templateCheckBox(System.IO.Path.GetFileName(x)));
            });
 
            if (selectIndexSave < listSaves.Items.Count)
                listSaves.SelectedIndex = selectIndexSave;
 
            switch (selectIndexOperation)
            {
                case 0:
                    rbtnOpenInSaveEditor.IsChecked = true;
                    break;
                case 1:
                    rbtnOpenInHexEditor.IsChecked = true;
                    break;
                case 2:
                    rbtnUncompressingSaves.IsChecked = true;
                    break;
                case 3:
                    rbtnCreateArchive.IsChecked = true;
                    break;
            }
 
            return this.ShowDialog();
        }
Но создание этого окна будет происходить в другом потоке.
Хотя не знаю как сделать грамотно. Само окно подразумивает выбор файлов и выбор операции что с ними делать.
Но сама функция System.IO.Directory.GetFiles и ForEach может продлится весьма долгое время а это не должно приводить к зависанию программы.
С другой стороны это окно модальное а значит когда оно отобразится переключатся на главное должно быть невозможным что уже говорит о том что модальное окно должно быть в потоке где и главное окно.
Подскажите как быть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.03.2021, 15:31
Ответы с готовыми решениями:

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

Как реализовать экран загрузки (без фризов) при выполнении программой долгого цикла?
3) Как реализовать экран загрузки (без фризов) при выполнении программой долгого цикла? Delphi XE5

Модальное окно Query с кнопками выбора
Добрый день, товарищи. Нужно получить диалоговое окно по клику на кнопке, внутри окна текст и две кнопки. В зависимости от выбора...

61
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16445 / 11288 / 2892
Регистрация: 21.04.2018
Сообщений: 33,185
Записей в блоге: 2
10.04.2021, 11:30
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Ну окей тогда посредством чего делаются глобальные данные. Но в принципе не сложно переделать.
"Глобальные" (статические) данные при правильной архитектуре, вообще, не используются.
Для передачи данных в разные, несвязанные между собой, объекты в основном используется "внедрение зависимостей".
В WPF Решении наиболее типично реализация внедрения зависимостей в App.

Добавлено через 20 минут
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Ну и чего я не знаю.
В первую очередь паттернов ООП.
Паттерны - это очень важно.

Приведу пример для понимания.
Вы можете использовать слова русского языка, но складывать из них предложения и тексты дикой формы.
Да, они не будут бессмысленны и вы сами сможете их читать, и вам, возможно, будет даже так удобнее.
Но вот никто другой их читать не захочет.
А вам же нужна ещё и помощь в этих текстах и вы из-за формы этого текста не сможете её получить.

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

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

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
У меня не консольное приложение. Считайте, что у меня приложение Win Forms.
Я уже сказал, что это не имеет значения.
Если у вас Консоль или Формы, то приложение должно быть реализовано в паттерне MVC или MVP.

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Не особо вас понял.
Прочитайте за Привязки на Формах.

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
я знаю что из 1 формы можно получить доступ к другой если в другой формме эти элементы являются публичными но как говорицца я не люблю такой способ
Это правильно, что не любите.
Это очень плохой способ.

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Вы хотите сказать что в моем коде прям все неправильно?
Да.

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Но файловый менеджер а он та каким местом неправильный.
Тем, что у вас нет Модели.
Разницы нет, что это за Представление - файловый менеджер или иное.
Представление на то и представление, что оно представляет данные Модели.
А у вас нет Модели и представлять, следовательно, нечего.

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Про модель данных я не очень понимаю слова. На сколько я понял это объявленные переменные, функции в классе?
Это слой приложения с Бизнес-Логикой.
То есть все исходные данные и работа с ними производится только в этом слое приложения.

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Еще поблема в том что я не могу продумать работу всеей программы зароанее целиком. Очень сильная проблемма особенно когда работаешь с моделью данных.
Это действительно проблема.
Поскольку ошибки в архитектуре приложения обычно очень трудно устранять.
Часто для этого приходится приложение создавать заново с нуля.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
11.04.2021, 00:47  [ТС]
Ну не знаю можно ли это назвать моделью данных:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
using System;
using System.IO;
using Microsoft.Win32;
using WK.Libraries.BetterFolderBrowserNS;
using System.Text.Json;
using System.Windows;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Eador_M_of_the_B_W_Launcher.DataModel.DATA
{
    public class DATAGameWork
    {
        public static string fileName = @"\DATAGame.json";
 
        public DATAGame dataGame { get; set; }
 
        public DATAGameWork()
        {
            //Создание данных игры
            dataGame = new DATAGame
            { 
                FileNameSaveAstral = null,
                FileNameSaveOskolok = null,
                FullNameGame = null,
                FullNameHexEditor = null,
                SaveFolder = null,
                ReSetDATAGame = true
            };
            if (!LoadSetting(Environment.CurrentDirectory + fileName))
            {
                MessageBox.Show($"Необходимые данные небыли загружены!{Environment.NewLine}Программа будет закрыта!", 
                    "Ошибка загрузки данных", MessageBoxButton.OK, MessageBoxImage.Error);
                Environment.Exit(0);
            }
 
            //Создание списка с файлами сохранений игры
        }
 
        #region Загрузка данных
 
        private bool LoadSetting(string _filename)
        {
            if (File.Exists(_filename))
            {
                try
                {
                    dataGame = JsonSerializer.Deserialize<DATAGame>(File.ReadAllText(_filename), new JsonSerializerOptions { IgnoreNullValues = true });
                    if (dataGame.ReSetDATAGame)
                        SetSettings();
 
                    return true;
                }
                catch (Exception ex)
                {
                    System.Windows.MessageBox.Show(ex.Message, "Ошибка чтения", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
                    return false;
                }
            }
            else
                return SetSettings();
        }
 
        #endregion
 
        #region Получения данных от пользователя
 
        private bool SetSettings()
        {
            dataGame.ReSetDATAGame = false;
 
            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                Multiselect = false,
                ValidateNames = true,
                CheckFileExists = true,
                CheckPathExists = true,
                DereferenceLinks = true,
            };
 
            openFileDialog.Filter = "launcher.exe|launcher.exe";
            openFileDialog.DefaultExt = "launcher.exe";
            openFileDialog.Title = "Выберите launcher.exe в папке с игрой";
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    dataGame.FullNameGame = openFileDialog.FileName;
                else
                    return false;
            }
            else
            {
                return false;
            }
 
            var betterFolderBrowser = new BetterFolderBrowser
            {
                Multiselect = false,
                RootFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
                Title = "Выберите папку с сохранениями"
            };
 
            if (betterFolderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if (Directory.Exists(betterFolderBrowser.SelectedFolder))
                    dataGame.SaveFolder = betterFolderBrowser.SelectedFolder;
                else
                    return false;
            }
            else
            {
                return false;
            }
 
            openFileDialog.Filter = "Сохранение(*.map)|*.map";
            openFileDialog.DefaultExt = "*.map";
            openFileDialog.Title = "Выберите постоянное сохранение с данными осколка";
            openFileDialog.InitialDirectory = dataGame.SaveFolder;
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    dataGame.FileNameSaveOskolok = $@"\{Path.GetFileName(openFileDialog.FileName)}";
                else
                    dataGame.FileNameSaveOskolok = "";
            }
            else
                dataGame.FileNameSaveOskolok = "";
 
            openFileDialog.Title = "Выберите постоянное сохранение с данными Астрала";
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    dataGame.FileNameSaveAstral = $@"\{Path.GetFileName(openFileDialog.FileName)}";
                else
                    dataGame.FileNameSaveAstral = "";
            }
            else
                dataGame.FileNameSaveAstral = "";
 
            openFileDialog.Filter = "HEX Редактор(*.exe)|*.exe";
            openFileDialog.DefaultExt = "*.exe";
            openFileDialog.Title = "Выберите hex редактор для редактирование сохранений вручную";
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    dataGame.FullNameHexEditor = openFileDialog.FileName;
                else
                    dataGame.FullNameHexEditor = null;
            }
 
            return SaveSetting(Environment.CurrentDirectory + fileName);
        }
 
        #endregion
 
        #region Сохранение данных
 
        private bool SaveSetting(string _filename)
        {
            try
            {
                File.WriteAllText(_filename, JsonSerializer.Serialize(dataGame, new JsonSerializerOptions { WriteIndented = true, IgnoreNullValues = true }));
                return true;
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message, "Ошибка чтения", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
                return false;
            }
        }
 
        #endregion
 
        #region Свойства
 
        public bool IsGameSteam
        {
            get => dataGame.FullNameGame.Contains("steamapps");
        }
 
        public bool IsFileNameSaveAstral
        {
            get => File.Exists(dataGame.SaveFolder + dataGame.FileNameSaveAstral);
        }
 
        public bool IsFileNameSaveOskolok
        {
            get => File.Exists(dataGame.SaveFolder + dataGame.FileNameSaveOskolok);
        }
 
        #endregion
    }
}
Но в данном случае класс служит работой для класса:
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
namespace Eador_M_of_the_B_W_Launcher.DataModel.DATA
{
    public class DATAGame
    {
        /// <summary>
        /// Задать настройки по новой
        /// </summary>
        public bool ReSetDATAGame { get; set; }
 
        /// <summary>
        /// Файл с сохранением в Астрале
        /// </summary>
        public string FileNameSaveAstral { get; set; }
        /// <summary>
        /// Файл с сохранением на Осколке
        /// </summary>
        public string FileNameSaveOskolok { get; set; }
        /// <summary>
        /// Файл игры (Полный путь и имя файла)
        /// </summary>
        public string FullNameGame { get; set; }
        /// <summary>
        /// Папка с сохранениями
        /// </summary>
        public string SaveFolder  { get; set; }
        /// <summary>
        /// Файл hex редактора (Полный путь и имя файла)
        /// </summary>
        public string FullNameHexEditor { get; set; }
    }
}
Интерфейс не использую так как реализация методов одна. Единственное что:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public bool IsGameSteam
        {
            get => dataGame.FullNameGame.Contains("steamapps");
        }
 
        public bool IsFileNameSaveAstral
        {
            get => File.Exists(dataGame.SaveFolder + dataGame.FileNameSaveAstral);
        }
 
        public bool IsFileNameSaveOskolok
        {
            get => File.Exists(dataGame.SaveFolder + dataGame.FileNameSaveOskolok);
        }
Можно вынести в DATAGame но учитывая что DATAGame этот класс чисто для серилизуемых данных то пихать туда ничего лишнего не хочется.
Объект списков нужно добавить в DATAGameWork и все что в DATAGameWork должно быть глобальным ну точнее необязательно используются эти данные много где. Не только в главном окне но и файловый менеджер и модульное окно (модульному окну по сути нужны только списки с другой стороны спискам нужны будут данные из DATAGame)
Про патерный я понял но вот не понимаю ак их складывать. Английского я не знаю и учить ради программирования которое для меня лишь Хобби я не собираюсь. Так что тут загвоздка с патернами. Легче наверное описание делать как я это сделал с DATAGame

Добавлено через 3 часа 8 минут
Разобрался немного в интерфейсе и думаю нужно создать для DATAGameWork интерфейс.
И соответственно в интерфейс вынести
public DATAGame dataGame { get; set; }
и список. И свойства. И уже модульное окно или файловый будет принимать интерфейс
Правдо без понятия как это сделать.

Добавлено через 13 минут
Ну вроде так:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
using System;
using System.IO;
using Microsoft.Win32;
using WK.Libraries.BetterFolderBrowserNS;
using System.Text.Json;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Eador_M_of_the_B_W_Launcher.DataModel.DATA
{
 
    public interface IDATAGameWork
    {
        DATAGame dataGame { get; set; }
 
        bool IsGameSteam { get; }
        bool IsFileNameSaveAstral { get; }
        bool IsFileNameSaveOskolok { get; }
    }
 
    public class DATAGameWork: IDATAGameWork
    {
        private readonly IMessageService _messageService;
 
        private static string fileName = @"\DATAGame.json";
 
        
 
        public DATAGameWork(IMessageService _messageService)
        {
            this._messageService = _messageService;
 
            //Создание данных игры
            dataGame = new DATAGame
            { 
                FileNameSaveAstral = null,
                FileNameSaveOskolok = null,
                FullNameGame = null,
                FullNameHexEditor = null,
                SaveFolder = null,
                ReSetDATAGame = true
            };
 
            if (!LoadDATAGame(Environment.CurrentDirectory + fileName))
            {
                _messageService.MessageError("Ошибка загрузки данных", $"Необходимые данные небыли загружены!{Environment.NewLine}Программа будет закрыта!");
                Environment.Exit(0);
            }
 
            //Создание списка с файлами сохранений игры
        }
 
        #region Загрузка данных
 
        private bool LoadDATAGame(string _filename)
        {
            if (File.Exists(_filename))
            {
                try
                {
                    dataGame = JsonSerializer.Deserialize<DATAGame>(File.ReadAllText(_filename), new JsonSerializerOptions { IgnoreNullValues = true });
                    if (dataGame.ReSetDATAGame)
                        SetDATAGame();
 
                    return true;
                }
                catch (Exception ex)
                {
                    _messageService.MessageError(ex.Message, "Ошибка чтения");
                    return false;
                }
            }
            else
                return SetDATAGame();
        }
 
        #endregion
 
        #region Получения данных от пользователя
 
        private bool SetDATAGame()
        {
            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                Multiselect = false,
                ValidateNames = true,
                CheckFileExists = true,
                CheckPathExists = true,
                DereferenceLinks = true,
            };
 
            openFileDialog.Filter = "launcher.exe|launcher.exe";
            openFileDialog.DefaultExt = "launcher.exe";
            openFileDialog.Title = "Выберите launcher.exe в папке с игрой";
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    dataGame.FullNameGame = openFileDialog.FileName;
                else
                    return false;
            }
            else
            {
                return false;
            }
 
            var betterFolderBrowser = new BetterFolderBrowser
            {
                Multiselect = false,
                RootFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
                Title = "Выберите папку с сохранениями"
            };
 
            if (betterFolderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if (Directory.Exists(betterFolderBrowser.SelectedFolder))
                    dataGame.SaveFolder = betterFolderBrowser.SelectedFolder;
                else
                    return false;
            }
            else
            {
                return false;
            }
 
            openFileDialog.Filter = "Сохранение(*.map)|*.map";
            openFileDialog.DefaultExt = "*.map";
            openFileDialog.Title = "Выберите постоянное сохранение с данными осколка";
            openFileDialog.InitialDirectory = dataGame.SaveFolder;
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    dataGame.FileNameSaveOskolok = $@"\{Path.GetFileName(openFileDialog.FileName)}";
                else
                    dataGame.FileNameSaveOskolok = "";
            }
            else
                dataGame.FileNameSaveOskolok = "";
 
            openFileDialog.Title = "Выберите постоянное сохранение с данными Астрала";
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    dataGame.FileNameSaveAstral = $@"\{Path.GetFileName(openFileDialog.FileName)}";
                else
                    dataGame.FileNameSaveAstral = "";
            }
            else
                dataGame.FileNameSaveAstral = "";
 
            openFileDialog.Filter = "HEX Редактор(*.exe)|*.exe";
            openFileDialog.DefaultExt = "*.exe";
            openFileDialog.Title = "Выберите hex редактор для редактирование сохранений вручную";
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    dataGame.FullNameHexEditor = openFileDialog.FileName;
                else
                    dataGame.FullNameHexEditor = null;
            }
 
            dataGame.ReSetDATAGame = false;
 
            return SaveDATAGame(Environment.CurrentDirectory + fileName);
        }
 
        #endregion
 
        #region Сохранение данных
 
        private bool SaveDATAGame(string _filename)
        {
            try
            {
                File.WriteAllText(_filename, JsonSerializer.Serialize(dataGame, new JsonSerializerOptions { WriteIndented = true, IgnoreNullValues = true }));
                return true;
            }
            catch (Exception ex)
            {
                _messageService.MessageError(ex.Message, "Ошибка записи");
                return false;
            }
        }
 
        #endregion
 
        #region Свойства
 
 
        public DATAGame dataGame { get => dataGame; set => dataGame = value; }
 
        public bool IsGameSteam => dataGame.FullNameGame.Contains("steamapps");
 
        public bool IsFileNameSaveAstral => File.Exists(dataGame.SaveFolder + dataGame.FileNameSaveAstral);
 
        public bool IsFileNameSaveOskolok => File.Exists(dataGame.SaveFolder + dataGame.FileNameSaveOskolok);
 
        #endregion
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2021, 00:47

Как сделать одно модальное окно для всех товаров без использования Джаваскрипта
Сейчас товары выводятся с модальным окном циклом http://wnero.esy.es/frontend/web/index.php?r=site/shop &lt;?php foreach...

Модальное окно без jQuery
Здравствуйте. Подскажите пожалуйста модальное окно без использования библиотек, таких как jQuery. Чтобы показать одно вспл. окно не гуд...

Есть модальное окно (без анимации)
Здравствуйте, есть у меня скрипт, который открывает модальное окно, но он открывает очень резко, что нужно добавить в код что бы...

Верстка без адаптации и модальное окно (photoSwip)
При зуме сайта нужно что бы модальное окно приложения photoSwipe открывалось по размерам текущего видимого окна. Добавление viewport не...

Окно с тремя метками и модальное окно для изменения их текста
Главное окно (фиксированного размера) содержит три метки. При щелчке на одной из меток появляется модальное окно с полем ввода и кнопками...


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

Или воспользуйтесь поиском по форуму:
62
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru