Для некоторых классификаторов вызов функции mapPaintExampleSiteObject() или mapPaintExampleRscObject() иногда приводит к Exception в недрах DLL.
Это происходит если область (TRect) передана небольшая, и всегда при отрисовке точечного знака (код P0000XXXXX). Для каких-то классификаторов (знаков) ошибка возникает при высоте области меньше 33 пикселей, для каких-то меньше 40 пикселей. Видимо, дело в размере точечного знака.
Самое неприятное, что после такого exception иногда визуально меняется масштаб отображения открытой карты, при этом никаких событий об изменении масштаба не происходит и функции сообщающие текущий масштаб открытой карты показывают некорректное значение.
Пример такого классификатора в архиве приложил (Plan10000.rsc). Ошибка проявляется при запросе отрисовке изображения 32x32 пикселя (и меньше).
Ошибка проявляется и в последних версиях тулкита v.13.3.2.1 и в предыдущих (в 13.0 уже точно была). Скорее всего версия Delphi значения не имеет, но для полноты картины: Delphi 10.4, платформа Win32.
Илья Вдовин написал: Для некоторых классификаторов вызов функции mapPaintExampleSiteObject() или mapPaintExampleRscObject() иногда приводит к Exception в недрах DLL.
Уточните, пожалуйста, происходит Exception на карте или при работе с классификатором. Просьба прислать код объекта. Проверили на тестовых данных не повторяется проблема с зависанием. По возможности пришлите, пожалуйста, карту с указанием знака.
Exception происходит при вызове двух указанных функций. Считается ли это работой с картой или классификатором не очень понимаю как ответить. С самой картой я ничего не делаю в этот момент.
Приложил простой тестовый пример, который работает с одной из областных картой (OpenStreet), загруженных ранее с вашего сайта. Классификатор osm.rsc. Для этого классификатора Exception возникает для знаков с ObjectKey = "P0051671200" и "monument" при ViewType = VT_SCREEN. Для VT_PRINT, вроде, не возникает. Карта сама большая, если хотите проверить именно на той карте, которая у меня, то можно скачать её по ссылке: https://disk.yandex.ru/d/kIzV9xwqRdaUFw (но это карта без каких-то моих изменений). Пример карты с классификатором Plan10000.rsc прямо сейчас делать не очень удобно, но позже могу и его подготовить, там Exception происходит на десятках знаков.
Проблемы с зависанием никакой нет. Есть проблема какого-то некорректного обращения к адресу памяти внутри DLL тулкита из-за чего потом какие-то побочные проблемы вылазят при перерисовке открытой карты. Exception "видно" только если запускать под отладчиком, сам по себе он гасится внутри DLL.
Пример проявления ошибки при работе с классификатором plan10000.rsc. Для демонстрации создал пустую карту, нанёс на неё несколько точечных знаков. TMapRsc привязан к TMapView. В остальном пример аналогичен предыдущему. Карта с исходными кодами примера в приложенном архиве
Exception возникает также только в режиме VT_SCREEN с десятками знаков. Первые 10 кодов знаков, на которых вылетает ошибка, выписал: P0031531100; P0051462000; P0051571000; P0051463100; P0051571100; P0031632000; P0031638000; P0031639000; P0031650000; P0032430000
Ещё раз обращаю внимание на то, что при работе приложения Exception пользователю не виден, нужно запускать пример под отладчиком в режиме Debug.
Илья Вдовин написал: Проблемы с зависанием никакой нет. Есть проблема какого-то некорректного обращения к адресу памяти внутри DLL тулкита из-за чего потом какие-то побочные проблемы вылазят при перерисовке открытой карты.Exception "видно" только если запускать под отладчиком, сам по себе он гасится внутри DLL.
В программу будут внесены изменения. В ближайшее время обновим на нашем сайте. Дополнительно еще сообщим.
Илья Вдовин написал: Для некоторых классификаторов вызов функции mapPaintExampleSiteObject() или mapPaintExampleRscObject() иногда приводит к Exception в недрах DLL.
Уточните, пожалуйста, на счёт файла "mapproc.inc" - в последнем варианте тулкита он исчез, а без него код не компилируется. Пока взял из предыдущей версии и проблема с компиляцией решилась, но, вдруг, это не правильное решение.