線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4066
推到 Plurk!
推到 Facebook!

如何在 microsoft word 加入按鈕

答題得分者是:darnell
david0927
一般會員


發表:12
回覆:7
積分:2
註冊:2008-11-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-20 16:06:24 IP:61.228.xxx.xxx 訂閱
各位前輩好,

不好意思又打擾了, 如果我想用 delphi 寫一支小程式, 可以在

microsoft word 上面的功能列加入自已設計的按鈕(icon), 同時點了

此按鈕會執行自己的程式. 謝謝!!
------
陳效聖
darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-20 16:50:40 IP:60.250.xxx.xxx 訂閱
david0927
一般會員


發表:12
回覆:7
積分:2
註冊:2008-11-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-21 15:25:05 IP:61.228.xxx.xxx 訂閱
各位前輩, 好

首先感謝各位前輩的指引, 我有到
MSOAddIn v.1.0.2 by Vadim Krochak
http://www.torry.net/authorsmore.php?id=2843

去下載相關的程式碼,可是卻無法打開其 dpr 檔, (好像不可以從檔案
中直接開啟), 不好意思只好再打擾各位前輩指點迷津

------
陳效聖
darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-21 16:12:20 IP:220.128.xxx.xxx 訂閱
你是說單純的打開dpr檔?
我開了看起來沒問題但是沒有用過
有出現什麼錯誤訊息嗎?
下面有Download: D5 D6 D7看看下載的版本跟你用的對不對
我是用D7開看起來正常
david0927
一般會員


發表:12
回覆:7
積分:2
註冊:2008-11-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-24 13:00:19 IP:61.228.xxx.xxx 訂閱
各位前輩好,
我把我的 delphi 重新安裝後,下載相關的程式碼,已經可以打開其 dpr 檔了.
謝謝, 然後我參照您提供下載的 readme.txt 中第7項指示從 (Project->Import Type Library)
將其元件安裝好後, 開一個新的專案檔(dpr), 然後將其中一個元件( (WordAddIn)放到專案檔
上 可是接下去就不知如何處理(因為英文底子不好),不知各位前輩可否提供相關範例或
指點一下迷津, 將感激不盡, 謝謝 !!
------
陳效聖
darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-26 18:26:17 IP:60.250.xxx.xxx 訂閱
照著以下步驟~

1.建立一個新的ActiveX Library專案(New Items->切換到ActiveX頁->ActiveX Library)
2.將你下載的那個程式碼中,使用Add file to Project(Shift F11)全都加入進來

//必需的檔案
EventSink.pas
MSOEventSink.pas
MSOfficeAddIn.pas
MSOAddIn_Utils.pas

//你想操作的應用程式
Word_TLB.pas
Outlook_TLB.pas
Excel_TLB.pas

//你想操作的方式
Office_TLB.pas
VBIDE_TLB.pas

3.建立一個新的Automation Object單元(New Items->切換到ActiveX頁->Automation Object)
會出現一個精靈視窗自己取個類別名稱(其他預設即可)-->按OK
4.這時會產生一個可以寫程式碼的單元(Unit1自己可以改檔名存)(要讓你寫功能的地方)
5.將其中TAutoObject 改成 TMSOfficeAddIn-->參考範例中的部分改
6.將其中TAutoObjectFactory.Create 改成 TMSOAddInFactory.Create-->參考範例中的部份改
7.開始開發你想要的功能...
OutlookAddIn_IMPL.pas ->Outlook範例
WordAddIn_IMPL.pas ->Word範例
ExcelAddIn_IMPL.pas ->Excel範例
8.完成後按Complier若都無錯誤->功能表-->Run->Register ActiveX Server
9.完成開Office看看效果
編輯記錄
darnell 重新編輯於 2008-11-26 18:38:55, 註解 無‧
david0927
一般會員


發表:12
回覆:7
積分:2
註冊:2008-11-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-27 12:08:24 IP:61.228.xxx.xxx 訂閱
感激版主的大力幫忙, 我會趕快按照您指點的方式
去 try 看看, 謝謝 !!
------
陳效聖
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-01-22 13:42:15 IP:114.42.xxx.xxx 未訂閱
 MSOAddIn我曾經在2007年接觸過,當時試著在BCB編譯卻失敗了
最近又看到有人重新發問,花了快兩個禮拜的時間終於用BCB6編譯成功
雖然這篇文章屬於Delphi討論區,但這篇有MSOAddIn的詳細步驟
我還是在這裡回文並且附上AddinImpl.cpp和AddinImpl.h原始碼
方便以後的網友google到這篇文章。
趁此機會還是要抱怨一下,當初在網路上搜尋時完全找不到BCB相關資料
找到的Delphi資料又無法用在BCB,因為DELPHI用的是DAX(Delphi ActiveX Extension)
BCB用的是ATL(Active Template Library),技術上反而和MS VC比較相近。
最後我還找了Visual C 6.0再搭配CodeProject的範例來了解其中的機制
只是要將程式碼轉移到BCB又是困難重重,不是編譯錯誤就是符號沒定義
我只能看Office_TLB.h和Word_TLB.h靠嘗試錯誤來猜要怎麼改才能編譯成功
所以最後的結果會和VC的範例略有不同

檔案下載
http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=102083
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-01-22 13:44:30 IP:114.42.xxx.xxx 未訂閱
AddinImpl.cpp

[code cpp]

// ADDINIMPL : Implementation of TAddinImpl (CoClass: Addin, Interface: _IDTExtensibility2)

#include
#pragma hdrstop

#include "ADDINIMPL.H"
#pragma link "AddInDesignerObjects_OCX"

/////////////////////////////////////////////////////////////////////////////
// TAddinImpl

STDMETHODIMP TAddinImpl::OnAddInsUpdate(LPSAFEARRAY* custom)
{
return E_NOTIMPL;
}

STDMETHODIMP TAddinImpl::OnBeginShutdown(LPSAFEARRAY* custom)
{
return E_NOTIMPL;
}

STDMETHODIMP TAddinImpl::OnConnection(LPDISPATCH Application,
Addindesignerobjects_tlb::ext_ConnectMode ConnectMode,
LPDISPATCH AddInInst, LPSAFEARRAY* custom)
{
CComQIPtr spApp(Application);
CComPtr spCmdBars;
ATLASSERT(spApp);
spApp->get_CommandBars(&spCmdBars);

CComVariant vtName(_T("Universal Addin"));
CComVariant vtPos(1); // position it below all toolbands
CComVariant vtTemp(VARIANT_TRUE); // is temporary
CComVariant vtEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
CComPtr < Office_tlb::CommandBar> spNewCmdBar;
spNewCmdBar = spCmdBars->Add( vtName,vtPos, vtEmpty, vtTemp);
ATLASSERT(spNewCmdBar);

CComPtr < Office_tlb::CommandBarControls> spBarControls;
spBarControls = spNewCmdBar->get_Controls();
ATLASSERT(spBarControls);

CComVariant vtToolBarType(1);
CComPtr < Office_tlb::CommandBarControl> spNewBar;
CComVariant vtShow(VARIANT_TRUE);
// add button
spNewBar = spBarControls->Add(vtToolBarType, vtEmpty, vtEmpty, vtEmpty, vtShow);
ATLASSERT(spNewBar);

// get CommandBarButton interface so we can specify button styles and stuff
// each button displays a bitmap and caption next to it
CComQIPtr < Office_tlb::CommandBarButton> spCmdButton(spNewBar);
ATLASSERT(spCmdButton);

spCmdButton->set_Style(Office_tlb::msoButtonCaption);
spCmdButton->set_Visible(VARIANT_TRUE);
spCmdButton->set_Caption(OLESTR("Button"));
spCmdButton->set_Enabled(VARIANT_TRUE);
spCmdButton->set_TooltipText(OLESTR("Tooltip for Button"));
spCmdButton->set_Tag(OLESTR("Button"));
spCmdButton->set_Caption(OLESTR("Button"));
spCmdButton->set_Visible(VARIANT_TRUE);
spNewCmdBar->set_Visible(VARIANT_TRUE);

m_spButton=spCmdButton;
DispEventAdvise((IDispatch*)m_spButton, &__uuidof(_CommandBarButtonEvents));

return S_OK;
}

STDMETHODIMP TAddinImpl::OnDisconnection(
Addindesignerobjects_tlb::ext_DisconnectMode RemoveMode,
LPSAFEARRAY* custom)
{
DispEventUnadvise((IDispatch*)m_spButton, &__uuidof(_CommandBarButtonEvents));
return S_OK;

}
STDMETHODIMP TAddinImpl::OnStartupComplete(LPSAFEARRAY* custom)
{
return E_NOTIMPL;
}

void __stdcall TAddinImpl::OnClickButton(IDispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault)
{
::MessageBox(NULL,"OnClickButton",NULL,MB_OK);
}


[/code]


AddinImpl.h

[code cpp]

// ADDINIMPL.H : Declaration of the TAddinImpl

#ifndef AddinImplH
#define AddinImplH

#define ATL_APARTMENT_THREADED
#include "OfficeAddin_TLB.h"
#include "AddInDesignerObjects_OCX.h"
#include "Office_TLB.h"
#include "Word_TLB.h"
#include

static _ATL_FUNC_INFO OnClickButtonInfo={CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_BOOL}};
/////////////////////////////////////////////////////////////////////////////
// TAddinImpl Implements _IDTExtensibility2, default interface of Addin
// ThreadingModel : Apartment
// Dual Interface : TRUE
// Event Support : FALSE
// Default ProgID : Project1.Addin
// Description :
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE TAddinImpl :
public CComObjectRootEx,
public CComCoClass,
public IDispatchImpl<_IDTExtensibility2, &IID__IDTExtensibility2, &LIBID_OfficeAddin>,
public IDispEventSimpleImpl<1,TAddinImpl,&DIID__CommandBarButtonEvents>
{
public:
TAddinImpl()
{
}

// Data used when registering Object
//
DECLARE_THREADING_MODEL(otApartment);
DECLARE_PROGID("OfficeAddin.Addin");
DECLARE_DESCRIPTION("");

// Function invoked to (un)register object
//
static HRESULT WINAPI UpdateRegistry(BOOL bRegister)
{
TRegistry *registry = new TRegistry();
AnsiString Key="Software\\Microsoft\\Office\\Word\\Addins\\" AnsiString(GetProgID());
if(bRegister)
{registry->RootKey=HKEY_CURRENT_USER;
registry->OpenKey(Key,true);
registry->WriteString("Description","WordAddin");
registry->WriteString("FriendlyName","WordAddin");
registry->WriteInteger("LoadBehavior",3);
registry->CloseKey();
}
else
{registry->RootKey=HKEY_CURRENT_USER;
registry->DeleteKey(Key);
}
delete registry;

TTypedComServerRegistrarT
regObj(GetObjectCLSID(), GetProgID(), GetDescription());
return regObj.UpdateRegistry(bRegister);
}


BEGIN_COM_MAP(TAddinImpl)
COM_INTERFACE_ENTRY(_IDTExtensibility2)
COM_INTERFACE_ENTRY2(IDispatch, _IDTExtensibility2)
END_COM_MAP()
BEGIN_SINK_MAP(TAddinImpl)
SINK_ENTRY_INFO(1, DIID__CommandBarButtonEvents,/*dispid*/ 0x01, OnClickButton, &OnClickButtonInfo)
END_SINK_MAP()
// _IDTExtensibility2
public:
void __stdcall OnClickButton(IDispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault);
STDMETHOD(OnAddInsUpdate(LPSAFEARRAY* custom));
STDMETHOD(OnBeginShutdown(LPSAFEARRAY* custom));
STDMETHOD(OnConnection(LPDISPATCH Application,
Addindesignerobjects_tlb::ext_ConnectMode ConnectMode,
LPDISPATCH AddInInst, LPSAFEARRAY* custom));
STDMETHOD(OnDisconnection(
Addindesignerobjects_tlb::ext_DisconnectMode RemoveMode,
LPSAFEARRAY* custom));
STDMETHOD(OnStartupComplete(LPSAFEARRAY* custom));
private:
CComPtr m_spButton;
};
#endif //AddinImplH



[/code]
編輯記錄
bugmans 重新編輯於 2011-01-21 22:45:21, 註解 無‧
bugmans 重新編輯於 2011-01-21 22:48:37, 註解 無‧
系統時間:2024-11-23 1:03:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!