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

Не работает выделение объектов

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
Не работает выделение объектов, Не работает выделение объектов
 
Здравствуйте!

Столкнулся с такой проблемой.
Выделяю объекты как я думаю стандартным способом

procedure Tform_main.N46Click(Sender: TObject);
Var
listname : string;
begin
form_main.mvMap.Selecting := false;
form_main.mvMap.Repaint;
listname := mvMap.MapName;
mvMap.ViewSelect.SelectSample(true, listname, MapFind1.MapObj.Key);
MapFind1.Active := false;
MapFind1.MapObj.Style := OS_NORMAL;
MapFind1.Active := true;
mvMap.ViewSelect.SetSiteEnabledForSample;
mvMap.SetViewSelected(true, clFuchsia);
mvMap.Repaint;
end;

В целом все работает нормально, объект выделяется хорошо,
до тех пор пока не отключил отдельные слои

form_main.mvMap.Selecting := false;
form_main.mvMap.ViewSelect.Layers[14] := false; // Другой слой, не тот что с выделяемым объектом
form_main.mvMap.Selecting := true;
form_main.mvMap.Repaint;

После такой процедуры напрочь перестает работать выделение,
т.е. точнее оно работает, объект выделяется,
но все другие объекты с карты исчезают.

Пробовал, отключать режим
form_main.mvMap.Selecting := false;
тогда конечно объекты с карты не исчезают, но и все слои включены.
Но нужно, чтобы и слои, которые в данный момент не нужны на карте были отключены
и объекты выделялись нормально стандартным способом.

Что я не правильно делаю?
 
 
Свойство ViewSelect определяет контекст условий поиска/отображения (объект класса TMapSelect), которые могут быть использованы либо для определения состава отображаемых объектов, либо для определения состава выделяемых объектов.

Для того, чтобы одновременно установить отличные друг от друга условия отображения и условия выделения, необходимо использовать два разных экземпляра TMapSelect.

Для отображения останется TMapSelect, определяемый свойством ViewSelect.

А для выделения придется создать отдельный экземпляр TMapSelect, настроить его, и использовать в методе SetObjSelected:
Цитата

TMapView.SetObjSelected

Установить параметры группового выделения объектов карты, не используя ViewSelect.

procedure SetObjSelected(aObjSelect : TMapSelect; aColor : COLORREF; aRepaint : boolean);

Описание:

Процедура устанавливает признак необходимости группового выделения объектов карты  и цвет выделения для тех объектов, которые удовлетворяют параметрам, указанным в aObjSelect. Если в параметрах отображения aObjSelect указан список выделенных объектов (через TmapSelect.SelectSample) , то будут выделены объекты из списка, иначе все объекты, удовлетворяющие условиям поиска/отображения в aObjSelect. Если параметр aObjSelect = nil , то выделение будет снято. Параметр аColor задает цвет для контура выделенных объектов.

Если параметр aRepaint = true, то будет осуществлена перерисовка карты. Необходимо учитывать, что переданные параметры выделения не изменяются при изменении ранее переданного в функцию aObjSelect. Необходимо повторно вызвать функцию с новым aObjSelect для установки новых параметров группового выделения объектов.
 
Так и сделал:

procedure Tform_main.N66Click(Sender: TObject);
Var
aObjSelect : TMapSelect;
begin
aObjSelect.Create(form_main.mvMap);
SetObjSelected(aObjSelect,clAqua,true);

Но компилятор ругается на SetObjSelected

в uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
 System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls,

mapviewa, mapwina, mapcmp,

Vcl.Buttons, Vcl.ExtCtrls, Vcl.Menus, DBGridEhGrouping, ToolCtrlsEh,
 DBGridEhToolCtrls, DynVarsEh, EhLibVCL, GridsEh, DBAxisGridsEh, DBGridEh,

Maptype, mapcompa, mapfind, mapobja, mapobj, maction, mapedmet, mapcheck,
 mappoint, mdlgsher, mDialog, mapdlist, mapproc, StdCtrls, DlgSel, maprect,

 frxClass, frxExportRTF, frxExportPDF, DlgGetOb, Vcl.FileCtrl, GisProp,
 IniFiles, frxExportXLS, frxExportSVG, frxExportImage, Shellapi, DlgPrint,
 Vcl.Grids, Vcl.DBGrids, Vcl.Imaging.pngimage,

mapselt;

Похоже чего-то не хватает?
 
Цитата
Сергей Викторович написал:
Так и сделал:

procedure Tform_main.N66Click(Sender: TObject);
Var
aObjSelect : TMapSelect;
begin
aObjSelect.Create(form_main.mvMap);
SetObjSelected(aObjSelect,clAqua,true);

Но компилятор ругается на SetObjSelected

SetObjSelected- это не самостоятельная функция, а метод класса TMapViewWindow, родительского для TMapView и TMapScreen.


В моем ответе выше этот метод не даром дан со ссылкой на справочную систему.
 
Попробовал так:

procedure Tform_main.N66Click(Sender: TObject);
Var
listname : string;
aObjSelect : TMapSelect;
begin
aObjSelect.Create(mvMap);
aObjSelect.Assign(mvMap);
listname := mvMap.MapName;
aObjSelect.SelectSample(true,listname, 51855);
aObjSelect.SetSiteEnabledForSample;
mvMap.SetObjSelected(aObjSelect,clRed,true);
end;

Программа компилируется,
но при выполнении
aObjSelect.Create(mvMap); выдает ошибку по памяти.

Не пойму что я делаю не так?
 
Цитата
Сергей Викторович написал:
Попробовал так:

procedure Tform_main.N66Click(Sender: TObject);
Var
listname : string;
aObjSelect : TMapSelect;
begin
aObjSelect.Create(mvMap);
aObjSelect.Assign(mvMap);

listname := mvMap.MapName;
aObjSelect.SelectSample(true,listname, 51855);
aObjSelect.SetSiteEnabledForSample;
mvMap.SetObjSelected(aObjSelect,clRed,true);
end;

Программа компилируется,
но при выполнении
aObjSelect.Create(mvMap); выдает ошибку по памяти.

Не пойму что я делаю не так?

Немного теории...

Секция var объявляет переменные.
Если это переменная типа класса, то в Delphi это указатель.
Все переменные надо инициализировать.
Вызов любого метода от непроинициализированного  указателя - это 100% ошибка по памяти.
Посмотрите, как правильно создавать в коде программы экземпляры класса.
Освобождать выделенную память тоже надо не забывать.

Кроме того, хотя Ваш отладчик еще до этого не смог дойти, метод Assign предназначен совсем для другого.
Ошибки может и не получится, но в экземпляр TMapSelect  таким образом MapView точно не установить.
 
Добавил новый тип

type
 TMapSelect = class
 public
   Constructor Create; overload;   // Этот конструктор использует умолчания
 end;

и его конструктор

constructor TMapSelect.Create;
begin
 inherited;
end;

Пытаюсь выделить объект на карте

procedure Tform_main.N112Click(Sender: TObject);
Var
listname : string;
aObjSelect : TMapSelect;
begin
aObjSelect.Create();
listname := mvMap.MapName;
aObjSelect.SelectSample(true,listname, 51855); // Здесь интерпретатор сообщает, что у класса aObjSelect нет метода SelectSample (
aObjSelect.SetSiteEnabledForSample;
mvMap.SetObjSelected(aObjSelect,clRed,true);
end;

Я понимаю, что моих знаний не достаточно.
Просьба помочь дописать код выделения объекта.
Изменено: Сергей Викторович - 21.03.2019 14:02:39
 
Сергей Викторович написал:
Цитата

Я понимаю, что моих знаний не достаточно.

Вопрос не касается GIS TolKit, тут речь про основы программирования и синтаксис Delphi.
Я выше давал ссылку на теорию.
Там внизу страницы есть пример.

Код
var
  aObjSelect : TMapSelect;
begin
  aObjSelect := TMapSelect.Create(mvMap);
  if (aObjSelect <> nil) then
    begin  
      .....
      aObjSelect.Free;
    end;
end;


У Вас есть исходные тексты GIS ToolKit. В них можно посмотреть, как создается и используется тот или иной класс или компонент (TMapSelect в частности).
 
Посмотрел исходные тексты GIS ToolKit.
Яснее не стало.
Посмотрел описание теории, тоже яснее не стало.

В ПО пока есть проблема невозможности выбора состава карты и выделения одновременно.
Просьба дописать код, чтобы можно его было вставить в наше прикладное  ПО.

type
TMapSelect = class
public
  Constructor Create; overload;   // Этот конструктор использует умолчания
end;

constructor TMapSelect.Create;
begin
inherited;
end;

var  aObjSelect : TMapSelect;
begin
 aObjSelect := TMapSelect.Create(mvMap);
 if (aObjSelect <> nil) then
   begin  
     aObjSelect.SelectSample(true,listname, 51855);
     mvMap.SetObjSelected(aObjSelect,clRed,true);
     aObjSelect.Free;
   end;
end;

К сожалению в Examle\Delphi его не нашел, там есть только описание стандартного метода выделения объектов,
по создание отдельного дополнительного класса не нашел.

При компиляции
в строке   aObjSelect := TMapSelect.Create(mvMap); // компилятор сообщает много параметров, похоже чего то я не понимаю?

aObjSelect.Free; // здесь проблем нет

aObjSelect.SelectSample(true,listname, 51855); // здесь сообщает, что метода  SelectSample нет
похоже он мною не указан в описание типа.,
Как это сделать?

Просьба помочь.
Спасибо.
Изменено: Сергей Викторович - 21.03.2019 15:11:42
 
Цитата
Сергей Викторович написал:
type
TMapSelect = class
public
  Constructor Create; overload;   // Этот конструктор использует умолчания
end;

constructor TMapSelect.Create;
begin
inherited;
end;

Этим кодом Вы изобрели совершенно новый TMapSelect, совершенно ничего общего не имеющий с TMapSelect из GIS ToolKit.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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