作者:nancy_liu_tj | 来源:互联网 | 2023-09-23 20:56
组件是.cpp和.h文件,已经编绎通过,可以生成bpl文件。现在的问题是怎样把这个自定义的组件安装到IDE的工具面板中,使之可以像TEdit那样可以在设计期放在窗体中。请告诉详细的方法
组件是.cpp和.h文件,已经编绎通过,可以生成bpl文件。
现在的问题是怎样把这个自定义的组件安装到IDE的工具面板中,使之可以像TEdit那样可以在设计期放在窗体中。
请告诉详细的方法,分不够可以再加。
谢谢!
28 个解决方案
Component-->Install Packages-->找到bpl文件添加,确定.
如果你的组件写的标准,新建一个工程时,在对应的选项卡下就可以看到有新的组件图标。拖放到窗体上即可。
//妖哥请看:
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "RichEdit4.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TRichEdit4 *)
{
new TRichEdit4(NULL);
}
//---------------------------------------------------------------------------
__fastcall TRichEdit4::TRichEdit4(TComponent* Owner)
: TCustomRichEdit(Owner)
{
hWnd_Richedit41 = NULL;
WantTabs = true;
}
//---------------------------------------------------------------------------
namespace Richedit41
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TRichEdit4)};
RegisterComponents(L"Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TRichEdit4::CreateParams(Controls::TCreateParams &Params)
{
hWnd_Richedit41 = LoadLibraryW(L"msftedit.dll");
if ((int)hWnd_Richedit41 == HINSTANCE_ERROR) hWnd_Richedit41 = 0;
TCustomRichEdit::CreateParams(Params);
CreateSubClass(Params, L"RichEdit50W");
}
//---------------------------------------------------------------------------
void __fastcall TRichEdit4::CreateWnd(void)
{
TCustomRichEdit::CreateWnd();
}
//---------------------------------------------------------------------------
void __fastcall TRichEdit4::DestroyWnd(void)
{
TCustomRichEdit::DestroyWnd();
}
//---------------------------------------------------------------------------
__fastcall TRichEdit4::~TRichEdit4()
{
if ((int)hWnd_Richedit41 != NULL) FreeLibrary(hWnd_Richedit41);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//RichEdit4.h
#ifndef RichEdit4H
#define RichEdit4H
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
class PACKAGE TRichEdit4 : public TCustomRichEdit
{
private:
HINSTANCE hWnd_Richedit41;
protected:
virtual void __fastcall CreateParams(Controls::TCreateParams &Params);
virtual void __fastcall CreateWnd(void);
virtual void __fastcall DestroyWnd(void);
public:
__fastcall TRichEdit4(TComponent* Owner);
__fastcall ~TRichEdit4();
__published:
};
//---------------------------------------------------------------------------
#endif
另外有件事请妖哥帮忙.
我有时候发错了帖子不能编辑修改,请妖哥给我一个编辑的权限.
妖哥真神,这种错误都能发现。
现在可以安装组件了,在SAMPLES面板也看得到组件。
但,将此组件置入一个空窗体,编绎链接,则会出错,首先是提示找不到RichEdit4.bpi,然后提示UNIT1.cpp里RichEdit4::什么什么错误。。。。
下面是改好后的源码:
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "RichEdit4.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TRichEdit4 *)
{
new TRichEdit4(NULL);
}
//---------------------------------------------------------------------------
__fastcall TRichEdit4::TRichEdit4(TComponent* Owner)
: TCustomRichEdit(Owner)
{
hWnd_Richedit4 = NULL;
WantTabs = true;
}
//---------------------------------------------------------------------------
namespace Richedit4
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TRichEdit4)};
RegisterComponents(L"Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TRichEdit4::CreateParams(Controls::TCreateParams &Params)
{
hWnd_Richedit4 = LoadLibraryW(L"msftedit.dll");
if ((int)hWnd_Richedit4 == HINSTANCE_ERROR) hWnd_Richedit4 = 0;
TCustomRichEdit::CreateParams(Params);
CreateSubClass(Params, L"RichEdit50W");
}
//---------------------------------------------------------------------------
void __fastcall TRichEdit4::CreateWnd(void)
{
TCustomRichEdit::CreateWnd();
}
//---------------------------------------------------------------------------
void __fastcall TRichEdit4::DestroyWnd(void)
{
TCustomRichEdit::DestroyWnd();
}
//---------------------------------------------------------------------------
__fastcall TRichEdit4::~TRichEdit4()
{
if ((int)hWnd_Richedit4 != NULL) FreeLibrary(hWnd_Richedit4);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//RichEdit4.h
#ifndef RichEdit4H
#define RichEdit4H
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
class PACKAGE TRichEdit4 : public TCustomRichEdit
{
private:
HINSTANCE hWnd_Richedit4;
protected:
virtual void __fastcall CreateParams(Controls::TCreateParams &Params);
virtual void __fastcall CreateWnd(void);
virtual void __fastcall DestroyWnd(void);
public:
__fastcall TRichEdit4(TComponent* Owner);
__fastcall ~TRichEdit4();
__published:
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
麻烦妖哥再帮我看看,问题出在哪。
不可能。你好好找找吧。看看工程目录中设置的lib文件输出到哪个目录去了?
建议你安装到一个新的package中,这样会产生独立的对应的bpi和lib文件。默认的话,应该是安装到dclusr.bpl中去了。
应该还目录设置的问题,我整了一个例子,你去这里下载看看:
http://down.ccrun.com/temp/richedit4.7z
BTW:我个人习惯设置工程目录的最终输出到Bin目录下,Lib目录设置为_Lib
找不到borlndmm相关这个不怕,你用Release模式编译以后就可以了。
记的设置一下release配置中,取消Use Dynamic library前面的对钩。
汗,费这么大劲,原来是想在RichEdit中帖图啊。貌似你这个代码没有多大用处的。因为你的组件是从TCustomRichEdit继承的,应该还是原生的版本。而不是2.0以后的RichEdit。
关于支持贴图及其他富文本格式的RichEdit,实现起来挺麻烦的(如果你参考过RichView组件的源码就知道了)
我以前只简单的加载过RichEdit2.0,没有再深层次的研究过。至于在RichEdit中插入位图,通过richole单元的支持,也是可以实现的。但是并不完美。
如果你愿意花点时间研究一下RichView的实现,可能收获比较多,但是工作量也很大。
妖哥,突然想到一个问题:
能不能以第三方控件为基础,自制组件?
比如,以RxRichEdit为基础,自制一个RichEdit控件,不就可以实现相应的功能了吗?
是否可行?能不能脱离第三方控件运行、安装?
如果你要从RxRichEdit之类的三方组件继承的话,这就是依赖该组件了。
安装时需要带上原三方组件的bpl包。不合适。