需要將一非可視化的控制元件(和TTable功能類似)封裝為Activex控制元件。
(這里我是模仿這個教程做的http://blog.csdn.net/jaminwm/article/details/463953)
對C++builder不熟悉,自己摸索著弄。按照搜索的例子,模仿著實驗將TTable封裝為Activex控制元件,步驟如下:
⑴打開bcb6,打開File/New/ActiveX專案頁,選擇ActiveX Library;
⑵繼續添加,打開File/New/ActiveX屬性頁,選擇Automation Object,命名為TMyTable
我不知道怎么講TTable類封裝這里邊。
希望能幫助看看,實作具體的封裝方法!
在TMyTableImpl.h下,我原本想,讓這個類直接繼承TTable類,但是不行
TMyTableImpl.h檔案:
// MYTABLEIMPL.H : Declaration of the TMyTableImpl
#ifndef MyTableImplH
#define MyTableImplH
#define ATL_APARTMENT_THREADED
#include <atl\atlvcl.h>
#include "Project1_TLB.H"
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <DB.hpp>
#include <DBTables.hpp>
/////////////////////////////////////////////////////////////////////////////
// TMyTableImpl Implements IMyTable, default interface of MyTable
// ThreadingModel : Apartment
// Dual Interface : TRUE
// Event Support : FALSE
// Default ProgID : Project1.MyTable
// Description :
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE TMyTableImpl :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<TMyTableImpl, &CLSID_MyTable>,
public IDispatchImpl<IMyTable, &IID_IMyTable, &LIBID_Project1>
{
public:
TMyTableImpl()
{
}
// Data used when registering Object
//
DECLARE_THREADING_MODEL(otApartment);
DECLARE_PROGID("Project1.MyTable");
DECLARE_DESCRIPTION("");
// Function invoked to (un)register object
//
static HRESULT WINAPI UpdateRegistry(BOOL bRegister)
{
TTypedComServerRegistrarT<TMyTableImpl>
regObj(GetObjectCLSID(), GetProgID(), GetDescription());
return regObj.UpdateRegistry(bRegister);
}
BEGIN_COM_MAP(TMyTableImpl)
COM_INTERFACE_ENTRY(IMyTable)
COM_INTERFACE_ENTRY2(IDispatch, IMyTable)
END_COM_MAP()
// IMyTable
public:
STDMETHOD(set_Active(VARIANT_BOOL Param1));
STDMETHOD(set_DatabaseName(BSTR Param1));
STDMETHOD(Open());
STDMETHOD(Close());
STDMETHOD(set_TableName(BSTR Param1));
STDMETHOD(get_Active(VARIANT_BOOL* Value));
private:
TTable* m_Table;
};
#endif //MyTableImplH
TMyTableImpl.cpp檔案
// MYTABLEIMPL : Implementation of TMyTableImpl (CoClass: MyTable, Interface: IMyTable)
#include <vcl.h>
#pragma hdrstop
#include <atl\atlvcl.h>
#include "MYTABLEIMPL.H"
/////////////////////////////////////////////////////////////////////////////
// TMyTableImpl
#pragma package(smart_init)
STDMETHODIMP TMyTableImpl::set_Active(VARIANT_BOOL Param1)
{
try
{
//m_Table->Active = Param1;
m_Table->Active = Param1;
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyTable);
}
return S_OK;
};
STDMETHODIMP TMyTableImpl::set_DatabaseName(BSTR Param1)
{
try
{
//m_Table->DatabaseName = Param1;
m_Table->DatabaseName = "db.mdb";
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyTable);
}
return S_OK;
};
STDMETHODIMP TMyTableImpl::Open()
{
m_Table->Open();
}
STDMETHODIMP TMyTableImpl::Close()
{
m_Table->Close();
}
STDMETHODIMP TMyTableImpl::set_TableName(BSTR Param1)
{
try
{
//m_Table->TableName=Value;
m_Table->TableName="tb_user";
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyTable);
}
return S_OK;
};
STDMETHODIMP TMyTableImpl::get_Active(VARIANT_BOOL* Value)
{
try
{
*Value=https://bbs.csdn.net/topics/m_Table->Active;
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyTable);
}
return S_OK;
};
uj5u.com熱心網友回復:
控制元件new出來就成了。uj5u.com熱心網友回復:
應該在哪里new出來,我在介面方法哪里,用TTable* tab=new TTable(NULL)一個,在使用的時候報錯。
uj5u.com熱心網友回復:
控制元件做好后,要添加到BCB的ide的組件面板上,這樣就可以直接在設計器里拖進來。uj5u.com熱心網友回復:
頂啊 希望有人幫幫忙!uj5u.com熱心網友回復:
放棄ActiveX吧,這個技術現在不值得學習了。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/72743.html
