Здравствуйте!
За последний год отечественные производители операционных систем (ОС) Astra Linux, AltLinux начали включать в дистрибутивы среду разработки Lazarus.
В продолжении знакомства с программированием прикладных задач в среде Lazarus (Операционная система Astra Linux CE) для ГИС Оператор предлагаю краткий обзор разработки с применением классов TPanTask, TPanWindow, TPanAction. Сначала напомню, что необходимо учитывать:
1.Задача разрабатывалась на базе исходных текстов из архива SDK для ГИС Оператор, который можно скачать по ссылке [URL=http://gisinfo.ru/download?id=131]http://gisinfo.ru/download?id=131[/URL]
2. Структуры и параметры необходимо привести к требованиям 64-битной ОС. Пример:
[CODE]TTASKPARMEX = packed record
Language:int64;
Resource : int64;
HelpName : int64;
IniName : int64;
PathShell: int64;
ApplicationName : int64;
Handle : int64;
DocHandle : int64;
StayOnTop : int64;
end;[/CODE]
За образец я взял исходные тексты на C++.
3.При использовании диалогового интерфейса необходимо учитывать последовательность объявления unit. Главное: unit Interfaces должен быть объявлен до unit Forms.
4.Перед началом разработки необходимо сделать “линк”-ссылку на библиотеку ГИС Оператор – libmapacces.so командой: ln –s /usr/Operator11/libmapacces.so /usr/lib/libmapacces.so
Далее для работы необходимо адаптировать классы TPanTask, TPanWindow, TPanAction для работы в Lazarus. В качестве эталона я использовал тексты на С++: pantask.cpp, h, panwin.h, panact.h. Главное, как упоминал выше, необходимо привести структуры и параметры к требованиям 64-битной ОС. В моем случае – это ОС Astra Linux CE (релиз Орел). Опишу главные моменты:
1.В описание TPanWindow необходимо добавить ссылку на функцию-обработчик главной программы:
[CODE]{$IFDEF LINUXAPI} MessageHandler: MSGHANDLER;{$ENDIF}[/CODE]
Описание типа функции представлено ниже:
[CODE]{$IFDEF LINUXAPI} MSGHANDLER = function (hwnd : int64; code : int64; p1 : int64; p2: int64; typemsg: int64) : int64; cdecl;{$ENDIF}[/CODE]
2.Далее в конструкторе класса укажем реальный адрес:
[CODE]{$IFNDEF LINUXAPI}
FHMainWindow := parm.Handle;
{$ELSE}
FHMainWindow := 0;
MessageHandler := MSGHANDLER(aparm.Handle);
{$ENDIF}[/CODE]
3.Для функций класса TPanWindow необходимо для указателей-параметров задавать преобразование к 64-битной переменной:
[CODE] procedure TPanWindow.SetWindowTitle(const amessage : PChar);
begin
{$IFDEF LINUXAPI}
if GetHandle <> 0 then MessageHandler(GetHandle,int64(MT_MAPWINPORT), int64(MWP_SETWINDOWTEXT),int64(amessage),0);
{$ENDIF}
end;[/CODE]
4.В функцию добавления кнопки в панель для Lazarus необходимо внести следующие изменения:
[CODE]function TPanTask.InsertButton(panelId : integer ; bmpFace : int64; bmpName : Pchar; command : integer; after : integer): integer;
var BitmapH : HBITMAP;
hInst : HMODULE;
buttonInfo : TBUTTONINFO ;
res : integer;
begin{$IFDEF LINUXAPI}
if Assigned(MessageHandler) then begin
buttonInfo.Command := command;
buttonInfo.BitmapIdent := bmpface;
buttonInfo.Sibling := 0;
result := MessageHandler(0, AW_INSERTBUTTON, WPARAM(panelID), LPARAM(@buttonInfo), 0);
end else result := 0;
{$ENDIF}
end;[/CODE]
В указанном выше описании я привел основные ньюансы по созданию прикладной задачи в среде Лазарус для Linux.[B] Исходные тексты прилагаются к данной теме. На рисунках представлен результат работы задачи в среде ГИС Оператор под Astra Linux CE.[/B]