• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

ЛОЦМАН и ПЛАГИН

Автор Paul_Smith, 11.12.07, 14:06:33

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Paul_Smith

 Уважаемые опытные пользователи системы ЛОЦМАН, а так же его разработчики.
Подскажите пожалуйста, как создать свой pgi плагин для ЛОЦМАН 8.5.

Конкретно интересует механизм его создания, последующей компиляции и подключения к системе.

Будет понятно, если ответ будет приблизительно равный методу создания собственного приложения
для ЛОЦМАН.

Создание собственного приложения.

1. Открываем среду программирования (пример С# или VisualBasic)
2. Создаем пустой проект
3. В среде программирования ищем пунк приблизительно "Add reference"
4. В списке зарегистрированных COM компонентов ищем приблизительно "Loodsman Library"
5. В программном коде создаем переменную (объект)  типа LoodsmanApplication
6. Через этот объект доступны все функции ЛОЦМАНА, описанные в справке

Начинаем писать свою программу ( пример)
7. Добавляем последовательно нужные функции:
   - подключиться к базе данных
   - взять объекты в работу
   - изменения
   - сохранить изменения
   - вернуть данные в базу
8. Компилируем приложение с получением EXE - файла

9. Запускаем отдельно EXE файл и работаем.


AI

Это будет уже не плагин, а собственный клиент.

Плагин - dll, написанная на Delphi (допускается использование и других языков, но Delphi считается стандартом).
Во вложении пример плагина. Описание функций сервера есть в файле "C:\Program Files\ASCON\Loodsman\AppServer\Loodsman API.chm"

Paul_Smith

Цитата: AI от 14.12.07, 07:46:23
Это будет уже не плагин, а собственный клиент.

Плагин - dll, написанная на Delphi (допускается использование и других языков, но Delphi считается стандартом).
Во вложении пример плагина. Описание функций сервера есть в файле "C:\Program Files\ASCON\Loodsman\AppServer\Loodsman API.chm"

К сожалению я с Delfi не в ладах, но очень хочется понять механизм работы плагина. Если это DLL (набор функций), то как ЛОЦМАН с ней  работает? 
Пример простой. В клиенте ЛОЦМАНА я выбираю нужный объект и хочу через плагин изменить его свойства. Я понимаю, что надо прочитать C:\Program Files\ASCON\Loodsman\AppServer\Loodsman API.chm, найти нужные мне функции, создать в среде программирования проект типа DLL, написать нужную мне функцию, скомпилировать DLL и переименовать ее в PGI. Затем я ее должен прописать в клиентском Loodsman.ini в список на против нужной мне базы.
Если это так, то мне непонятно как мой плагин появится в верхнем меню ЛОЦМАН и где он появится?  Как ЛОЦМАН вызовет  мою DLL, как он будет передавать в нее параметры и как моя DLL узнает от ЛОЦМАНА, что он от нее хочет, как от выберет в ней нужный  метод и как передаст ему параметры?
   

vislipuzli

Помогите пожалуйста!!!!! :)
Как можно прочитать свойства файла формата .pgi
Например, описание, комментарии или версию продукта

teplinskiy

Цитата: Paul_Smith от 14.12.07, 13:19:35
непонятно как мой плагин появится в верхнем меню ЛОЦМАН и где он появится?  Как ЛОЦМАН вызовет  мою DLL, как он будет передавать в нее параметры и как моя DLL узнает от ЛОЦМАНА, что он от нее хочет, как от выберет в ней нужный  метод и как передаст ему параметры?   

в приложенном выше примере обратите внимание в главном модуле на:
- function InitUserDLL — встраивание в структуру главного меню
- function PgiCheckMenuItem — контроль доступности пунктов меню соответствующих командам плагина;
это обязательные экспортные функции.

stMenu – это строка вида:
«МЕСТО#Уровень1#Уровень2#...#Название», МЕСТО – строковый идентификатор определяющий положение относительно стандарт­ных пунктов главного меню, например: MI_TOOL  означает - внутри меню «Инструменты», приставки BEFORE_ и AFTER_ указывают размещение, соответственно, перед и после этого пункта меню;

stFunction – имя процедуры-обработчика которая будет выполняться при выборе пользователем данного пункта меню.

Возможные положения пунктов меню
MI_FILE, AFTER_MI_FILE, BEFORE_MI_FILE,
MI_VIEW,   AFTER_MI_VIEW, BEFORE_MI_VIEW,
MI_EDIT, AFTER_MI_EDIT, BEFORE_MI_EDIT,
MI_TOOLS, AFTER_MI_TOOLS,   BEFORE_MI_TOOLS,
MI_HELP,   AFTER_MI_HELP, BEFORE_MI_HELP

Для примера:
function InitUserDLL(Value: Pointer): Integer; stdcall; export;
var
item: PAddMenu;
begin
  if Value = nil then      //первый вызов
    Result := 2            //сколько будет пунктов в меню
  else begin               //второй вызов   
    item := Value;
    item.stMenu := 'AFTER_MI_VIEW#Плагин#Функция №1';
    item.stFunction := 'menu_Func1';
    inc(item);
    item.stMenu := 'AFTER_MI_VIEW#Плагин#Функция №2';
    item.stFunction := 'menu_Func2';
  end;
end;

а теперь проведите аналогию с прикрепленным выше примером плагина, думаю станет ясно.

vislipuzli

Помогите пожалуйста!!!!!  :%: :`(
Как можно прочитать свойства файла формата .pgi
Например, описание, комментарии или версию продукта :!:

Chaa

Цитата: vislipuzli от 03.08.10, 09:13:11
Помогите пожалуйста!!!!!  :%: :`(
Как можно прочитать свойства файла формата .pgi
Например, описание, комментарии или версию продукта :!:
Если имеется ввиду информация о версии файла, которую можно посмотреть в окне проводника Свойства -> Версия, то она получается функцией GetFileVersionInfo.
Например:
procedure LoadVersionInfo(AFileName: String);
var
    FileName: String;
    InfoSize, Wnd: DWORD;
    VerBuf: Pointer;
    VerSize: DWORD;
    Translations: PIntegerArray;
    TranslationsCount: DWORD;
    i: Integer;
    LangCode: DWORD;
    LangName: String;

    procedure AddItem(const ALangName, AName, ADisplayName: String);
    var
        LSize: DWORD;
        LValuePointer: PChar;
        LValue: String;
    begin
        if (VerQueryValue(VerBuf, PChar('\StringFileInfo\' + ALangName + '\' + AName),
            Pointer(LValuePointer), LSize)) then
        begin
            SetString(LValue, LValuePointer, LSize - 1);
            // Добавить куда-нибудь данные на языке ALangName
            // с именем ADisplayName и значением LValue
            // ...
        end;
    end;
begin
    // GetFileVersionInfo modifies the filename parameter data while parsing.
    // Copy the string const into a local variable to create a writeable copy.
    FileName := AFileName;
    UniqueString(FileName);
    InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
    if InfoSize <> 0 then
    begin
        GetMem(VerBuf, InfoSize);
        try
            if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
            begin
                VerQueryValue(VerBuf, '\VarFileInfo\Translation', Pointer(Translations), VerSize);
                TranslationsCount := VerSize div SizeOf(Integer);
                for i := 0 to TranslationsCount - 1 do
                begin
                    LangCode := Translations[i];
                    LangName := Format('%4x%4x', [LangCode and $FFFF, LangCode shr 16]);
                    LangName := StringReplace(LangName, ' ', '0', [rfReplaceAll]);

                    AddItem(LangName, 'FileVersion', SVersionFileVer);
                    AddItem(LangName, 'FileDescription', SVersionFileDesc);
                    AddItem(LangName, 'ProductVersion', SVersionProdVer);
                    AddItem(LangName, 'ProductName', SVersionProdName);
                    AddItem(LangName, 'Comments', SVersionComments);
                    AddItem(LangName, 'CompanyName', SVersionCompany);
                end;
            end;
        finally
          FreeMem(VerBuf);
        end;
    end;
end;

Pavor

Нужно ли для использования Лоцман 2011 заменить файл PIClasses.pas на более новую версию.
Приложенный пример работает, но будут ли работать новые функции?
Если нужен более новый файл, то подскажите сразу - где его взять?

Chaa

Лучше всего использовать COM-интерфейс плагинов, как описано в LoodsmanClientApi.chm.
Судя по тому, что документация на PAS-интерфейс и файл PIClasses.pas отсутствуют в стандартном SDK, они официально не поддерживаются.

Pavor

Спасибо,
а можно какой-нибудь пример плагина на Delphi для COM-интерфейсов?

Chaa

Я выкладывал раньше пример плагина: http://forum.ascon.ru/index.php/topic,15373.msg100832.html#msg100832
Он сделан для Delphi 2009 и старше. Если будете использовать более ранние версии Delphi, то нужно удалить файл VCLPatch.pas или переписать, если пользуетесь компонентами VirtualTrees.
Файл Loodsman_TLB.pas там старый, от версии 8.5 Лоцмана.
Новый файл можно сделать из Loodsman.tlb. На всякий случай прикрепил к сообщению.

Pavor

Большое спасибо, буду разбираться.

kemzsapr

У меня проблема! Необходимо СРОЧНО написать плагин для ЛОЦМАН9.0. Я пишу на DELPHI7, но для ЛОЦМАНА плагинов не делал. Пробую по примеру из SDK - нужна LOODSMAN_TLB.PAS. Ее нет, хотя есть LOODSMAN.TLB. Может, кто-то даст пример плагина для 9.0 (хотя бы слово Hello выводил) и как его компилировать и подключать. Мне нужно сделать 1-й шаг БЫСТРО, а уж с базами данных я работал слава Богу сколько.

Chaa

Цитата: kemzsapr от 28.10.11, 10:15:51
У меня проблема!
На одно сообщение выше вашего есть и ссылка на пример плагина, и файл Loodsman_TLB.pas.

YorikER

Не знаю насколько я в строчку...
Для Delphi 7:
- установите на свой компьютер сервер приложений (LoodsmanAppServer.DLL), так проще будет, хотя можно и несколько по другому...
- В Delphi 7 главное меню -> Project -> Import Type Library...;
- В списке библиотек найдите Loodsman Library (Version 1) - ссылается на Loodsman.exe или (Version 8) - для версии 8.5 (для других версий скорее номер версии выше - ссылается на LoodsmanAppServer.DLL;
- определитесь что именно вам надо, скорее всего создать библиотеку типов для сервера приложений (LoodsmanAppServer - будет создано описание объекта типа TMainSystem) и нажмите Create Unit... Вам будет создан файл LoodsmanServerApplication_TLB.pas с описанием объекта TMainSystem с методами сервера приложений системы ЛОЦМАН:PLM.
Установите это файл в свой файл проекта на Delphi, подключайтесь к серверу приложений и свободно пользуйтесь его методами...
Хотя для плагинов может я и не прав, там свой TLB - файл...

Chaa

Для плагинов библиотека типов сервера не нужна. Нужна библиотека типов клиента, в которой описаны интерфейсы IPluginCall и IDataSet.
Если хочется самостоятельно сделать заголовочные файлы из TLB, то можно использовать tlibimp.exe из поставки Delphi.

YorikER

Простите, уважаемый Chaa, а разве Lodsman Library (Version 1) ссылающийся на Loodsman.exe не создадут файл описания типов клиента?

Chaa

Да, можно и так. В "Lodsman Library (Version 1)" действительно библиотека типов клиента. Мне почему-то казалось, что там библиотеки типов сервера.