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

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

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

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

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

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

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

Запуск плагина в немодальном режиме.

Автор Дмитрий, 01.06.09, 08:52:28

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

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

Дмитрий

Можно ли в Лоцмане 8.5  запустить плагин в немодальном режиме?

Muk

Уже обсуждалось. Можно попробовать Вместо Form1.ShowModal написать
Form1.Show
Application.Run

В принципе в этом ничего криминального, если разработчик хорошо понимает, что делает.

Дмитрий

2Muk
Печально, но у меня не получилось.
Код следующий:
begin
AssignRunMethod(RunMethod);
Application.Handle := ParentHandle;
SelectObozn := TSelectObozn.Create(Application);
SelectObozn.CurrentObj := PDMVersion;
SelectObozn.DataBaseName := DataBaseName;

try
// SelectObozn.ShowModal;
SelectObozn.Show;
Application.Run;

except
  on E:Exception do
    begin
    Application.MessageBox(PChar(E.Message), 'Ошибка', MB_OK);
   end;
end;
SelectObozn.Free;

Application.Handle := 0;
end;

М.б. подскажите, что неправильно?

Muk

Попробуйте добавить Application.Initialize в начале.

Maxagg

{}
library ReplaceAttr;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  Classes,
  Forms,
  Dialogs,
  PIClasses,
  ComObj,
  ActiveX,
  DateUtils,
  IniFiles,
  Variants,
  Types,
  Messages,
  ComCtrls,
  Graphics,
  PICUtil,
  DBClient,
  Main in 'main.pas' {fmMain};

{$E pgi}

{$R *.res}

var
_PDMVersion: TVersion;

type
PAddMenu = ^TAddMenu;
TAddMenu =
record
   stMenu : String[255];
   stFunction : String[255];
end;
//Создание пунктов меню в лоцмане
function InitUserDLL (Value : Pointer) : Integer; stdcall; export;
Var
item : PAddMenu;
begin
    if Value = nil then
        begin
            Result := 1;   //  сколько пунктов в меню
        end
        else
        begin
            item := Value;
            //пункты меню:
            // работа с задачами
            item.stMenu := 'MI_TOOL#Сдать документы#Ассоциативная 3D-модель сборки';
            item.stFunction := 'OpenForm';
            Result := 1;
        end;
end;
//активация пунктов меню в соответствии с выделенной областью
function PgiCheckMenuItem(stFunction : String; RunMethod : TRunMethod;
                          ParentVersion, ChildVersion : TVersion;
                          stLinkName, DataBaseName, stCheckOut : String) : Boolean; stdcall; export;
var
    cdsLocal : TClientDataSet;
begin
    Result := False;
    AssignRunMethod(RunMethod);
    _PDMVersion := TVersion.FromIDVersion(ChildVersion.inID);
    if stFunction = 'OpenForm' then
    begin
        if ( _PDMVersion.stType = 'Сборочная единица') then
        begin
            Result := True;
        end;
    end;
end;

//активируемые процедуры
procedure OpenForm(ParentHandle, ClientHandle : THandle;
                       RunMethod : TRunMethod;
                       PDMVersion : TVersion;
                       DataBaseName : string;
                       stCheckOut : String);stdcall;

begin
    Application.Handle := ParentHandle;
    Application.NormalizeAllTopMosts;
    AssignRunMethod(RunMethod);
    Application.CreateForm(TfmMain, fmMain);
  fmMain.Sel:= PDMVersion.inId;
    fmmain.bdname:=DataBaseName;
    Application.Run;
    Application.Handle := 0;
end;
//экспорт процедур в библиотеку
{Exports Section}
exports InitUserDLL, PgiCheckMenuItem, OpenForm;
begin
end.

Дмитрий

2Максимилиан
Спасибо за помощь. Запустить плагин в немодальном режиме получилось. Правда пришлось дописать строку:

    Application.Run;
    fmMain.Free;
    Application.Handle := 0; 

Т.к. без нее плагин при закрытии выдает ошибку.


Maxagg

возможно из-за кода в процедуре fmmain.create

Chaa

Насколько я знаю, Лоцман (8.5 SP2) выгружает DLL-плагина после вызова экспортируемой функции, поэтому нужно предпринять какие-то меры, чтобы DLL не выгружалась.

В данном случае цикл обработки сообщений перемещается из Лоцмана в плагин, и есть подозрение что после этого Лоцман будет работать неправильно.
Попробуйте вызвать функцию вашего плагина несколько раз из меню Лоцмана, интересно, что произойдет.

Дмитрий

При повторном вызове плагина возникает ошибка. Из-за этого после первого вызова плагина мы блокируем соответствующий пункт меню. При закрытии плагина пункт меню делаем доступным.

Chaa

Попробовал, действительно работает вроде нормально. Единственное, что заметил, при открытии файла .lnO запускается новая копия Лоцмана. И еще два таких плагина вместе работают странно - при закрытии окна запущенного первым закрывается окно запущенного вторым.

Pavor

Сделал по данному образцу:
Цитата: Максимилиан от 02.07.09, 05:00:48

//активируемые процедуры
procedure OpenForm(ParentHandle, ClientHandle : THandle;
                       RunMethod : TRunMethod;
                       PDMVersion : TVersion;
                       DataBaseName : string;
                       stCheckOut : String);stdcall;

begin
    Application.Handle := ParentHandle;
    Application.NormalizeAllTopMosts;
    AssignRunMethod(RunMethod);
    Application.CreateForm(TfmMain, fmMain);
  fmMain.Sel:= PDMVersion.inId;
    fmmain.bdname:=DataBaseName;
    Application.Run;
    Application.Handle := 0;
end;
//экспорт процедур в библиотеку
{Exports Section}
exports InitUserDLL, PgiCheckMenuItem, OpenForm;
begin
end.

Почему-то окно плагина ведет себя немного странно: при попытке свернуть его сворачивается также и основное окно Лоцмана. Само же основное окно, если его попытаться свернуть, сворачивает только себя, окно плагина остается развернутым.
Можно ли как-то это исправить, то есть чтобы окно плагина сворачивалось отдельно, оставляя основное окно развернутым?
Попутно еще один вопрос: можно ли сделать в немодальном плагине реакцию на события в главном окне? Например, при изменении выбранной сборочной единицы  в плагине отображался бы список применяемых там материалов.