multiple task panes in Outlook

Add-in Express™ Support Service
That's what is more important than anything else

multiple task panes in Outlook
How to access the task panes in different explorer windows 
Thomas Holdt




Posts: 7
Joined: 2013-08-22
Setting visibility of the task pane depending on the displayed folder in a single outlook window works fine.
When a second window with an explorer is opened, how could the pane instances be accessed and how are they connected to the windows/explorers?

Chuck
chuck
Posted 23 Sep, 2013 09:42:33 Top
Dmitry Kostochko


Add-in Express team


Posts: 2741
Joined: 2004-04-05
Hi Thomas,

All created Outlook forms are located in the FormInstances collection. You can also easily access all open Explorer windows using the Explorers collection of the Outlook Object Model. Each TadxOLForm instance has the ExplorerObj property. So, you can find a form embedded into a particular Explorer window using the following code:


function TAddInModule.GetFormByExplorer(const AExplorer: _Explorer): TadxOLForm;
var
  i: integer;
  adxForm: TadxOLForm;
begin
  Result := nil;
  for i := 0 to adxOlFormsManager1.Items[0].FormInstanceCount - 1 do begin
    adxForm := adxOlFormsManager1.Items[0].FormInstances[i];
    if Self.GetOutlookWindowHandle(adxForm.ExplorerObj) = Self.GetOutlookWindowHandle(AExplorer) then begin
      Result := adxForm;
      Break;
    end;
  end;
end;
Posted 24 Sep, 2013 06:19:43 Top
Thomas Holdt




Posts: 7
Joined: 2013-08-22
Hi Dmitry,

thanks for your answer, but maybe i am a little to stupid to understand....

I have a taskpane, which works well in one window . I can make it visible depending on which kind of folder is visible.
The problem appears, when other windows are opened.

If a inspector window ist opened (for example creating a appointment), i don't want the taskpane to show up.
(i can manage this, switching of the pane (visible := false) when a new window is opened and reshowing it, when the
main form is used again).

But if a new Inspector is opened for a calendar, the pane should show, independent of which kind of folder is opened in the main window .

This does not work and i can't find out...

if and when there is multiple instances of the pane
How i can find out, to which of the explorers they belong
How to set visible/non visible independent

When i use your proposed funtions on all explorers, are the adxforms the instances of the panes?

Greetings

Chuck
chuck
Posted 25 Sep, 2013 08:59:14 Top
Dmitry Kostochko


Add-in Express team


Posts: 2741
Joined: 2004-04-05
Hi Thomas,

I am really sorry but I do not understand what you are trying to achieve. May be you can give me the key points of your add-in's behavior? For example:
1. if an appointment inspector is opened
1.1. all forms embedded into all Explorer windows should be hidden

2. if an appointment inspector is closed
2.1. all forms embedded into all Explorer windows should be shown

3. if the selected folder is Inbox
3.1. the form embedded into the current Explorer window should be shown

4. if ?

When i use your proposed funtions on all explorers, are the adxforms the instances of the panes?


Yes, you can type cast the adxForm variable from my example to your pane's type.

Also, please let me know what Outlook pane types you use. Do you use Advanced Outlook regions (the TadxOLFormsManager component) or Office Custom Task panes (the TaskPanes collection of your add-in module)?
Posted 25 Sep, 2013 11:45:27 Top
Thomas Holdt




Posts: 7
Joined: 2013-08-22
H i Dimitry

you put me on the right way.....

I achieved the controll of visibility with following code



	j := 0;
   	for it in             
        adxMOREMultiCalendar.TaskPanes.Items[0].Instances do begin
        tpi :=  (it as TadxCustomTaskPaneInstance);
        handle := adxMOREMultiCalendar.GetOutlookWindowHandle(tpi.Window);   
        myexplorer := nil;
        for i := 1	to adxMOREMultiCalendar.OutlookApp.Explorers.Count do begin
            if adxMOREMultiCalendar.GetOutlookWindowHandle(adxMOREMultiCalendar.OutlookApp.Explorers.Item(i))=handle then begin               
                myexplorer := adxMOREMultiCalendar.OutlookApp.Explorers.Item(i);
            end;
        end;
        if myexplorer<>nil then begin
            if (inttostr(myexplorer.CurrentFolder.DefaultItemType)='1') then begin
                tpi.Visible := GenerallyVisible;                
            end else begin
                tpi.Visible := false;                
            end;
        end else begin
            tpi.Visible := false;
        end;
        inc(j);
	end;



But there are two issues left.

1. When opening a new explorer, no taskpane is created until I switch for instance from calendar to mail and back. Is there any way to force outlook to create a new pane instance in the newly opened Explorer Window?

2. Is there a way to detect if a pane is closed by the User or closed by Outlook because of visibility change?

Greetings

Thomas Holdt
chuck
Posted 04 Oct, 2013 07:12:43 Top
Andrei Smolin


Add-in Express team


Posts: 14675
Joined: 2006-05-11
Hello Thomas,

It looks like you try to manipulate the visibility of all form instances in all context. In what event the code above is invoked? Please note that the recommended way to prevent an advanced task pane from being shown is to set TadxOlFrom.Visible := false in the TadxOlForm.OnADXBeforeFormShow event.

When the user closes the form, the TadxOlForm.ADXCloseButtonClick event is raised.

Regards from Belarus (GMT+3),

Andrei Smolin
Add-in Express Team Leader
Posted 04 Oct, 2013 07:49:36 Top