Денис Вицко написал: Сам же диалог уже доступен в библиотеке gisuvectr.dll (gisu64vectr.dll).
Скачал по приведенной ссылке новые библиотеки. Нашел файл gisvectr.dll Файл gisuvectr.dll или gisu64vectr.dll в библиотеках я не нашел. Что здесь я не понимаю?
В комплекте библиотек для GIS TollKit11, который размещен в разделе Скачать, есть библиотека gisvectr.dll и в ней есть функция Modify -
В структуре TASKPARMEX больше переменных, чем Вы заполнили. Например, там есть идентификатор главного окна, который в Вашем примере имеет случайное значение. Программировать нужно аккуратно.
А вообще опасно так в Embarcadero XE2 и выше преобразовывать строки. Необходимо понимание того, чем unicode отличается от ansi. В Embarcadero все строки теперь юникодовые, а MAPAPI от Вас требует на вход указатель на ANSI.
Повторение - мать учения (Русская народная мудрость).
В первой части курса дается полное представление о работе с памятью. Далее, если Вас не интересует C++, можно не смотреть, а обратиться к другим источникам уже по Delphi. Хорошие книги (просто и понятно) по Delphi под авторством Архангельского А.Я.
Данный форум является тематическим и рассматривает аспекты прикладного программирования, непосредственно связанные с применением компонент GIS ToolKit и программных интерфейсов MAPAPI, MAPTASK и PANTASK. Теоретические основы программирования тут не рассматриваются.
Яснее не стало. У меня не компилируется объявление функции не первый ни второй ни третий ваш вариант. см скриншоты во вложении. Компилируется только мой вариант, который я приводил выше. Но уже при выполнении программы по событию выбора пункта из меню, программа вылетает см. скриншот выше. Прошу объяснить в чем дело?
Быстро же Вы прошли курс углубленного программирования
Сергей Викторович, при всем уважении, прекратите не вдумываясь копировать фрагменты кода из форума, вставлять их себе в программу и ожидать 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;
Константы, определяющие имена библиотек в зависимости от версии среды разработки, версии GTK и разрядности собираемого проекта, описаны в модуле MapType.pas.
Поскольку этот модуль объявлен, но компилятор не находит идентификатор gisuvectr, - это говорит ровно о том, что такого идентификатора нет. Есть определение sGISVECTR. Выше Вы его использовали, зачем надо было менять имя константы в прототипе функции на несуществующее - не понятно...