Добрый день!
Во-первых, применять сортировку для того, чтобы увидеть изменения карты, выполненные в другом ПО, - это жестоко.
Следует понимать, что карта, открываемая одновременно в двух или более программах, - это по сути многопользовательский доступ.
Для корректной работы с картами в многопользовательском доступе должен применяться ГИС Сервер, который единственный открывает карту в монопольном режиме, а все остальные обращаются к ГИС Серверу.
Когда Вы открываете карту в нескольких приложениях как файл (не используя ГИС Сервер), то разделение доступа будет на уровне файла и будет регулироваться операционной системой. Такой совместный доступ чреват разными сюрпризами.
Попробуйте, например, один и тот же файл Word или Excel одновременно открыть более одного раза.
Кроме того не все форматы карт поддерживают возможность такой работы. Например, карты формата SITX нельзя редактировать ни в одном приложении, кроме первого, в котором она была отрыта. Остальные смогут открыть эту карту только на чтение.
Для синхронизации данных в памяти и на диске предназначен метод TMapView.AdjustData.
В вашем случае одно приложение меняет данные и сохраняет их на диск, из-за чего данные, открытые во втором приложении становятся рассинхронизированными с данными на диске.
Вызов этого метода во втором приложении должен помочь.
Сортировка карты выполняет полное пересоздание карты, при котором удаляются старые копии отредактированных объектов, перестраиваются индексы, выполняются различные контроли данных, очищается журнал транзакций и т.д., что при больших объемах данных может приводить к значительным задержкам. В процессе выполнения сортировки никакие другие операции с картой невозможны. После сортировки открытые данные будут автоматически подменены на вновь сформированную карту.
Сортировка, выполняемая из одного приложения, приведет к рассинхронизации данных в других приложениях, если эта же карта там тоже была открыта. То есть в них придется также вызывать TMapView.AdjustData, так что принудительно синхронизировать данные всё равно придется.
Когда делать сортировку - решать Вам.
Ее надо периодически выполнять для карт, в которых помногу и часто изменяются данные, но точно не при каждом изменении.
Во-вторых, сортировка с вызовом диалога выполняется только методом TMapView.MapSortDialog. Остальные методы (MapSort и MapSortProcess) работают без диалога, внутри они вызывают MAPAPI фукнкцию
Цитата |
---|
//--------------------------------------------------------------------------- // Сортировка всех карт, входящих в документ // hmap - идентификатор сортируемого документа // handle - идентификатор окна диалога процесса обработки (HWND) // mode - комбинация флагов способа обработки карты: // 0 - сортировать все листы, // 1 - только несортированные; // 2 - сохранять файлы отката; // 4 - повысить точность хранения в метрах, число знаков максимальное; // 16 - повысить точность хранения в метрах, формат - см (2 знака); // 32 - повысить точность хранения в метрах, формат - мм (3 знака); // 64 - повысить точность хранения в радианах, число знаков максимальное; // При ошибке возвращает ноль //---------------------------------------------------------------------------
function MapSortProcess(HMap : HMap;Handle : HMessage; mode : integer) : integer; stdcall external sGisVecex; |
При необходимости можно воспользоваться более "продвинутыми" функциями:
Цитата |
---|
// Сортировка отдельной карты документа // mapname - сортируемая карта // flags - Флажки обработки карты : // 0 - сортировать все листы, // 1 - только несортированные, // 2 - сохранять файлы отката, // 4 - повысить точность хранения, формат - мкм // 8 - нормальная точность хранения (FLOAT). // 16 - повысить точность хранения, формат - см // 32 - повысить точность хранения, формат - мм // 64 - повысить точность хранения, формат - радианы // 128 - формировать мультиконтура для объектов с флагом мультиконтурный // handle - идентификатор окна, которому посылаются сообщения WM_OBJECT и WM_ERROR, // если не задан параметр hEvent // hEvent - адрес функции обратного вызова для уведомления о проценте выполнения, // если параметр не задан, то посылаются сообщения WM_OBJECT и WM_ERROR // eventparam - параметр, передаваемый функции обратного вызова // outpath - буфер для записи пути к папке, куда сохранили отсортированную карту, // если задан этот параметр, то исходная карта не обновляется, // папка создается автоматически в программе сортировки // size - длина буфера в байтах // format - управление форматом карты : // 0 - не менять, // 1 - установить формат SITX (на входе может быть SIT или MAP с одним листом), // 2 - упаковать карту в формат SITZ\MAPZ, точность - см, // -1 - установить формат SIT (на входе может быть SITX или MAP с одним листом), // code - управление шифрованием карты : // 0 - не менять, // 1 - шифровать данные с помощью пароля из параметра password (формат SITX), // -1 - снять шифрование данных // password - пароль для шифрования данных, когда code = 1, или 0 // Если карта отсортирована успешно - возвращает 1 // Если карта уже отсортирована - возвращает 2 // Если оператор прервал операцию - возвращает -1 // Если карта не доступна на редактирование - возвращает -2 // При ошибке возвращает ноль
function MapSortingWithEventPro(const mapname : PWCHAR; flags : integer; handle : HMESSAGE; hEvent : TEVENTCALL; eventparam : Pointer; outpath : PWCHAR; size : integer; format : integer; code : integer; const password : PWCHAR) : integer; stdcall external sGisAcces;
function MapSortingSitePro(aMap : HMAP; aSite : HSITE; flags : integer; handle : HMESSAGE; format : integer; code : integer; const password : PWCHAR) : integer; stdcall external sGisAcces;
function MapSortingWithEventUn(const mapname : PWCHAR; flags : integer; handle : HMESSAGE; hEvent : TEVENTCALL; eventparam : Pointer; outpath : PWCHAR; size : integer) : integer; stdcall external sGisAcces; |