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

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

21.02.2025, 12:18. Показов 6780. Ответов 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
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
22.02.2025, 12:55
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
WM_LBUTTONUP = &H202 Работает, но как и подтвердилось описанием, только над клиентской областью окна. На заголовок не хочет.
Клиентская область это внутреннее окно, нужно хукать основное, чтобы ловить WM_NCLBUTTONUP над заголовком основного окна. Но, я, кстати заметил, что над панелью WM_NCLBUTTONUP не ловится если отслеживать основное окно. Может быть в варианте Влада, по другому, потому что у него панель в коде регистрируется как дочернее окно MDI-формы
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.02.2025, 12:58
Цитата Сообщение от testuser2 Посмотреть сообщение
Может быть в варианте Влада, по другому, потому что у него панель в коде регистрируется как дочернее окно MDI-формы
В моём вариант SetParent необходим конечно, там без него никак просто
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
22.02.2025, 13:00
HackerVlad, я пробовал твою фишку со смещением клиентской области применить в изначальном коде, но в итоге дочерние формы не стали появляться, но ты реально сложняк какой-то запилил )
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
22.02.2025, 13:06
Чтобы не было подглючиваний нужно либо ограничивать перемещение курсора, либо обрабатывать WM_WINDOWPOSCHANGING.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.02.2025, 13:10
Цитата Сообщение от testuser2 Посмотреть сообщение
но ты реально сложняк какой-то запилил
Ну я описал все координаты чтобы красивенько выглядело, в изначальном варианте можно например наблюдать некрасивость где три пикселя снизу просвечивается в боковой панели...
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
22.02.2025, 13:12
Цитата Сообщение от MrRoxMJ Посмотреть сообщение
Не до конца понимаю как эта магия работает
Я сам не до конца понимаю, как работает оконная подсистема, кто бы объяснил на пальцах. Но в частности в данном случае когда вызывается функция WndProc с сообщением WM_WINDOWPOSCHANGING, это значит произошло событие изменения позиции окна, и при таком событии в параметр lParam должен прийти указатель на структуру WINDOWPOS. Если в этой структуре поменять какой-то параметр, то это повлияет на отображение окна. Для этого сначала мы копируем эту структуру в переменную xy (в моем примере WndPos), в ней есть координаты окна. Проверяем эти координаты, при необходимости меняем на нужные и копируем переменную xy обратно в структуру (по указателю lParam).
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.02.2025, 13:26
Цитата Сообщение от testuser2 Посмотреть сообщение
WM_WINDOWPOSCHANGING, это значит произошло
Ещё не произошло, но вот-вот произойдёт если ты не отменишь. Уже произошло это WM_WINDOWPOSCHANGED

Добавлено через 7 минут
Цитата Сообщение от testuser2 Посмотреть сообщение
но в итоге дочерние формы не стали появляться
странно
а ты пробовал вызывать .Show

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
работает отлично, и класс Трика великолепен, но мне не нравится там необходимость дублирования кода
да я просто не знаю как классом Трика сразу весь список форм обрабатывать сообщения...
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
22.02.2025, 13:44
Цитата Сообщение от HackerVlad Посмотреть сообщение
а ты пробовал вызывать .Show
Просто лень было уже что-то пробовать, наверное что-то упустил.
Цитата Сообщение от HackerVlad Посмотреть сообщение
да я просто не знаю как классом Трика сразу весь список форм обрабатывать сообщения...
Дык, использовать словарь. Dictionary как буд-то бы из внешней библиотеки, но эта библа стандартная и есть во всех виндах - scrrun.dll (Microsoft Scription Runtime), так что ни каких проблем с ней не будет, в VBA постоянно используется.
В словаре сохраняешь ID хука с ключем - hWnd. Но можно, конечно id каждого хука в свойстве формы хранить и не использовать словарь.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.02.2025, 13:57
Цитата Сообщение от testuser2 Посмотреть сообщение
Дык, использовать словарь. Dictionary
Ты опять мне свои словари толдычишь, когда я уже написал ТАКОЙ ЖЕ САМЫЙ вариант с использованием коллекции без зависимости от TLB

Добавлено через 4 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
Но можно, конечно id каждого хука в свойстве формы хранить и не использовать словарь.
Тут сразу вспомнилось кастомное свойство любого объекта Tag - это всё что хочешь, типа data в html5
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,673
Записей в блоге: 2
22.02.2025, 14:11
Цитата Сообщение от HackerVlad Посмотреть сообщение
ТАКОЙ ЖЕ САМЫЙ вариант с использованием коллекции без зависимости от TLB
Потому что коллекции вообще редко кто юзает в vba например, в основном слвари, они удобней там удаление по ключу, там .Existing(), там любые ключи, не только строковые, в общем словарь лучше. Чем использовать каждый раз cStr() и создавать и уничтожать в "куче" временный экземпляр bstr-строки, чтобы получить значение итема, это какое-то лишнее не правильное действие и мне оно, в частности, не нравится.

Добавлено через 1 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
Но можно, конечно id каждого хука
Я ошибся, словарь всте-таки нужен здесь
Цитата Сообщение от testuser2 Посмотреть сообщение
WinProc = CallWindowProc(Hooks(hWnd), hWnd, Msg, wParam, lParam)
Добавлено через 4 минуты
Ну тут, учитывая небольшое количество окно использовать вместо словаря, конечно массив, тупо поиск по массиву
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.02.2025, 14:12
Я вообще всегда пользовался простыми массивами для списков, пока не познакомился с коллекциями
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
22.02.2025, 14:13
Лучший ответ Сообщение было отмечено HackerVlad как решение

Решение

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
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
Option Explicit
 
Private Type WINDOWPOS
    hwnd            As Long
    hWndInsertAfter As Long
    x               As Long
    y               As Long
    cx              As Long
    cy              As Long
    flags           As Long
End Type
 
Private Declare Function FindWindowEx Lib "user32" _
                         Alias "FindWindowExW" ( _
                         ByVal hWndParent As Long, _
                         ByVal hWndChildAfter As Long, _
                         ByVal lpClassName As Long, _
                         ByVal lpWindowName As Long) As Long
Private Declare Sub memcpy Lib "kernel32" _
                    Alias "RtlMoveMemory" ( _
                    ByRef Destination As Any, _
                    ByRef Source As Any, _
                    ByVal Length As Long)
                    
Private Const WM_MDIGETACTIVE         As Long = &H229
Private Const WM_WINDOWPOSCHANGING    As Long = &H46
Private Const SWP_NOMOVE              As Long = &H2
 
Private WithEvents m_cHookChild As CTrickSubclass
Private WithEvents m_cHook      As CTrickSubclass
 
Private m_hCurWnd   As OLE_HANDLE
 
Private Sub m_cHook_WndProc( _
            ByVal hwnd As OLE_HANDLE, _
            ByVal lMsg As Long, _
            ByVal wParam As Long, _
            ByVal lParam As Long, _
            ByRef lRet As Long, _
            ByRef bDefCall As Boolean)
 
    Select Case lMsg
    Case WM_MDIGETACTIVE
        
        hwnd = m_cHook.CallDef(hwnd, lMsg, wParam, lParam, False)
        
        If hwnd <> m_hCurWnd Then
            m_cHookChild.Hook hwnd
            m_hCurWnd = hwnd
        End If
        
        lRet = hwnd
        bDefCall = False
        
    End Select
 
End Sub
 
Private Sub m_cHookChild_WndProc( _
            ByVal hwnd As OLE_HANDLE, _
            ByVal lMsg As Long, _
            ByVal wParam As Long, _
            ByVal lParam As Long, _
            ByRef lRet As Long, _
            ByRef bDefCall As Boolean)
    Dim tWndPos As WINDOWPOS
    
    Select Case lMsg
    Case WM_WINDOWPOSCHANGING
        
        memcpy tWndPos, ByVal lParam, Len(tWndPos)
        
        If (tWndPos.flags And SWP_NOMOVE) = 0 Then
            
            If tWndPos.x < 0 Then
                tWndPos.x = 0
                memcpy ByVal lParam, tWndPos, Len(tWndPos)
            End If
            
            bDefCall = False
        
        End If
        
    End Select
    
End Sub
 
Private Sub MDIForm_Load()
    Dim frm As Form
    Dim i As Long
    
    Set m_cHook = New CTrickSubclass
    Set m_cHookChild = New CTrickSubclass
    
    m_cHook.Hook FindWindowEx(Me.hwnd, 0, StrPtr("MDICLIENT"), 0)
    
    For i = 0 To 15
    
        If Rnd > 0.5 Then
            Set frm = New Form1
        Else
            Set frm = New Form2
        End If
        
        frm.Visible = True
        
    Next
    
End Sub
 
Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    m_cHook.Unhook
    m_cHookChild.Unhook
End Sub
С панелью ничего мудрить не нужно, добавить либо тулбар, либо пикчербокс с установленным свойством Align (аналогично и для тулбара).
Вложения
Тип файла: rar MDI_test.rar (6.2 Кб, 10 просмотров)
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.02.2025, 14:48
Единственная сложность массивов это удалять строчки, если это не последняя и не первая строчка то довольно большой скрипт получается для удаления строк "из середины" массива...

Добавлено через 33 минуты
Цитата Сообщение от The trick Посмотреть сообщение
С панелью ничего мудрить не нужно, добавить либо тулбар, либо пикчербокс с установленным свойством Align (аналогично и для тулбара).
Молодец, жаль никто не додумался до этого раньше)

Добавлено через 40 секунд
Я даже и не знал что так можно, пробовал выставлять элементы любые на MDI форме были только ошибки и ничего не получалось...
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
22.02.2025, 14:56
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я даже и не знал что так можно, пробовал выставлять элементы любые на MDI форме были только ошибки и ничего не получалось...
Справку читать нужно.
Миниатюры
Ограничение зоны перетаскивания форм/окон  
1
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
22.02.2025, 15:38  [ТС]
добавить либо тулбар, либо пикчербокс с установленным свойством Align
Название: zz.jpg
Просмотров: 96

Размер: 7.9 Кб
Реально откровение и для меня!)))) Спасибо, The trick.
После первых тщетных попыток закинуть на MDI форму каких либо контролов типа фрейма или кнопки понял что туда вообще ничего нельзя поместить кроме дочерних форм.
Сейчас как раз сидел думал как бы поженить скроллбары с панелькой. Они когда появляются улезают под панельку, а при ресайзе наоборот. И тут вдруг узнаю про чудесную штуку - в VB6 это предусмотрено прямо в стоке! И ничего не надо допиливать! ...Ну почти ничего))
И ведь она ещё и сдвигает дочерние окна, у которых стартовые координаты 0:0 вправо, чтобы не заслонять собой. + Бонусом фича пикчербокса - на фон панельки можно картинку даже поставить.
Окей, перевожу панельку на пикчербокс))
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.02.2025, 16:34
Я сначала подумал что ВАУ код The trick'а совершенный, но оказалось не так. Всё же один глюк прям сразу видно, когда распахиваешь MDI форму во весь экран то с левого края появляется граница окна, которой не должно быть. А у меня в моём коде такого глюка нет.

Добавлено через 3 минуты
Это некрасиво, и это особенно будет заметно, если у пользователя жирные границы окон, как у меня в семёрке.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.02.2025, 16:36
Чтобы Вы понимали о чём я говорю...
Миниатюры
Ограничение зоны перетаскивания форм/окон  
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
22.02.2025, 18:12
Этот глюк лечится, скорее всего, моими магическими числами)

Добавлено через 1 минуту
Там вся фишка в том, что во время разворачивания формы не надо применять код ограничения передвижения формы.

Добавлено через 50 минут
Да, как я и думал, этот глюк лечится моими магическими числами, поменяйте событие m_cHookChild_WndProc:

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
Private Sub m_cHookChild_WndProc( _
            ByVal hWnd As OLE_HANDLE, _
            ByVal lMsg As Long, _
            ByVal wParam As Long, _
            ByVal lParam As Long, _
            ByRef lRet As Long, _
            ByRef bDefCall As Boolean)
    Dim tWndPos As WINDOWPOS
    
    Select Case lMsg
    Case WM_WINDOWPOSCHANGING
        
        memcpy tWndPos, ByVal lParam, Len(tWndPos)
                  
        If tWndPos.flags = &H214 Then
            If tWndPos.x < 0 Then
                tWndPos.x = 0
                memcpy ByVal lParam, tWndPos, Len(tWndPos)
            End If
            
            bDefCall = False
        End If
        If tWndPos.flags = &H1 Then
            If tWndPos.x < 0 Then
                tWndPos.x = 0
                memcpy ByVal lParam, tWndPos, Len(tWndPos)
            End If
            
            bDefCall = False
        End If
        If tWndPos.flags = &H1000214 Then
            If tWndPos.x < 0 Then
                tWndPos.x = 0
                memcpy ByVal lParam, tWndPos, Len(tWndPos)
            End If
            
            bDefCall = False
        End If
        If tWndPos.flags = &H205 Then
            If tWndPos.x < 0 Then
                tWndPos.x = 0
                memcpy ByVal lParam, tWndPos, Len(tWndPos)
            End If
            
            bDefCall = False
        End If
    End Select
End Sub
Теперь глюков не будет в коде трика. Кстати отменять действие через bDefCall = False тоже не обязательно, так как CopyMemory записи структуры в данном случае и так отменяет действие.

Добавлено через 26 минут
testuser2, а в VBA нету коллекций? Там только словари?
1
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
22.02.2025, 18:18
Цитата Сообщение от HackerVlad Посмотреть сообщение
магическими числами
Этот код вообще не нужно использовать.
Нужно всего лишь тестировать состояние If (tWndPos.flags And SWP_NOMOVE) = 0 And IsZoomed(hwnd) = 0 Then

Цитата Сообщение от HackerVlad Посмотреть сообщение
Теперь глюков не будет в коде трика. Кстати отменять действие через bDefCall = False тоже не обязательно, так как CopyMemory записи структуры в данном случае и так отменяет действие.
Ничего подобного:
For a window with the WS_OVERLAPPED or WS_THICKFRAME style, the DefWindowProc function sends the WM_GETMINMAXINFO message to the window. This is done to validate the new size and position of the window and to enforce the CS_BYTEALIGNCLIENT and CS_BYTEALIGNWINDOW client styles. By not passing the WM_WINDOWPOSCHANGING message to the DefWindowProc function, an application can override these defaults.
0
3 / 3 / 0
Регистрация: 15.05.2015
Сообщений: 76
22.02.2025, 18:20  [ТС]
Пересобрал с пикчербоксом.

Есть засада. Объясните мне как обращаться к фреймам, если даже любое упоминание имени формы в "if" сразу делает её видимой? Экспериментирую с Form1.
Проблема проявляется так: если закрыть форму кнопкой "крестика", то при дальнейшей попытке ресайза материнского окна форма1 сразу же появляется. Если же скрыть форму через "Form1.visible = false" (кнопка в панели), то можно ресайзить окно как угодно без выскакивающих форм, и после если вызвать Form1, она появится в правильном месте рабочего поля.
Я добавлял строку "Form1.visible = false" и в саб "Form_Unload", и в саб "OFF" - всё это бестолку, выскакивает зараза.

Это ж в дальнейшем в программе сколько обращений будет к формам, они ж постоянно все выпрыгивать будут?!
Это какая-то особенность MDIChild форм? Сколько ранее я делал программ где несколько форм (но обычных), с ними такой беды не замечал. Создал новый "голый" проект с MDIChild формами... обратился к свойству формы и она выскочила. ((
Вложения
Тип файла: zip 888.zip (5.2 Кб, 5 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2025, 18:20

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru