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

Удаление объекта. Он не удаляется.

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Удаление объекта. Он не удаляется., удаляю всеми способами... все равно не удаляется.
 
Здравствуйте. Загуглил тему на форуме вашем. Не один из методов не заработал. А именно.
Код
procedure TMapPtPoint.deleteFromMap;
var
  mObj:TMapObj;
begin
  try
    if mapView = nil then exit;

    mObj := TMapObj.Create(nil);
    try
      mObj.MapView := mapView;
      mObj.SeekObject(mapView.MapName, objKey);
      mObj.Delete;
      mapView.MapSort(True, False);
// нерабочие варианты
//      mapView.Invalidate;
//      mapView.Update;
//      mapView.Invalidate;
//      mObj.Commit;
//      mObj.Repaint;
//      mObj.Destroy;


    finally
      FreeAndNil(mObj);
    end;

  except
    on e:Exception do AddErrInfo('TMapPtPoint.deleteFromMap: ', E);
  end;
end;
Что происходит. Удаляется точка. Но на экране она остается. После закрытия карты и открытия, точка исчезает. Я перепробовал все варианты, не работает.  Спасибо!

GTK версия 11.9.0       02.04.2013
Менять я так понял нельзя, т.к. там проект большой, могут слетить расчеты + GIT + куча всего.

Если это глюк конкретной версии и это не лечится. Спасибо поставлю перед фактом руководство.  
Изменено: Роман Перминов - 30.08.2017 11:32:09
 
Делать сортировку на каждое удаление объекта - это жестоко.
Сортировка выполняет физическую очистку объектов в файлах данных. При удалении объекта он физически не удаляется, а помечается как удаленный. Этого достаточно, далее система работает так, как если этого объекта нет вообще.
Сортировка - тяжелая операция по пересборке всей структуры карты. Периодически делать надо, но только периодически, а не на каждое удаление.

Далее. По коду ошибок не вижу.

У Вас mapView - это TMapView или TMapScreen?

У mapView случайно свойство Rendering не установлено в false?


Вот примерно такой код должен работать:

Код
procedure TMapPtPoint.deleteFromMap;
var
  mObj:TMapObj;
begin
  try
    if mapView = nil then exit;

    mObj := TMapObj.Create(nil);
    try
      mObj.MapView := mapView;
      if (mObj.SeekObject(mapView.MapName, objKey) = 1)
        then begin
          mObj.Delete;
          mapView.Repaint;
        end;
    finally
      FreeAndNil(mObj);
    end;

  except
    on e:Exception do AddErrInfo('TMapPtPoint.deleteFromMap: ', E);
  end;
end;


Не проверял на 11.9.0, но каких либо проблем при вызове перерисовки карты и в той версии быть не должно.

Repaint не отработает, если Rendering выключен.

Выполнять mObj.Repaint после удаления бесполезно - объекта уже нет, нет его габаритов, перерисовывать нечего.
 
Свойство rendering = true

Еще есть функция Paint она может блокировать перерисовку?

GPSMapView в классе TMainFrm является TMapView классом.
В примере в топике темы mapview тоже TMapView но в классе TMapPtPoint, он ссылается на GPSMapView.
Код
procedure TMainFrm.GPSMapViewMapPaint(Sender: TObject; aCanvas: TCanvas;
  MapPaintRect: TRect);
var
  centerXd, centerYd: Double;
  centerX, centerY: Integer;
begin
//    GPSMapView.PlaceOut := PP_PICTURE;
  if (isMapInCenterNavigate or isGetPointByMouseMode)and isPaintingCross then begin

    GPSPoint.PlaceOut := PP_PICTURE;
    GPSPoint.GetPoint(centerXd, centerYd);
    centerX := Trunc(centerXd);
    centerY := Trunc(centerYd);
//    centerX := GPSMapView.mapLeft + GPSMapView.Width div 2;
//    centerY := GPSMapView.mapTop + GPSMapView.Height div 2;

    aCanvas.Pen.Color := configApp.CrossHairColor;
    aCanvas.MoveTo(centerX-10, centerY);
    aCanvas.LineTo(centerX+10, centerY);
    aCanvas.MoveTo(centerX, centerY-10);
    aCanvas.LineTo(centerX, centerY+10);
  end;

end;
 
Цитата
Роман Перминов написал:
Еще есть функция Paint она может блокировать перерисовку?

Не должна.
Это, я так понимаю, обработчик события OnMapPaint.
Это событие генерируется после перерисовки участка карты с целью дать возможность перерисовать Вашу пользовательскую информацию поверх электронной карты.
То есть к тому моменту когда вызывается обработчик OnMapPaint карта уже перерисована.

Цитата
Роман Перминов написал:
В примере в топике темы mapview тоже TMapView но в классе TMapPtPoint, он ссылается на GPSMapView.
Мало что понял, но надеюсь, что речь идет об одном и том же компоненте TMapView - и к которому привязан TMapObj, удаляющий объект, и тот в котором Вы хотите увидеть обновленную карту.

В любом случае (даже если компоненты разные) метод Repaint компонента TMapView (а не TMapObj!) должен полностью перерисовать карту по обновленным данным.
Это железобетонный метод.
Повлиять на его работу может свойство Rendering.
Также может не позволить выполнить перерисовку карты перехват в приложении системных сообщений  типа WM_PAINT.

Рекомендованный мной выше код также не работает?
Код
mapView.Repaint;

- не помог?

Служба технической поддержки не проверяет работоспособность устаревших версий продуктов.
Не смотря на то, что срок технической поддержки, осуществляемой бесплатно, составляет год с момента приобретения продукта, мы не препятствуем Вам в получении обновлений, непосредственно скачивая их с нашего сайта, даже без продления техподдержки.
Поэтому претензии по функционированию принимаются в отношении крайних версий, доступных на сайте.
Мы не выпускаем "патчей" для каких-то определенных версий, а обновляем продукт целиком.

Цитата
Роман Перминов написал:
GTK версия 11.9.0       02.04.2013
Менять я так понял нельзя, т.к. там проект большой, могут слетить расчеты + GIT + куча всего.
Не вижу особых проблем, кроме, возможно донастройки GIT-а.
И то, не понятно, зачем Вы коммитите в GIT инструментарий? А компоненты Embarcadero или Borland Вы тоже скидываете в GIT?
Дело Ваше, но не смотря на это, Вы можете не под GIT-ом (даже на другой машине) проверить Ваш код на основесвежей версии GTK11.
Это позволит Вам ответить на Ваш вопрос относительно Вашей версии GTK:
Цитата
Роман Перминов написал:
Если это глюк конкретной версии и это не лечится. Спасибо поставлю перед фактом руководство.  
Хотя и в Вашей версии перерисовка после удаления объекта должна работать нормально.

Еще вариант проверки версии 11.9.0 - сделать на нем простой тест, где есть только MapView и MapObj и посмотреть, как там удаляется объект.
Если эффект повторяется, это будет говорить о том, что это происходит из-за некорректной работы GTK или даже среды разработки (которую Вы, кстати, не указали).
Иначе - причина где-то в коде Вашего сложного проекта.
 
О как много вы написали =)

1. Ваш код не работает. Даже при rendering = true;
2. Компонент TMapView просто мы получаем к нему доступ из разных объектов.
3. Мы не коммитим модули GTK в GIT просто на разных компах стоит одна и таже версия GTK и мы просто боимся, что если мы поменяем версию на одной машине. На другой не будет работать. + я понял организация когда-то давно у вас купила GTK Free. Но я на всякий случай подставлю библиотеки нового GTK и попробую как с ними будет работать программа.
4. По поводу техподдержки понятно что год. Вопрос был следующий. Выяснить правильность написания кода по части удаления объекта. В случае любого отрицательного ответа, искать причину в программе или обновлять до новой версии и искать уже в новой версии. Найти собутыльн... братьев по несчастью, поделиться опытом, готовым решением =)
5. Попробуем и такой вариант. Напишем простую программу.

В любом случае спасибо. Если причина выявится, дам знать.
 
Есть подозрение, что у вас в TMapObj указано - найденный объект выделять.
Убедитесь, что TMapObj.St yle = OS_NOVIEW. Иначе, не смотря на то, что в карте вы объект удалили, но все его характеристики TMapObj хранит и после Repaint может отображать.
 
Цитата
5. Попробуем и такой вариант. Напишем простую программу.

Предлагаю ещё проще вариант, переписать часть функции используя исключительно ядро ГТК, а не обёртки в виде компонент.
то есть убираем вот этот "слой" кода  ПРОГРАММА -> КОМПОНЕНТЫ ГТК  ->ядро ГИС
(чем сложнее система тем чаще падает)
Код
uses maptype, mapproc;

procedure TMapPtPoint.deleteFromMap(objKey : integer);
var
   Obj: HObj;
begin
  if Assigned(mapView) then
  begin
    Obj := mapCreateSiteObject(mapView.MapHandle, mapView.MapHandle);
    if mapSeekSiteObject(mapView.MapHandle, mapView.MapHandle, Obj, objKey) <>0 then
    try
      mapDeleteObject(Obj);
    except
      on e:Exception do AddErrInfo('TMapPtPoint.deleteFromMap: ', E);
    end;
    mapFreeObject(Obj);
    mapView.Repaint;
  end;
end;
Прошу учесть, если поиск выполняется не на основной карте а на подключеной пользовательской карте то код будет выглядеть вот так
Код
procedure TMapPtPoint.deleteFromMap(SiteIndex, objKey : integer);
var
   Obj: HObj;
begin
  if Assigned(mapView) then
  begin
    Obj := mapCreateSiteObject(mapView.MapHandle, mapView.MapSites[SiteIndex].SiteHandle);
    if mapSeekSiteObject(mapView.MapHandle, mapView.MapSites[SiteIndex].SiteHandle, Obj, objKey) <>0 then
    try
      mapDeleteObject(Obj);
    except
      on e:Exception do AddErrInfo('TMapPtPoint.deleteFromMap: ', E);
    end;
    mapFreeObject(Obj);
    mapView.Repaint;
  end;
end;
Изменено: KFF - 08.09.2017 20:05:15
Не тот глуп кто не знает, а тот, кто не знает где искать.
Страницы: 1
Читают тему (гостей: 1)



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

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