На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Удаление листа многолистовой карты

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2
RSS
Удаление листа многолистовой карты, Не получается удалить лист из карты
 
Цитата
Артем пишет:
При попытке удалить файлы происходит ошибка - файл занят, при этом я только что закрыл его(mapCloseMap).
Есть ли способ заставить библиотеку освободить файл?

Если Вы в своей программе создали карту (файл) и закрыли ее, то освобождение доступа к файлу для удаления
может происходить только после завершения приложения, в котором создан файл (карта).

Чтобы удалить файл (карту) раньше, его нужно переоткрыть еще раз. Тогда он может быть удален без завершения приложения.

Если создавать временную карту (mapCreateTemp... и т.п.), то она будет удалена автоматически при закрытии.

Но скорее всего, что созданная карта не была закрыта.
Например, Вы выполнили команды mapCreateMap (создали карту), mapAppendData (добавили к mpt с повторным открытием), mapCloseMap (закрыли mpt
и уменьшили счетчик ссылок на открытую карту до 1).
Карта открывается 2 раза (счетчик ссылок равен 2) и остается в результате открытой (счетчик ссылок равен 1).
 
А как узнать значение счетчика ссылок?

Карта у меня открывается, подключается матрица высот. После я закрываю хандл карты.
 
Счетчик вам вряд ли будет доступен (это внутренняя кухня).
Если я правильно понял:
1. Открываем векторную карту - sit.
2. Добавляем к ней матрицу - mtw.
3. Закрываем карту
4. Удаляем что: файл матрицы или файл карты?
 
Удаление при выполнении следующих действий работает правильно

1. Открываем проект из двух карт sitx - mpt.
2. Добавляем к нему матрицу - mtw.
3. Закрываем проект
4. Удаляем файл mpt?

var
 sMapFileName : string;

procedure TForm1.btnOpenClick(Sender: TObject);
begin
// sMapFileName := ExtractFilePath(Application.ExeName) + 'military.sitx';
sMapFileName := ExtractFilePath(Application.ExeName) + 'military1.mpt';
mvMap.MapOpen(sMapFileName, true);
mvMap.MapMtrs.Append(ExtractFilePath(Application.ExeName) + 'new.mtw');
end;

procedure TForm1.BtnCloseClick(Sender: TObject);
begin
 mvMap.MapClose;
end;

procedure TForm1.btnDeleteClick(Sender: TObject);
var
 ii : boolean;
begin
ii := DeleteFile(sMapFileName);
if not ii
   then ShowMessage('Не удалось удалить файл ' + sMapFileName)
   else ShowMessage('Файл удален ' + sMapFileName);

end;
 
Обновил библиотеку до текущей версии - все заработало.

Спасибо за помощь.
 
Цитата
Andrey Gheleznyakov написал:
Написал тестовое приложение1. Открываю карту.2. Создаю объект.3. Закрываю карту.4. Удаляю карту.Все работает как часы. Ниже текст. А каков алгоритм работы у Вас?--------------------------------------------------var  sMapFileName : string;procedure TForm1.btnOpenClick(Sender: TObject);begin sMapFileName := ExtractFilePath(Application.ExeName) + 'military.sitx'; mvMap.MapOpen(sMapFileName, true);end;procedure TForm1.BtnCloseClick(Sender: TObject);begin  mvMap.MapClose;end;procedure TForm1.btnDeleteClick(Sender: TObject); var  ii : boolean;begin ii := DeleteFile(sMapFileName); if not ii    then ShowMessage('Не удалось удалить файл');end;procedure TForm1.btnCreateClick(Sender: TObject);begin  MapObj1.CreateObjectByExCode(0, KM_IDFLOAT2, 320000174, OL_SQUARE);  MapPoint1.PlaceInp := PP_PLANE;  MapPoint1.SetPoint(6196232, 7471608);  MapObj1.Metric.Append(0,MapPoint1.point);  MapPoint1.SetPoint(6197232, 7472608);  MapObj1.Metric.Append(0,MapPoint1.point);  MapPoint1.SetPoint(6196700, 7473608);  MapObj1.Metric.Append(0,MapPoint1.point);  MapPoint1.SetPoint(6196232, 7471608);  MapObj1.Metric.Append(0,MapPoint1.point);  MapObj1.Commit;  MapObj1.Center;end;
У меня таже проблема:

var
 Form1: TForm1;
 sMapFileName : string;

implementation

{$R *.dfm}

procedure TForm1.btnDeleteClick(Sender: TObject);
var
ii : boolean;
cDir : string;
bDir : string;
FSearch : TSearchRec;
begin

// Здесь все работает хорошо, в точности, как написано в контрольном примере выше.

cDir := ExtractFilePath(Application.ExeName) + 'Data\Map\*.*';
  If FindFirst(cDir, faAnyFile, FSearch) = 0 then
  begin
  repeat
  bDir := ExtractFilePath(Application.ExeName) + 'Data\Map\';
  sMapFileName := bDir+FSearch.Name;

  ShowMessage ('FileName = '+sMapFileName);

  ii := DeleteFile(sMapFileName);

  If not ii
  then ShowMessage('Не удалось удалить файл ' + sMapFileName)
  else ShowMessage('Файл удален ' + sMapFileName);

  ShowMessage ('ii = '+BoolToStr(ii));

  until FindNext(FSearch) <> 0;
  end;
 FindClose(FSearch);

// А вот здесь уже не работает. Не хочет удалять файлы в папке LOG !!! Что я не делаю не правильно?

cDir := ExtractFilePath(Application.ExeName) + 'Data\Map\LOG\*.*';
  If FindFirst(cDir, faAnyFile, FSearch) = 0 then
  begin
  repeat
  bDir := ExtractFilePath(Application.ExeName) + 'Data\Map\LOG';
  sMapFileName := bDir+FSearch.Name;

  ShowMessage ('FileName = '+sMapFileName);

  ii := DeleteFile(sMapFileName);

  If not ii
  then ShowMessage('Не удалось удалить файл ' + sMapFileName)
  else ShowMessage('Файл удален ' + sMapFileName);

  ShowMessage ('ii = '+BoolToStr(ii));

  until FindNext(FSearch) <> 0;
  end;
 FindClose(FSearch);

end;

procedure TForm1.btnOpenClick(Sender: TObject);
begin
sMapFileName := ExtractFilePath(Application.ExeName) + 'Data\Map\Map.sit';
mvMap.MapOpen(sMapFileName, true);
end;

procedure TForm1.btnCloseClick(Sender: TObject);
begin
mvMap.MapClose;
end;

end.
 
Ниже простой пример:
1. Вызвали MapOpenClick
2. Вызвали MapCloseClick
3. Вызвали DeleteClick

Все три файла успешно удалились.

Повторите данный пример.

Const
sMapFile = 'd:\DataTEst12\Noginsk_old\Noginsk.sitx';

procedure TForm3.DeleteClick(Sender: TObject);
var
ii : boolean;
cDir : string;
bDir : string;
sDF1, sDF2, sDF3  : string;
begin

 cDir := ExtractFilePath(sMapFile);
 sDF1 := cDir + 'LOG\Noginsk.sitx.log';
 sDF2 := cDir + 'LOG\Noginsk.sitx.TAC';
 sDF3 := cDir + 'LOG\Noginsk.sitx.TACX';

 ii := DeleteFile(sDF1);
       If not ii
          then ShowMessage('Не удалось удалить файл ' + sDF1)
          else ShowMessage('Файл удален ' + sDF1);

 ii := DeleteFile(sDF2);
       If not ii
          then ShowMessage('Не удалось удалить файл ' + sDF2)
          else ShowMessage('Файл удален ' + sDF2);

 ii := DeleteFile(sDF3);
       If not ii
          then ShowMessage('Не удалось удалить файл ' + sDF3)
          else ShowMessage('Файл удален ' + sDF3);
end;

procedure TForm3.MapCloseClick(Sender: TObject);
begin
MapView1.MapClose;
end;

procedure TForm3.MapOpenClick(Sender: TObject);
begin
  MapView1.MapOpen(sMapFile, true);
end;
 
Большое спасибо за ответ!

Да, так работает:

Const
sMapFile = 'd:\PRACTIKA\DeleteMap\Data\Map\Map.sit';

var
 Form1: TForm1;
 sMapFileName : string;

implementation

{$R *.dfm}

procedure TForm1.btnDeleteClick(Sender: TObject);
var
cDir : string;
bDir : string;
FSearch : TSearchRec;
begin
cDir := ExtractFilePath(Application.ExeName) + 'Data\Map\*.*';
If FindFirst(cDir, faAnyFile, FSearch) = 0 then
begin
repeat
bDir := ExtractFilePath(Application.ExeName) + 'Data\Map\';
sMapFileName := bDir+FSearch.Name;
DeleteFile(sMapFileName);
until FindNext(FSearch) <> 0;
end;
FindClose(FSearch);
RmDir(bDir);
end;

procedure TForm1.btnOpenClick(Sender: TObject);
begin
sMapFileName := ExtractFilePath(Application.ExeName) + 'Data\Map\Map.sit';
mvMap.MapOpen(sMapFileName, true);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
cDir : string;
sDF1, sDF2, sDF3, sDF4, sDF5, sDF6, sDF7, sDF8, sDF9  : string;
begin
cDir := ExtractFilePath(sMapFile);
sDF1 := cDir + 'LOG\Map.sit.log';
sDF2 := cDir + 'LOG\Map.sit.TAC';
sDF3 := cDir + 'LOG\Map.sit.TACX';
sDF4 := cDir + 'LOG\Map.^SD';
sDF5 := cDir + 'LOG\Map.^SG';
sDF6 := cDir + 'LOG\Map.^SH';
sDF7 := cDir + 'LOG\Map.^SS';
sDF8 := cDir + 'LOG\Map.sit.vclx';
sDF9 := cDir + 'LOG\Uzor.edt';
DeleteFile(sDF1);
DeleteFile(sDF2);
DeleteFile(sDF3);
DeleteFile(sDF4);
DeleteFile(sDF5);
DeleteFile(sDF6);
DeleteFile(sDF7);
DeleteFile(sDF8);
DeleteFile(sDF9);
cDir := cDir + 'LOG';
RmDir(cDir);
end;

procedure TForm1.btnCloseClick(Sender: TObject);
begin
mvMap.MapClose;
end;

Немного странновато выглядит код по удалению файлов из папки LOG,
в том плане, что отличается от более менее логично структурированного удаления файлов из папки Map.
Но ладно, главное работает!  Спасибо.
 
Пример странновато не выглядит. Он просто доказывает, что файлы удаляются. Если у вас не работает логика с поиском файлов,  образованием имен файлов, их закрытием и т.п., то это не вопрос про GIS ToolKit.
Страницы: Пред. 1 2
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности