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

Изменить параметры проекции

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 5 6 След.
RSS
Изменить параметры проекции, Изменить параметры проекции
 
Цитата
Денис Вицко написал:
Вы используете GIS ToolKit 12
Я использую GIS ToolKit 11
Прописал в разделе

interface

Myparm : TTASKPARMEX;
aMap : HMAP ;

 function Modify(aMap:HMAP;Myparm:TTASKPARMEX):integer;
 {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};
 external sGISVECTR;

В событии прописал

procedure Tform_main.N20Click(Sender: TObject);
var
aPathShell, aIniName : GTKString;
begin
if (not mvMap.Active)
then exit;

aMap := mvMap.MapHandle;
Myparm.Language := cML_RUSSIAN;
aPathShell  := GTKPChar(ExtractFilePath(Application.ExeName));
aIniName    := GTKPChar(aPathShell +'Uzor.ini');
Myparm.PathShell := GTKPChar(aPathShell);
Myparm.IniName := GTKPChar(aIniName);
Modify(aMap, Myparm);
form_main.mvMap.Repaint;
end;

Похоже, что-то опять я не понимаю?
Screenshort5.png (20.79 КБ)
Изменено: Сергей Викторович - 22.05.2017 20:37:00
 
Цитата
Сергей Викторович написал:
Цитата
 Денис Вицко  написал:
Сам же диалог уже доступен в библиотеке gisuvectr.dll (gisu64vectr.dll).
Скачал по приведенной ссылке новые библиотеки.
Нашел файл gisvectr.dll
Файл gisuvectr.dll или gisu64vectr.dll в библиотеках я не нашел.
Что здесь я не понимаю?
В комплекте библиотек для GIS TollKit11, который размещен в разделе Скачать, есть библиотека gisvectr.dll и в ней есть функция Modify -

http://gisinfo.ru/download?id=101
 
Цитата
Сергей Викторович написал:
Цитата
 Денис Вицко  написал:
Вы используете GIS ToolKit 12
Я использую GIS ToolKit 11
Прописал в разделе

interface

Myparm : TTASKPARMEX;
aMap : HMAP ;

 function Modify(aMap:HMAP;Myparm:TTASKPARMEX):integer;
 {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};
 external sGISVECTR;

В событии прописал

procedure Tform_main.N20Click(Sender: TObject);
var
aPathShell, aIniName : GTKString;
begin
if (not mvMap.Active)
then exit;

aMap := mvMap.MapHandle;
Myparm.Language := cML_RUSSIAN;
aPathShell  := GTKPChar(ExtractFilePath(Application.ExeName));
aIniName    := GTKPChar(aPathShell +'Uzor.ini');
Myparm.PathShell := GTKPChar(aPathShell);
Myparm.IniName := GTKPChar(aIniName);
Modify(aMap, Myparm);
form_main.mvMap.Repaint;
end;

Похоже, что-то опять я не понимаю?

В структуре TASKPARMEX больше переменных, чем Вы заполнили.
Например, там есть идентификатор главного окна, который в Вашем примере имеет случайное значение.
Программировать нужно аккуратно.
 
Цитата
Денис Вицко написал:
Цитата
 Сергей Викторович  написал:
Где может быть ошибка? Не пойму
а) Mytitle  все еще объявлен как указатель.
б) Тут какое-то "волшебство":
Код
 aPathShell  := GTKPChar(GTKString(ExtractFilePath(Application.ExeName))); 
aIniName    := GTKPChar(GTKString(aPathShell +'Uzor.ini')); 
Myparm.PathShell := GTKPChar(aPathShell); 
Myparm.IniName := GTKPChar(aIniName);  
наверное, так:
Код
 aPathShell  := GTKString(ExtractFilePath(Application.ExeName))); 
aIniName    := GTKString(aPathShell +'Uzor.ini')); 
Myparm.PathShell := GTKPChar(aPathShell); 
Myparm.IniName := GTKPChar(aIniName);  
А вообще опасно так в Embarcadero XE2 и выше преобразовывать строки.
Необходимо понимание того, чем unicode отличается от ansi.
В Embarcadero все строки теперь юникодовые, а MAPAPI от Вас требует на вход указатель на ANSI.
Повторение - мать учения (Русская народная мудрость).
 
Цитата
Денис Вицко написал:

Прототип функции на Delphi должен выглядеть примерно так:
Код
 function Modify(hmap: HMAP, parm: PTASKPARMEX): integer; 
{$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};  
external sGISVECTR; 
Для чего Вы меняете параметры в прототипе функции?

Параметр PARM - это указатель!!!

В Delphi параметры, передаваемые по указателю, могут быть описаны двумя способами:
Код
function Modify(hmap: HMAP, parm: PTASKPARMEX): integer; 
или
Код
function Modify(hmap: HMAP, var parm: TTASKPARMEX): integer;


Обратите внимание на Ваше объявление (это неправильно! приведенный ниже код копировать и вставлять в свою программу не надо!):
Код
 function Modify(aMap:HMAP;Myparm:TTASKPARMEX):integer; 
 {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}; 
 external sGISVECTR; 

Для понимания процессов работы с памятью и правилами адресации рекомендую - Курс "Углубленное программирование на C++"

В первой части курса дается полное представление о работе с памятью. Далее, если Вас не интересует C++, можно не смотреть, а обратиться к другим источникам уже по Delphi.
Хорошие книги (просто и понятно) по Delphi под авторством Архангельского А.Я.


Данный форум является тематическим и рассматривает аспекты прикладного программирования, непосредственно связанные с применением компонент GIS ToolKit и программных интерфейсов MAPAPI, MAPTASK и PANTASK.
Теоретические основы программирования тут не рассматриваются.
 
Яснее не стало.
У меня не компилируется объявление функции не первый ни второй ни третий ваш вариант.
см скриншоты во вложении.
Компилируется только мой вариант, который я приводил выше.
Но уже при выполнении программы по событию выбора пункта из меню,
программа вылетает см. скриншот выше.
Прошу объяснить в чем дело?
Screenshort7.png (63.96 КБ)
Screenshort6.png (61.73 КБ)
Screenshort8.png (62.22 КБ)
 
Цитата
Сергей Викторович написал:
Яснее не стало.
Быстро же Вы прошли курс углубленного программирования :)

Сергей Викторович, при всем уважении, прекратите не вдумываясь копировать фрагменты кода из форума, вставлять их себе в программу и ожидать 100%-ой работоспособности.
Попробуйте проанализировать тот код, который Вам предлагается. Тем более, что синтаксис Delphi Вы должны знать лучше меня.

Этот форум - не место для обучения тому, как объявить прототип API-функции в Delphi.

Крайний раз иду Вам на встречу (хотя от начальства явно получу выговор за нецелевое расходование рабочего времени). Вот код из Delphi, выполняющий вызов Вашего диалога.
Попробуйте вникнуть и при необходимости адаптировать его для своих нужд, а не просто воспользоваться Ctrl+C & Ctrl+V.

Код
function Modify(hmap: HMAP; parm: PTASKPARMEX): integer;
{$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};
external sGISVECTR;


implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
var
   parm: TTASKPARMEX;
   appname, shpath, ininame : GtkString;
begin
  if (MapView1.Active)
    then begin
      // Имя приложения
      appname := GtkString(Application.Title);
      // Каталог приложения (exe,dll,...)
      shpath  := GtkString(ExtractFilePath(Application.ExeName));
      // Полное имя файла ".ini" приложения
      ininame := GtkString(Application.ExeName + '.ini');
      // Подготовка структуры
      FillChar(parm, sizeof(parm), 0);
      with parm do
      begin
        Language  := cML_RUSSIAN;       // Локализация интерфейса
        Handle    := Self.Handle;       // Идентификатор главного окна приложения
        DocHandle := MapView1.Handle;   // Идентификатор окна карты
        PathShell := GTKPChar(shpath);  // Каталог приложения (exe,dll,...)
        IniName   := GtkPChar(ininame); // Полное имя файла ".ini" приложения
        ApplicationName := GTKPChar(appname);   // Имя приложения
      end;
      Modify(MapView1.MapHandle, @parm);
    end
  else
    ShowMessage('Нет открытой карты!');
end;
 
Спасибо.
Диалог вызвался нормально.
 
По организационным причинам, пришлось перейти на DelphiXE 5
и на GistoolKit12
Здесь уже изменился набор библиотек.

Теперь вызов вышеприведенной функции перестал работать.
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;

function Modify(hmap: HMAP; parm: PTASKPARMEX): integer;
 {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};
 external gisuvectr;

Прикладная программа не компилируется,
пишет не декларирован идентификатор  gisuvectr.

Похоже в Uses не все указано.
Просьба подсказать как решить данную проблему?
 
Цитата
Сергей Викторович написал:
Здесь уже изменился набор библиотек.

Набор библиотек в GTK12 не менялся.


Константы, определяющие имена библиотек в зависимости от версии среды разработки, версии GTK и разрядности собираемого проекта, описаны в модуле MapType.pas.

Поскольку этот модуль объявлен, но компилятор не находит идентификатор gisuvectr, - это говорит ровно о том, что такого идентификатора нет.
Есть определение sGISVECTR.
Выше Вы его использовали, зачем надо было менять имя константы в прототипе функции на несуществующее - не понятно...
Страницы: Пред. 1 2 3 4 5 6 След.
Читают тему (гостей: 1)



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

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