Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57

Изолированное окно в одну процедуру

02.02.2025, 20:23. Показов 1861. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ума не приложу, возможно ли такое. Имею программу с кучей окон, решил добавить ещё одно (типо что бы принимала введённые данные) и понял что для этого нужно выполнить кучу действий.

Прописать константу окна
Прописать константы гаджетов
В основной цикл вписать события

вот и призадумался...
Можно ли в одной процедуре реализовать вывод этого окна, что бы не распыляться на весь код и не мусорить в него.
Знаю про BindGadgetEvent() но это как минимум две процедуры получится...
И константы гаджетам всё равно глобально нужно присвоить...

Может есть какое либо решение, одной независимой процедурой?

PureBasic
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
Procedure ButtonHandler()
    Protected Window=0, OldGadgetList, Button1=1, Button2=2
    
    If IsWindow(Window)
        
        Select EventGadget()
            Case Button1
                Debug "Событие нажатия кнопки в Button1"
            Case Button2
                Debug "Событие нажатия кнопки в Button2"
        EndSelect
        
    Else
        
        OpenWindow(Window, 100, 100, 200, 90, "Выберите тест", #PB_Window_SystemMenu)
 
        OldGadgetList = UseGadgetList(WindowID(Window))
 
        ButtonGadget(Button1, 10, 10, 180, 30, "Нажми на меня")
        BindGadgetEvent(Button1, @ButtonHandler())
        
        ButtonGadget(Button2, 10, 50, 180, 30, "Нажми на меня")
        BindGadgetEvent(Button2, @ButtonHandler())
 
        UseGadgetList(OldGadgetList)
        
    EndIf
    
EndProcedure
 
 
 
ButtonHandler()
 
Repeat
    Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Набросал что то, но идентификаторы будут конфликтовать с основным окном и другими...

Прочитал про изолированные модули, но особо не понял как их применить к конкретной, данной задачи.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2025, 20:23
Ответы с готовыми решениями:

Запуск нескольких процедур одним макросом
скажите, пожалуйста, что нужно сделать, чтобы эти 2 процедуры запускались одним макросом? сейчас на каждую из них создан свой макрос. ...

Одновременное выполнение разных процедур в одном файле?
1. могут ли в одном екселе выполняться разные процедуры параллельно? есть ли проблемы в одновременном исполнении? 2. если в одной...

Выполнение процедур одна за другой
Ребята вопрос! Есть две процедуры, которые должны выполняться друг за другом: проблема в том, что при выполнении условия VBA callит одну, а...

15
62 / 60 / 3
Регистрация: 06.11.2010
Сообщений: 184
Записей в блоге: 1
02.02.2025, 23:12
Посмотри как я создаю окно в процедуре, блокирую родительское, передаю хендл родительского дочернему, чтобы оно было дочернее и там же открываю цикл опроса только для событий текущего окна. Потом закрываем окно и разблокируем родительское.
Вот
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
03.02.2025, 21:31  [ТС]
AZJIO, И в чём изоляция?
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
04.02.2025, 01:38
Лучший ответ Сообщение было отмечено CryptoNickSoft как решение

Решение

PureBasic
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
Procedure ButtonHandler()
  Static Window=0, Button1=0, Button2=0
  
  If Window
    
    Select EventGadget()
      Case Button1
        Debug "Событие нажатия кнопки в Button1"
      Case Button2
        Debug "Событие нажатия кнопки в Button2"
    EndSelect
    
  Else
    
    Window = OpenWindow(#PB_Any, 100, 100, 200, 90, "Выберите тест", #PB_Window_SystemMenu)
     
    Button1=ButtonGadget(#PB_Any, 10, 10, 180, 30, "Нажми на меня")
    BindGadgetEvent(Button1, @ButtonHandler())
    
    Button2=ButtonGadget(#PB_Any, 10, 50, 180, 30, "Нажми на меня")
    BindGadgetEvent(Button2, @ButtonHandler())
  EndIf
  
EndProcedure
 
 
 
ButtonHandler()
 
Repeat
    Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
Прочитал про изолированные модули, но особо не понял как их применить к конкретной, данной задачи.
Изолировать глобальные переменные, константы и процедуры.

Перечисления не обязательно должны быть в одном и том же месте. Их можно продолжать в дальнейшем в коде.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Enumeration Window
  #Win1
  #Win2
EndEnumeration
 
Enumeration Window
  #Win3
  #Win4
EndEnumeration
 
Debug #Win1
Debug #Win2
Debug #Win3
Debug #Win4
1
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
04.02.2025, 10:32  [ТС]
locm, Благодарю! Всё таки направление моей мысли было правильным. Но чуть не хватило знаний что бы до конца реализовать...
PureBasic
1
Static Window=0, Button1=0, Button2=0
Значение 0 обязательно указывать? Работает и без них...
В основном цикле события всё равно есть, но у них ID уникальный, поэтому пофиг, действия на них там не прописаны.

Добавлено через 2 минуты
Цитата Сообщение от locm Посмотреть сообщение
Перечисления не обязательно должны быть в одном
Я просто привык, что процедуры идут одна за другой и около них ничего больше нет. Но спасибо за совет. Ибо пригодится.
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
04.02.2025, 13:16
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
Значение 0 обязательно указывать?
Для переменной Window желательно.
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
04.02.2025, 22:15  [ТС]
Набросал пример:
PureBasic
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
#Window=0
#Button=0
 
Procedure WindowHandler()
    Static Window=#PB_Any, OldGadgetList, Button1, Button2
    
    If IsWindow(Window)
        
        Select Event()
            Case #PB_Event_CloseWindow
                Debug "Событие закрытия окна"
                CloseWindow(Window)
                
            Case #PB_Event_Gadget
                Select EventGadget()
                    Case Button1
                        Debug "Событие нажатия кнопки в Button1"
                    Case Button2
                        Debug "Событие нажатия кнопки в Button2"
                EndSelect
        EndSelect
        
    Else
        
        Window = OpenWindow(#PB_Any, 100, 100, 200, 90, "Жмите на кнопки", #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(#Window))
        
        ;OldGadgetList = UseGadgetList(WindowID(Window))
        
        Button1=ButtonGadget(#PB_Any, 10, 10, 180, 30, "Button 1")
        
        Button2=ButtonGadget(#PB_Any, 10, 50, 180, 30, "Button 2")
        
        
        ;UseGadgetList(OldGadgetList)
        
        BindEvent(#PB_Event_Gadget, @WindowHandler(), Window)
        BindEvent(#PB_Event_CloseWindow, @WindowHandler(), Window)
        
    EndIf
    
EndProcedure
 
OpenWindow(#Window, 0, 0, 400, 300, "Жмите на кнопки", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Button, 5, 5, 180, 30, "Button 0")
 
 
 
 
Repeat
    Event = WaitWindowEvent()
    Select Event
        Case #PB_Event_Gadget
            EventGadget = EventGadget() 
            Select EventGadget
                Case #Button : Debug "Событие нажатия кнопки в Button 0"
                    WindowHandler()
            EndSelect
            Debug "Main ID: "+EventGadget
    EndSelect
    
Until Event = #PB_Event_CloseWindow
Добавлено через 3 минуты
Цитата Сообщение от locm Посмотреть сообщение
Для переменной Window желательно
но не ноль, ибо может конфликтовать с основным окном. решил делать номер уникальным Window=#PB_Any и потом проверять создано ли окно.
Также заменил BindGadgetEvent() на BindEvent() ибо раз прописал и все гаджеты под контролем.
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
04.02.2025, 23:11
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
может конфликтовать с основным окном.
Почему?
В моем коде существование окна не проверяется
PureBasic
1
If Window
Это проверка успешности создания окна при предыдущих вызовах. А если вызовов не было или окно создать не удалось, то в переменой будет 0.
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
05.02.2025, 00:22  [ТС]
locm, Да почему то у меня пересеклось с основным окном и код неправильно работал...
Хотя сейчас смотрю, всё нормально должно быть...

Проверять нужно, есть ли окно.. Вот прям по примеру...
Клацаем кнопку один, открывается дочернее окно Window значение прописалось. Закрываем дочернее окно. Пытаемся вновь открыть.
А код думает что окно то есть...
Если Window=0 и у основного окна также, то детект будет неверным..

Для вашего варианта, после закрытия окна, нужно в переменную Window вписать ноль... А если забыл это сделать, то увы, будут проблемы.
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
05.02.2025, 01:54
Лучший ответ Сообщение было отмечено CryptoNickSoft как решение

Решение

Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
А код думает что окно то есть...
Если Window=0 и у основного окна также, то детект будет неверным..
Разве код неправильно работает?
PureBasic
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
#Window=0
#Button=0
 
Procedure WindowHandler()
  Static Window=0, OldGadgetList, Button1, Button2
  
  If Window
    
    Select Event()
      Case #PB_Event_CloseWindow
        Debug "Событие закрытия окна"
        UnbindEvent(#PB_Event_Gadget, @WindowHandler(), Window)
        UnbindEvent(#PB_Event_CloseWindow, @WindowHandler(), Window)
        CloseWindow(Window)
        Window=0
      Case #PB_Event_Gadget
        Select EventGadget()
          Case Button1
            Debug "Событие нажатия кнопки в Button1"
          Case Button2
            Debug "Событие нажатия кнопки в Button2"
        EndSelect
    EndSelect
    
  Else
    
    Window = OpenWindow(#PB_Any, 100, 100, 200, 90, "Жмите на кнопки", #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(#Window)) 
    Button1=ButtonGadget(#PB_Any, 10, 10, 180, 30, "Button 1")
    Button2=ButtonGadget(#PB_Any, 10, 50, 180, 30, "Button 2")
    BindEvent(#PB_Event_Gadget, @WindowHandler(), Window)
    BindEvent(#PB_Event_CloseWindow, @WindowHandler(), Window)
    
  EndIf
EndProcedure
 
OpenWindow(#Window, 0, 0, 400, 300, "Жмите на кнопки", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Button, 5, 5, 180, 30, "Button 0")
 
Repeat
  Event = WaitWindowEvent()
  If EventWindow() = #Window
    Select Event
      Case #PB_Event_Gadget
        EventGadget = EventGadget() 
        Select EventGadget
          Case #Button : Debug "Событие нажатия кнопки в Button 0"
            WindowHandler()
        EndSelect
        Debug "Main ID: "+EventGadget
    EndSelect
  EndIf
Until Event = #PB_Event_CloseWindow
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
Для вашего варианта, после закрытия окна, нужно в переменную Window вписать ноль... А если забыл это сделать, то увы, будут проблемы.
А если забыть закрыть окно, файл, очистить память и т. д, программа тоже может неправильно работать. Это ошибка и ее нужно исправлять.

Вот к примеру вы забыли UnbindEvent() и проверять какому окну принадлежат события.
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
05.02.2025, 09:29  [ТС]
locm, Так ещё лучше! Благодарю за помощь.

Пока не понял как и куда добавить одинаковые действия внутри процедуры
Например нажатие кнопки Ок и Enter на клавиатуру в гаджете ввода текста
События разные, а действия почти идентичные, взять данные с поля ввода и выполнить код...
Не два раза же его писать...

Хотя... Можно же перенаправить действия на код кнопки:
PureBasic
1
PostEvent(#PB_Event_Gadget, Window, Button1)
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
13.02.2025, 09:00  [ТС]
Хочу навесить горячие клавиши на окно, но что бы не было пересечений с основным окном...
PureBasic
1
AddKeyboardShortcut(#Window, #PB_Shortcut_Escape, CloseMenu)
PureBasic
1
#PB_Any
тут не катит и нужно указывать реальный номер, а он может пересечься с тем что в основном меню...
Можно конечно в основном потоке считывать события лишь в указанных окнах
PureBasic
1
If EventWindow() = #Window
, но всё же, может есть другой способ?
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
13.02.2025, 12:01
Цитата Сообщение от CryptoNickSoft Посмотреть сообщение
что бы не было пересечений с основным окном
Можно узнать в каком окне произошло событие и будет не важно что идентификаторы меню одинаковые.
PureBasic
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
#Window=0
#Button=0
 
Procedure WindowHandler()
  Static Window=0, OldGadgetList, Button1, Button2
  
  If Window
    
    Select Event()
      Case #PB_Event_CloseWindow
        Debug "Событие закрытия окна"
        UnbindEvent(#PB_Event_Gadget, @WindowHandler(), Window)
        UnbindEvent(#PB_Event_CloseWindow, @WindowHandler(), Window)
        UnbindEvent(#PB_Event_Menu, @WindowHandler(), Window)
        RemoveKeyboardShortcut(Window, #PB_Shortcut_Escape)
        CloseWindow(Window)
        Window=0
      Case #PB_Event_Gadget
        Select EventGadget()
          Case Button1
            Debug "Событие нажатия кнопки в Button1"
          Case Button2
            Debug "Событие нажатия кнопки в Button2"
        EndSelect
      Case #PB_Event_Menu
        Debug "Child Window: Menu = "+EventMenu()
    EndSelect
    
  Else
    
    Window = OpenWindow(#PB_Any, 100, 100, 200, 90, "Жмите на кнопки", #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(#Window)) 
    Button1=ButtonGadget(#PB_Any, 10, 10, 180, 30, "Button 1")
    Button2=ButtonGadget(#PB_Any, 10, 50, 180, 30, "Button 2")
    BindEvent(#PB_Event_Gadget, @WindowHandler(), Window)
    BindEvent(#PB_Event_CloseWindow, @WindowHandler(), Window)
    BindEvent(#PB_Event_Menu, @WindowHandler(), Window)
    AddKeyboardShortcut(Window, #PB_Shortcut_Escape, 0)
  EndIf
EndProcedure
 
OpenWindow(#Window, 0, 0, 400, 300, "Жмите на кнопки", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Button, 5, 5, 180, 30, "Button 0")
AddKeyboardShortcut(#Window, #PB_Shortcut_Escape, 0)
 
Repeat
  Event = WaitWindowEvent()
  If EventWindow() = #Window
    Select Event
      Case #PB_Event_Gadget
        EventGadget = EventGadget() 
        Select EventGadget
          Case #Button : Debug "Событие нажатия кнопки в Button 0"
            WindowHandler()
        EndSelect
        Debug "Main Window: Gadget = "+EventGadget
      Case #PB_Event_Menu
        Debug "Main Window: Menu = "+EventMenu()
    EndSelect
  EndIf
Until Event = #PB_Event_CloseWindow
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
16.02.2025, 09:41  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Можно узнать в каком окне произошло событие и будет не важно что идентификаторы меню одинаковые
Получается что в основном цикле нужно делать фильтры....
Ладно когда пишется проект с нуля, а вот если добавить в готовый проект, где много окон.
Ну что же, придётся сделать что то типо этого:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Repeat
    Event = WaitWindowEvent()
    Select EventWindow()
        Case #Window, #Window1, #Window2
            Select Event
                Case #PB_Event_Gadget
                    EventGadget = EventGadget() 
                    Select EventGadget
                        Case #Button : Debug "Событие нажатия кнопки в Button 0"
                            WindowHandler()
                    EndSelect
                    Debug "Main Window: Gadget = "+EventGadget
                Case #PB_Event_Menu
                    Debug "Main Window: Menu = "+EventMenu()
            EndSelect
    EndSelect
Until Event = #PB_Event_CloseWindow
Или, что бы не перечислить все константы окон:
PureBasic
1
2
Select EventWindow()
    Case 0 To 100
Больше, скорее всего, окон не будет, а те что прописаны в процедурах имеют значение #PB_Any - восьмизначное.....

Или так, заменить в вашем примере:
PureBasic
1
If EventWindow() = #Window
на
PureBasic
1
If EventWindow() < 100
не обязательно сто, но больше чем окон обрабатываемых в основном цикле.
Или так:
PureBasic
1
If Len(Str(EventWindow())) <> 8
Может быть есть способ посчитать количество цифр не переводя их в строку?

! Нужно сделать определение. ID окна из списка констант (от 0 до..) или ID сгенерировано #PB_Any (восьмизначное)
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
16.02.2025, 15:29
Номер окна может быть не больше 5000.
PureBasic
1
2
3
4
OpenWindow(10000, 100, 100, 200, 200, "", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Проверяйте
PureBasic
1
If EventWindow() < 5000
0
0 / 0 / 0
Регистрация: 17.10.2021
Сообщений: 57
16.02.2025, 15:35  [ТС]
Проверяйте
Всё отлично! Благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2025, 15:35
Помогаю со студенческими работами здесь

Количество процедур в одном модуле
Вопросец простенький, сколько можно процедур в один модуль запихать и второй как мне лишние модули удалить, а то их слишком много.

Глобальный обработчик ошибок. Если отключить обработчик ошибок в одной из процедур, будет ли он работать в других?
Есть какой то код Sub main On error goto ErrorLine 'тут какой-то код call fng_1 'тут вызывается новая процедура 'тут какой-то...

Копирование текста из одного текстового окна в другое
Как написать процедуру обработки события нажатия кнопки, которая реализует действия: копирование текста из одного текстового окна в другое...

Вставка текста одновременно в 2 окна ввода текста
Добрый день! Помогите, пожалуйста. Есть код: Private Sub CommandButton4_Click() Dim oDataObject As DataObject, hdCW As String ...

Копирование текста из одного окна в другое
Здравствуйте! Интересно узнать ваше мнение по поводу следующей задачи. Есть текстовый документ (Word) и страница браузера (Опера)....


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru