Конференция "Corba" » Не удаляется меню [Delphi]
 
  • CyberPirate (01.09.07 21:39) [0]
    unit Connect;

    {$WARN SYMBOL_PLATFORM OFF}

    interface

    uses
     ComObj, ActiveX, StdVcl, CryptoPlugin_TLB, AddInDesignerObjects_TLB, Office_TLB, Word_TLB, Dialogs;

    type
     TConnect = class(TAutoObject, _Connect, _IDTExtensibility2)
     private
       FWordApp: WordApplication;
       FMenuBar: CommandBarControl;

     protected
       procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
       procedure OnBeginShutdown(var custom: PSafeArray); safecall;
       procedure OnConnection(const Application: IDispatch;
         ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
         var custom: PSafeArray); safecall;
       procedure OnDisconnection(RemoveMode: ext_DisconnectMode;
         var custom: PSafeArray); safecall;
       procedure OnStartupComplete(var custom: PSafeArray); safecall;

     public
       constructor Create;

     end;

    implementation

    uses ComServ;

    procedure TConnect.OnConnection(const Application: IDispatch;
     ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
     var custom: PSafeArray);
    const
     MENU_GUID = '{5B34B396-8108-4D4D-8777-BB4A07CCB451}';

    var
     MenuItem: CommandBarControl;

    begin
     FWordApp := Application as WordApplication;
     FMenuBar := FWordApp.CommandBars.FindControl(msoControlPopup,1,MENU_GUID,true);

     if FMenuBar = nil then
       begin
         FMenuBar := FWordApp.CommandBars.Item['Menu Bar'].Controls.Add(msoControlPopup,1,0,FWordApp.CommandBars.Item['Menu Bar'].Controls.Count,true);
         FMenuBar.Caption := 'ITI &Crypto';
         FMenuBar.Set_Tag(MENU_GUID);
         FMenuBar.Visible := true;
       end;
    end;

    procedure TConnect.OnStartupComplete(var custom: PSafeArray);
    begin
     //TODO
    end;

    procedure TConnect.OnBeginShutdown(var custom: PSafeArray);
    begin
     //TODO
    end;

    procedure TConnect.OnDisconnection(RemoveMode: ext_DisconnectMode;
     var custom: PSafeArray);
    begin
     if FMenuBar <> nil then
       FMenuBar.Delete(false);
    end;

    procedure TConnect.OnAddInsUpdate(var custom: PSafeArray);
    begin
     //TODO
    end;

    constructor TConnect.Create;
    begin
     inherited;

     FWordApp := nil;
     FMenuBar := nil;
    end;

    initialization
     TAutoObjectFactory.Create(ComServer, TConnect, Class_Connect,
       ciMultiInstance, tmApartment);
    end.


    Создаю свой пункт меню.Но проблема в том,что оно не удаляется при закрытии документа.
    И все это несмотря на то что я указал в качестве [I]Temporary [/I]значение [I]true [/I]в методе [I]Add[/I].
    Вроде бы создаваться должно только на текущую сессию.Поэтому решил удалять в методе OnDisconnect.
    Но когда я вручную в ворде,на вкладке [I]COM Add-Ins[/I] подключаю расширение,то все Ок.Пункт меню создается,а затем при РУЧНОМ отключении удаляется.Но когда я ставлю на автоматическое подключение расширения,выставив в реестре в [I]LoadBehavior [/I]значение 3([I]hex[/I]),то при закрытии ворда никакого удаления не происходит.В чем проблема???  :huh:
  • CyberPirate (01.09.07 21:58) [1]
    MS Word 2003,Delphi 7.0
  • CyberPirate (02.09.07 15:34) [2]
    Вот что я заметил...Да то что перед закрытием меню все же удаляется.
    Я поставил ShowMessage,после Delete.И вижу что оно исчезает.
    Но при последующем открытии ворда оно опять видно.
    Выходит что мой COM обьект в событии OnDisconnect свое дело делает.
    Как-то перед закрытием ворда мельком заметил что он сохраняет что-то.Оказалось это файл с настройками меню,файл Normal.dot
    И выходит что сохранение данных в этот файл идет ДО события OnDisconnection.
    В итоге так и получается.Меню создано,при закрытии приложения данные сохранены в Normal.dot,меню удалено,приложение закрыто.Теперь при загрузке ворда,он черпает данные из Normal.dot,где указано что это меню есть.(хотя я его и удалил)

    Вопрос: Как сделать так,чтоб удаление меню при закрытии происходило до записи в тот файл???
    Пытался удаление сажать как на OnDisconnect,так и на OnBeginShutdown.Не кактит.Все это происходит позже,чем запись в файл настроек.
  • CyberPirate (02.09.07 17:11) [3]
    Накопал что помочь может это:
    app.CustomizationContext = app.ActiveDocument;

 
Конференция "Corba" » Не удаляется меню [Delphi]
Есть новые Нет новых   [134431   +9][b:0][p:0.002]