Цитата |
---|
Евгений Соболев написал: Так пытаюсь загрузить dll: HINSTANCE libinst=::LoadLibrary(L"gisu64forms.dll"); //не находит, пытался и так: |
Исходя из Вашего первого сообщения я сделал вывод, что проблема на этапе загрузки библиотеки.
На самом деле библиотека у Вас загружается нормально.
Проблема в том, что вызывается несуществующая функция.
Именно поэтому
Цитата |
---|
Евгений Соболев написал: при вызове функции mapLoadLibrary вначале gisu64forms.dll попадает в список dll приложения на несколько секунд, потом вываливается ошибка Library not found, и gisu64forms.dll пропадает из списка. |
Мы проверили Ваш пример на Qt 5.12.3 + MinGW 7.3.0 x64 - все работает без проблем.
Функции formSelectObject в GIS ToolKit 12 нет.
Вместо нее следует использовать функцию rscShowStatisticObject из библиотеки gisu64rsctools.dll:
Код |
---|
// Открыть диалог "Выбор объекта"
// hmap - идентификатор открытых данных
// parm - параметры задачи
// info - идентификатор объекта карты
// flag - флаг режима работы диалога
// 0 - ввод семантики при создании или редактировании объекта (включена опция
// "Вся семантика", отключены кнопки "Выбрать", "Вперед" и "Назад");
// 1 - просмотр, редактирование и выбор объекта карты
// При ошибке возвращает 0
long int WINAPI _export rscShowStatisticObject(HMAP hmap,
TASKPARMEX * parm, HOBJ info, long int flag); |
Это универсальный диалог, отображающий информацию как на конкретно выбранный объект, так и работающий со списком объектов. Но список надо держать вне этого диалога.
Для работы с этим диалогом требуется обработка следующих сообщений:
AW_MOVEDOC 0x656 - переместить карту в заданную точку
MT_MAPWINPORT 0x660 - обновить экран
MS_CHECKOBJECT 0x686 - проверка доступности переходов от текущего объекта вперед и назад
MS_NEXTOBJECT 0x67E - переход от текущего объекта вперед или назад
MS_ACTIVEOBJECT 0x67F - выбор объекта
Пример реализации можно посмотреть в MDIALOG.PAS в методе TObjByListCommonDlg.Charts:
Скрытый текст |
---|
Код |
---|
//============================================================
// Метод - обработчик сообщений посылаемых диалогом окну документа
//============================================================
procedure TObjByListCommonDlg.Charts(var ANotice: TMessage);
var
Origin : TPoint;
begin
case ANotice.Msg of
AW_MOVEDOC:
with PDoublePoint(ANotice.WParam)^do
begin
with MapView do Origin := Point(ClientWidth div 2, ClientHeight div 2);
MapView.GoPointInWindow(X, Y, TPPlace(ANotice.LParam-1), Origin.X, Origin.Y);
end;
MT_MAPWINPORT:
begin
if ANotice.LParam<>0 then InvalidateRect(MapView.Handle, nil, True);
MapView.Update;
end;
MS_CHECKOBJECT:
begin
if Assigned(MapFind)
then begin
// Есть "Вперед"?
if (ANotice.WParam = 0)
then begin
if MapFind.CheckNext
then ANotice.Result := 1
else ANotice.Result := 0;
end
// Есть "Назад"?
else begin
if MapFind.CheckPrior
then ANotice.Result := 1
else ANotice.Result := 0;
end;
end;
end;
MS_NEXTOBJECT:
begin
if Assigned(MapFind) and Assigned(MapFind.MapObj)
then begin
if FSetSelected
then MapFind.MapObj.Style:= FStoredView;
if ((ANotice.WParam = 0) and MapFind.Next) or
((ANotice.WParam = 1) and MapFind.Prior)
then ANotice.Result := 1
else ANotice.Result := 0;
if (ANotice.Result <> 0)
then begin
mapReadCopyObject(ANotice.LParam, MapFind.MapObj.ObjHandle);
if FSetSelected
then MapFind.MapObj.Style:= OS_SELECT;
if FSetCenter
then MapFind.MapObj.Center;
end;
end;
end;
MS_ACTIVEOBJECT:
if (Assigned(MapView)) and
(MapView.MapHandle <> 0) and
(Assigned(MapFind)) and
(Assigned(MapFind.MapObj))
then MapFind.MapObj.ObjHandle:= ANotice.LParam;
end;
end; |
|
Таким образом, подготовку нужного Вам списка объектов, например в виде результата поиска объектов в точке, в заданной области или любым другим способом, Вы осуществляете самостоятельно с помощью контекста поиска - HSelect, берете первый объект из найденных, отдаете в диалог и взаимодействуете с ним далее посредством обработчиков сообщений.
Также пока оставлена функция formCheckAndSelectObject (в gisu64forms.dll):
Код |
---|
// Выполнить поиск и обработку объекта карты в точке Position
// с предварительной проверкой наличия объекта в точке Position
// Выбранный объект доступен через переменную object
// object - адрес для размещения описания объекта
// place - применяемая система координат (геодезические
// координаты не обрабатываются)
// frame - прямоугольник поиска в соответствии с place,
// причем центр прямоугольника обязан совпадать с точкой,
// указанной в Position структуры OBJECTFORM
// Структура TASKPARM описана в maptype.h
// Если объект выбран - возвращается ненулевое значение
// Если объект не выбран (нет в данной точке или пользователь
// нажал "Cancel") - возвращается ноль
long int WINAPI formCheckAndSelectObject(HOBJ object,
MAPDFRAME* frame, long int place,
OBJECTFORM* objform, TASKPARM* taskparm); |
Библиотека gisu64forms.dll является устаревшей и оставлена пока для совместимости.
Вы можете использовать функции из нее, но я рекомендую сразу выполнить реализацию без ее использования.