Toon posts:

[Delphi] Probleem mbt. COM en Office

Pagina: 1
Acties:
  • 103 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil een office plugin maken die een Taskpane toevoegt. Op dat TaskPane wil ik een ActiveForm en ik wil vanuit de plugin zaken op dat ActiveForm zetten.

Microsoft geeft via MSDN het volgende voorbeeld:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
public class Connect : Object, Extensibility.IDTExtensibility2, ICustomTaskPaneConsumer
... 
object missing = Type.Missing;
public CustomTaskPane CTP = null;

public void CTPFactoryAvailable(ICTPFactory CTPFactoryInst)
{
    CTP = CTPFactoryInst.CreateCTP("SampleActiveX.myControl", "Task Pane Example", missing);    
    sampleAX = (myControl)CTP.ContentControl;
    sampleAX.InsertTextClicked += new InsertTextEventHandler(sampleAX_InsertTextClicked);
    CTP.Visible = true;
} 


Dat is an sich helder. Ik heb alles zo ver dat het taskpane inderdaad aanwezig is en daarop inderdaad mijn ActiveForm staat.

De versimpelde code van het ActiveForm:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TaxfrmTaskPane = class(TActiveForm, IaxfrmTaskPane)
  [..]
  public
  [..]
    procedure.Test;
  end;

[..]
Procedure TaxfrmTaskPane Test;
begin
  ShowMessage('hello world');
end;


In mijn Addin Applicatie maak ik een taskpane volgens het voorbeeld van Microsoft:

Delphi:
1
2
3
  TaskPane:=CTPFactoryInst.CreateCTP('myserver.axfrmTaskPane','Mijn Caption',EmptyParam);
      Taskpane.Visible:=True;
      TaskPaneContainer:=TaxfrmTaskPane(TaskPane.ContentControl);


Dit is in feite precies hetzelfde als MS doet.

Echter:
Delphi:
1
  TaskPaneContainer.Test;


Geeft een AV.. iemand een idee wat ik fout doe?

[ Voor 3% gewijzigd door Verwijderd op 07-05-2007 12:06 ]


Verwijderd

Topicstarter
Voor latere naslag, dit probleem is opgelost.

Ten eerste, en dat had ik moeten weten, kun je niet zo eenvoudig methods/properties aan een Activeform toevoegen. De juiste methode is door het openen van het form en dan in het edit menu voor 'add to interface' te kiezen. Anders blijft de methode/propertie zuiver binnen de scope van het form.

Als je op die manier je property/method hebt aangemaakt, kun je toegang krijgen tot de property/methods door de queryinterface methode.

Dus:
Delphi:
1
2
3
4
  TaskPane:=CTPFactoryInst.CreateCTP('myserver.axfrmTaskPane','Mijn Caption',EmptyParam); 
  Taskpane.Visible:=True; 
  Result:=Taskpane.ContentControl.QueryInterface(IID_IaxfrmTaskPane,t_iTaskPane);  
  If (Result = 0) and (t_iTaskPane<>0) then .... // toegang verkregen


Hierna kun je via t_iTaskPane je methods benaderen, dus in dit voorbeeld:
Delphi:
1
  t_iTaskPane.Test;