Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72

Ограничение зоны перетаскивания форм/окон

21.02.2025, 12:18. Показов 5829. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, добрый день.
Задача такая. Внутри MDIForm есть слева "меню" (безрамочная MDIChild форма), а на "рабочем поле" программы будут открываться разные дочерние окна, которые не должны закрывать собой меню.
Нужно ограничить перемещение остальных дочерних форм влево до ширины "меню".
А также запоминать их положение.

Решить задачу простым методом видимо не вариант, поскольку события "Form_Move" в барсике не предусмотрено, а все остальные типа MouseDown+MouseMove, DragDrop работают только над полем формы, но не над заголовком, за который эта форма перетаскивается.
По ходу пьесы, чтобы всю скатерть предполагаемого кода не дублировать во все формы в программе, было решено основную исполняемую часть поместить в модуль и сделать универсальной для всех форм, с идентификацией форм по hwnd или ещё как...

Я покурил этот вопрос, нашел примеры на API.
Сделал меню всегда поверх остальных (в случае работающего ограничителя это не нужно, но если не получится, то пусть остальные окошки подлазят ПОД меню.)
Но поскольку в API я мало что понимаю, никак не могу адаптировать код перетаскивания под свою задачу.
Оно работает, перетаскивание форм ограничивает. Но хорошо работает только с одной.
Даже при наличии двойного условия If Form1.Visible = True And Form1.Left < 2000 Then формы вылазят все, достаточно только сдвинуть (видимую, одну из) форму ! Менять формам свойство Visible=false тоже бесполезно, они всё равно вылазят.

Запоминание положения я потом доработаю. Переменные WL и WT сделаю массивами и координаты всех форм буду туда распределять.
Сейчас задача разобраться с Function WinProc. Видимо тут засада, а у меня не хватает знаний API. Помогите пжлст

Прикрепил архив проекта.
Вложения
Тип файла: zip 777.zip (4.3 Кб, 13 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.02.2025, 12:18
Ответы с готовыми решениями:

1. Обмен данными с рабочей книгой MS Excel. 2. Проектирование форм окон
1. Для восьми хозяйств известны общий объем валовой продукции (ден.ед) и площадь сельскохозяйственной продукции (га.). Определите Средний...

Ограничение зоны на карте в 2D игре
Всем привет, как сделать ограничение, до красных линий? Как на этой картинке.

Загрузка форм и окон
Если топик создал не в подобающем разделе,прошу заранее прощения,но тема вполне себе актуальная У меня с игроками одного ресурса возник...

60
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
22.02.2025, 18:23
Студворк — интернет-сервис помощи студентам
MrRoxMJ, смотри свойство AutoShowChildren.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
22.02.2025, 18:30
The trick, ну ладно, значит bDefCall = False нужен, ты же видишь я как раз его оставил на всякий случай, ок, ты прав)

Добавлено через 58 секунд
Цитата Сообщение от The trick Посмотреть сообщение
Этот код вообще не нужно использовать.
Нужно или не нужно, но магия же работает.
0
22.02.2025, 18:38

Не по теме:

Цитата Сообщение от HackerVlad Посмотреть сообщение
а в VBA нету коллекций? Там только словари?
Конечно есть коллекции. Простой пример - поиск уникальных чисел, попробуй сделать но с использованием коллекций.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub afdsfsadf()
    Dim arInp(), arOut(), i&
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    arInp = Array(3, 7, 5, 9, 5, 4, 7)
    For i = 0 To UBound(arInp)
        dict(arInp(i)) = Empty
    Next
    arOut = dict.keys
    For i = 0 To UBound(arOut)
        Debug.Print arOut(i)
    Next
End Sub

0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
22.02.2025, 19:05
Цитата Сообщение от The trick Посмотреть сообщение
If (tWndPos.flags And SWP_NOMOVE) = 0 And IsZoomed(hwnd) = 0 Then
Да, я проверил, этот код тоже хорошо работает как и магия.

Добавлено через 22 минуты

Не по теме:


Цитата Сообщение от testuser2 Посмотреть сообщение
попробуй сделать но с использованием коллекций
А кто сказал что это невозможно? Да ради Бога, пожалуйста:

Visual Basic
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
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)
 
Private Sub LetStringArray(sa() As String, idx As Long, sVal As String)
    ' Necessary because, if the array is the function name, you can't assign from within the function.
    sa(idx) = sVal
End Sub
 
Private Function PtrAdd(iPtr As Long, iOffset As Long) As Long
    PtrAdd = (iPtr Xor &H80000000) + iOffset Xor &H80000000
End Function
 
Public Function collAllKeys(c As Collection) As String()
    ' This one actually DOES return vbNullString keys.
    ' Returns 0 to -1 array on empty Collection.
    '
    Dim iArray      As Long
    Dim iItemPtr    As Long
    Dim sKeyTemp    As String
    '
    If c Is Nothing Then
        collAllKeys = Split(vbNullString)
        Exit Function
    End If
    If c.Count = 0 Then
        collAllKeys = Split(vbNullString)
        Exit Function
    End If
    '
    ReDim collAllKeys(1 To c.Count)
    iItemPtr = ObjPtr(c)                                                        ' This works because the offset in the header is also &H18.
    For iArray = 1& To c.Count
        CopyMemory iItemPtr, ByVal PtrAdd(iItemPtr, &H18&), 4&                  ' First/Next item pointer of collection item.
        CopyMemory ByVal VarPtr(sKeyTemp), ByVal PtrAdd(iItemPtr, &H10&), 4&    ' Key string of collection item.
        LetStringArray collAllKeys, iArray, sKeyTemp                            ' Move key into array.
    Next iArray
    '
    ' Mandatory cleanup, put string pointer back to keep memory straight.
    CopyMemory ByVal VarPtr(sKeyTemp), 0&, 4&
End Function
 
Sub afdsfsadf()
    Dim arInp(), arOut(), i&
    
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim coll As New Collection
    
    arInp = Array(3, 7, 5, 9, 5, 4, 7)
    For i = 0 To UBound(arInp)
        ' Словарь
        dict(arInp(i)) = Empty
        
        ' Коллекия
        On Error Resume Next
        coll.Add Empty, CStr(arInp(i))
    Next
    
    arOut = dict.keys
    For i = 0 To UBound(arOut)
        Debug.Print arOut(i)
    Next
    
    Debug.Print "--- А теперь тоже самое с помощью коллекции (вот тебе и уникальные числа те же самые) ---"
    
    Dim collKeys() As String
    collKeys = collAllKeys(coll)
    For i = 0 To UBound(collKeys)
        Debug.Print collKeys(i)
    Next
End Sub
 
Private Sub Form_Load()
    afdsfsadf
End Sub



Добавлено через 2 минуты
Коллекция может всё! Коллекция может всё тоже самое, что и твои словари, плюс ещё и сортировка даже, я говорил уже об этом, но ты скептически к этому отнёсся. Но это уже я в отдельную тему вынес, если кому интересно: Как отсортировать коллекцию на VB6?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
22.02.2025, 21:53
Цитата Сообщение от HackerVlad Посмотреть сообщение
Коллекция может всё! Коллекция может всё тоже самое, что и твои словари, плюс ещё и сортировка даже, я говорил уже об этом, но ты скептически к этому отнёсся.
Коллекция - это двоичное красно-черное дерево, а словарь - это хэш-таблица. Вот и смотри чем отличаются эти структуры данных и их достоинства и недостатки. В хэш таблице доступ к элементам и их добавление в большинстве случаев быстрее.
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
14.03.2025, 16:13  [ТС]
Проблемка...
Как в цикле перебрать дочерние формы?
Делаю типа:
Visual Basic
1
2
3
4
5
6
7
Dim qq As Form
 
            For Each qq In Forms
 
'\\\
 
            Next qq
Нифига оно не хочет их перебирать. Видит только материнскую MDIФорму.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.03.2025, 17:55
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
Как в цикле перебрать дочерние формы?
Кстати этот вопрос тут: Перебор открытых дочерних форм

Добавлено через 3 минуты
MrRoxMJ, и ещё вот здесь посмотри я нашёл: http://bbs.vbstreets.ru/viewtopic.php?f=1&t=14991 может там ответ будет
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
14.03.2025, 18:43  [ТС]
хм) поэкспериментировал с вариантами кода...
For Each qq In Forms и For i = 0 To VB.Forms.Count-1 оказывается оба рабочие, но выяснилось, что подсчитывают только видимые на экране дочки.
А у меня то материнская форма запускается пустая и дочки (в данном примере их две, скрыты и вызываются кнопками, так то их будет больше),не вызывать же их всех на экран для пересчёта. Возможно ли как-то обратиться к структуре проекта типа: For Each qq In Project1.Forms , ведь дочки не динамические и по факту уже добавлены в проект.

Это нужно лишь для одного:
В сабе загрузки материнской формы считывается файл config.txt, в котором каждая строчка - это ИмяФормы,Left,Top,Width,Height.
Далее в цикле перебираются все формы и им назначаются "стартовые параметры".
А сабе закрытия материнской формы - обратный процесс: перебираются все формы и перезаписывается файл (возможно пользователь двигал окошки, и их параметры изменились).
Таким образом при последующем запуске программа запоминает последние позиции и состояния окошек.

Можно конечно данные с конфига погрузить в массив и уже в процессе присваивать конкретной форме параметры в момент её вызова на экран... (таким образом мы заменяем процесс перебора форм перебором массива, сравнивая имя текущей формы с записями массива).
Но проще было бы конечно подготовить все окошки сразу в момент запуска программы, чем перебирать массив каждый раз при открытии любой формы.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
14.03.2025, 21:14
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
Но проще было бы конечно подготовить все окошки сразу в момент запуска программы, чем перебирать массив каждый раз при открытии любой формы.
А как ты собираешься обращаться к несуществующей форме? Правильно как раз в момент создания дочерней формы применять к ней параметры, а сохранять при уничтожении. Если нужно сохранять только положения окон достаточно создать всего 1 функцию для загрузки параметров и 1 функцию для сохранения.
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
17.03.2025, 07:28  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
А как ты собираешься обращаться к несуществующей форме?
С другой стороны, ведь если в сабе загрузки матери сделать например строчку - Form2.Left = 2000, оно же перемещает дочернюю form2 в нужную позицию, хотя form2 в этот момент не отображается на экране.
Форма же существует. Я ж говорю, это не динамическая форма, и уже добавлена в проект на этапе создания интерфейса.
То есть если напрямую по имени оно дочернюю форму полюбому видит и перемещает, а в цикле For Each qq In Forms видит только отображаемые на экране. Странно...
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
17.03.2025, 11:31
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
если в сабе загрузки матери сделать например строчку - Form2.Left = 2000, оно же перемещает дочернюю form2 в нужную позицию, хотя form2 в этот момент не отображается на экране
Да, любое обращение к свойствам формы приводит к загрузке этой формы
0
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,507
Записей в блоге: 1
17.03.2025, 14:31
Цитата Сообщение от HackerVlad Посмотреть сообщение
приводит к загрузке этой формы
или, по иному говоря, к инициализации com-объекта этой формы. Точно также происходит с любыми объектами, объявленными как "As New"
Visual Basic
1
Dim Coll As New Collection
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
17.03.2025, 16:55
Цитата Сообщение от HackerVlad Посмотреть сообщение
Да, любое обращение к свойствам формы приводит к загрузке этой формы
Цитата Сообщение от testuser2 Посмотреть сообщение
или, по иному говоря, к инициализации com-объекта этой формы. Точно также происходит с любыми объектами, объявленными как "As New"
Нужно разделять свойства окна, от свойств COM объекта. При доступе к свойствам COM объекта никакой загрузки формы не происходит. Аналогично можно выгрузить форму, а COM объект будет жив и к нему можно обращаться, но стоит только обратится к свойству окна - он опять будет загружен. В этом отличие событий Initialize/Terminate от Load/Unload.

Добавлено через 3 минуты
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
С другой стороны, ведь если в сабе загрузки матери сделать например строчку - Form2.Left = 2000, оно же перемещает дочернюю form2 в нужную позицию, хотя form2 в этот момент не отображается на экране.
Форма же существует. Я ж говорю, это не динамическая форма, и уже добавлена в проект на этапе создания интерфейса.
То есть если напрямую по имени оно дочернюю форму полюбому видит и перемещает, а в цикле For Each qq In Forms видит только отображаемые на экране. Странно...
Все формы являются объектами с PredeclaredId. Т.е. считай что у тебя есть скрытый стандартный модуль с объявленными переменными Public Form1 As New Form1 и др. Ты можешь без загрузки формы создать Property у формы и обращаться к нему без загрузки самого окна.
1
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
19.03.2025, 16:04  [ТС]
Во, кажись я это поборол таки))
Универсального кода, который бы работал независимо от количества форм в проекте смастерить не получилось (причины описаны выше). Решил вопрос более топорным методом. Единственный недостаток - в модуле нужно не забывать поправлять константу Z согласно количеству форм. Ну то есть на динамические формы я это точно не затачивал.

Имеется "референсный" файл конфига (в нём хранятся параметры форм "по умолчанию")
и пользовательский файл конфига - он перезаписывается при выходе из программы. Если этот файл отсутствует или повреждён, параметры считываются с референсного конфига. При многопользовательской работе в программе (запуск программы из расшареной сетевой папки по ярлыкам с пользовательских машин) рекомендую для этого пользовательского файла конфига поменять путь на локальную папку типа "C:\Program files", тогда настройки окон будут для каждого пользователя (рабочего места) индивидуальны.

Архив проекта в аттаче.
Допускаю, что код не идеален, гуру наверняка смогут ещё там причесать барсика и оптимизировать))


-----------------
У меня остался только один трабл:
Когда Sizable дочка раскрывается в Maximized состояние, она закрывает собой другие окошки, которые, например, с Fixed границами (В данном примере Form2 накрывает Form1). Это капец как неудобно (для удобства тогда ещё вкладки смастерить надо..). Я попробовал сделать Form1 поверх Form2 - (закоменченые строки в коде) да, это то что нужно. В моём планируемом проекте на базе этого только одна дочерняя форма будет разворачиваться на полный экран. И только ради этой формы добавлять для всех остальных форм код чтобы были ПОВЕРХ...? Не лучшее решение.

Как сделать, чтобы MDIChild форма была ВСЕГДА ВНИЗУ всех остальных форм?

Гуглил интернет - там везде TOPMOST примеры. А мне наоборот надо)))))))
Искал по ключевым словам "Lower most" "Most Under" ...не умею наверно искать))

Быть может в строчке
Visual Basic
1
Public Const GWW_HWNDPARENT = -8
значение поменять только на какое другое нужно, чтобы окошко навсегда вниз ушло?
Вложения
Тип файла: zip MDIзаготовка.zip (6.9 Кб, 5 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
20.03.2025, 02:39
При клике на любое окно это окно автоматически становится окном верхнего уровня
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
форма была ВСЕГДА ВНИЗУ всех остальных форм?
Не бывает окон, которые всегда снизу))) что за глупости))
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
27.03.2025, 08:32  [ТС]
Друзья, а вот такой ещё вопрос вдогонку.
Возникла идея - Что если использовать меню материнской формы как полосу вкладок дочерних окон?

Я знаю, что если дочка имеет собственное меню, то оно заменяет меню матери.
Предположим, я НЕ буду использовать в дочках их меню. Полоса меню будет только в MDI форме

Есть ли некая такая команда, типа:
MDIMother.Menu.Add (Form1.Name)
?
То есть при открытии она добавляет в строку меню матери пункт со своим именем.
А команда этого пункта меню - перевод фокуса на эту дочку.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
01.04.2025, 15:55
MrRoxMJ, да, я думаю это возможно! разобрался с этим уже? рассказывай.
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
01.04.2025, 17:53  [ТС]
С меню не вышло.
Сделал на Toolbar (компонента из Common Controls 6 или 5). С динамическим добавлением и удалением кнопок в полосе этого бара.
Позже если не забуду, прикреплю сюда то что получилось (сейчас у меня с собой нет).
Выглядит.... ну такое себе. Кнопки очень ограничены в плане дизайна. С ImageList даже уже заморачиваться не стал. Выделение "вкладки текущего окна" путём enabled-disabled.
Плюс надо ещё допиливать момент с обновлением состояния кнопок тулбара в случае когда пользователь переключает окна не по кнопкам, а непосредственно по окнам в клиентской области родительского окна.
...В общем я поглядел, мне это не понравилось, ...и я полностью пересобрал весь проект в VS10 на VB.NET
Там конечно тоже своих недостатков хватает, но понравилось, что в MDI проекте менюха для дочерних окон идёт, что называется, "прямо из коробки". Да и как-то поприятней всё выглядит))
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
01.04.2025, 17:56
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
А команда этого пункта меню - перевод фокуса на эту дочку.
WindowList же галочка.
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 72
02.04.2025, 07:50  [ТС]
ой, а ведь и правда
Жаль видимо нет возможности перебора этого windowlist (...ну у меня такое не получилось), типа:
MDIMother.Mnu1.Windowlist(0) = ...
Тогда можно было бы с ним сотворить всякое, например попробовать "раскидать" в строку вкладок/динамических кнопок.
Вложения
Тип файла: zip ВКЛАДКИ (Toolbar).zip (4.6 Кб, 2 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.04.2025, 07:50
Помогаю со студенческими работами здесь

Проектирование форм окон
Дали на самостоятельное изучение, ничего не объяснили. Помогите пожалуйста! Задача; В двух массивах хранятся индивидуальные коды и...

Ограничение инстансов Swing окон
Добрый день, уважаемые коллеги :senor: Не подскажите, как в Swing ограничить кол-во создаваемых инстансов окон, например до 5? ...

Ограничение разворота всех окон
Я не знаю, как это правильно называется. Прошу помочь, как сделать так, чтобы все окна разворачиваясь на весь экран, оставляли внизу...

Ограничение раскрывания окон программ
День добрый всем. Подскажите, как можно замутить такую фишку? Есть программка, представляющая собой вытянутую по верху экрана форму. Как...

Визуальный стиль окон форм
Здравствуйте! Задача: В предшествующих версиях Visual Studio было достаточно трудно заставить приложения отображать их элементы...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru