现在的问题是怎样把这个自定义的组件安装到IDE的工具面板中,使之可以像TEdit那样可以在设计期放在窗体中。
请告诉详细的方法,分不够可以再加。
谢谢!
28 个解决方案
#1
Component-->Install Packages-->找到bpl文件添加,确定.
如果你的组件写的标准,新建一个工程时,在对应的选项卡下就可以看到有新的组件图标。拖放到窗体上即可。
如果你的组件写的标准,新建一个工程时,在对应的选项卡下就可以看到有新的组件图标。拖放到窗体上即可。
#2
楼主这个问题我觉得没有那么简单,肯定还有下文
#3
那是肯定的。这帖子没有20个回复结不了帐的。水源大牛请准备好搜索引擎。
#4
我用Component-->Install Packages-->找到bpl文件加入过,成功,而且在Install Component窗体能看到新加的组件,和dbgo之类的组件是并列的。
但,这似乎毫无意义,根本就没办法使用。
这并不是我要的效果,我是想把组件加入到工具面板中的samples之类的面板中。
#5
你需要修改你的组件单元中,关于RegisterComponents函数的参数。
至于"这似乎毫无意义,根本就没办法使用。",不清楚你的组件是如何写的,实现了什么功能。
#6
//妖哥请看:
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#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 <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
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
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#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 <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
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
#7
另外有件事请妖哥帮忙.
我有时候发错了帖子不能编辑修改,请妖哥给我一个编辑的权限.
我有时候发错了帖子不能编辑修改,请妖哥给我一个编辑的权限.
#8
Sorry, CSDN的帖子和回复,只有对应版块的版主才能编辑,普通用户没有权限,并且版主也没有办法管理用户的权限。
我先帮你看看组件的问题。
#9
namespace Richedit41
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TRichEdit4)};
RegisterComponents(L"Samples", classes, 0);
}
}
将红色部分改成:
namespace RichEdit4
就可以了。
#10
妖哥真神,这种错误都能发现。
现在可以安装组件了,在SAMPLES面板也看得到组件。
但,将此组件置入一个空窗体,编绎链接,则会出错,首先是提示找不到RichEdit4.bpi,然后提示UNIT1.cpp里RichEdit4::什么什么错误。。。。
下面是改好后的源码:
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#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 <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
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
//---------------------------------------------------------------------------
麻烦妖哥再帮我看看,问题出在哪。
现在可以安装组件了,在SAMPLES面板也看得到组件。
但,将此组件置入一个空窗体,编绎链接,则会出错,首先是提示找不到RichEdit4.bpi,然后提示UNIT1.cpp里RichEdit4::什么什么错误。。。。
下面是改好后的源码:
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#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 <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
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
//---------------------------------------------------------------------------
麻烦妖哥再帮我看看,问题出在哪。
#11
将组件包生成的aa.bpi和aa.lib所在的路径,加入到工程选项的lib目录中:
Project-->Options-->Directories and conditionals右侧的Library path-->找到上述的路径,Add进来,再编译即可。
#12
现在的问题是只有aa.bpl,没有aa.bpi和aa.lib
#13
不可能。你好好找找吧。看看工程目录中设置的lib文件输出到哪个目录去了?
#14
我就写了一个.cpp和一个.h,然后用Install Component菜单安装的。
#15
建议你安装到一个新的package中,这样会产生独立的对应的bpi和lib文件。默认的话,应该是安装到dclusr.bpl中去了。
#16
选安装到新package,会要求输入package名字,比如,输入RichEdit4,这时就会生成一个RichEdit4.bpl文件。但,还是没有bpi和lib。
我上面所说的错误,就是这种情况。
#17
躺着看……
#18
应该还目录设置的问题,我整了一个例子,你去这里下载看看:
http://down.ccrun.com/temp/richedit4.7z
BTW:我个人习惯设置工程目录的最终输出到Bin目录下,Lib目录设置为_Lib
http://down.ccrun.com/temp/richedit4.7z
BTW:我个人习惯设置工程目录的最终输出到Bin目录下,Lib目录设置为_Lib
#19
问题在于我不会整包,我只会写.cpp和.h,用若干个cpp和h组成一个大的程序,生成obj连接成exe。
不过,妖哥整的工程我编绎了,通过,也能安装,也能出现在面板上。
但是,之后,新建一个空窗体,放上一个TRichEdit4控件,运行,然后就杯具了。
显示:无法启动此程序,因为计算机中丢失了borlndmm.dat。尝试重新安装该程序以解决此问题。
不知道这是什么原因?
#20
找不到borlndmm相关这个不怕,你用Release模式编译以后就可以了。
记的设置一下release配置中,取消Use Dynamic library前面的对钩。
记的设置一下release配置中,取消Use Dynamic library前面的对钩。
#21
我用静态连接,通过了!
程序可以运行了。
但是,这个RichEdit还是不能贴入图片。
何故?
另外,那个找不到borlndmm.dat可能是我系统的原因,因为我刚才发现一个别的软件也突然不能运行了(不是我编的软件),也是报这个错。
是不是我今天折腾这个RichEdit,把系统给折腾坏了?要不要重装windows?
#22
汗,费这么大劲,原来是想在RichEdit中帖图啊。貌似你这个代码没有多大用处的。因为你的组件是从TCustomRichEdit继承的,应该还是原生的版本。而不是2.0以后的RichEdit。
关于支持贴图及其他富文本格式的RichEdit,实现起来挺麻烦的(如果你参考过RichView组件的源码就知道了)
关于支持贴图及其他富文本格式的RichEdit,实现起来挺麻烦的(如果你参考过RichView组件的源码就知道了)
#23
拷,就为了这破事,把我的windows都整残了。
要实现这个功能,除了用第三方控件之外,有其他简单点的办法没?
#24
我以前只简单的加载过RichEdit2.0,没有再深层次的研究过。至于在RichEdit中插入位图,通过richole单元的支持,也是可以实现的。但是并不完美。
如果你愿意花点时间研究一下RichView的实现,可能收获比较多,但是工作量也很大。
如果你愿意花点时间研究一下RichView的实现,可能收获比较多,但是工作量也很大。
#25
生命有限,就不去做无谓重复了。
还是决定用第三方控件了。
今天一天的折腾,已经让人元气大伤了。
#26
妖哥,突然想到一个问题:
能不能以第三方控件为基础,自制组件?
比如,以RxRichEdit为基础,自制一个RichEdit控件,不就可以实现相应的功能了吗?
是否可行?能不能脱离第三方控件运行、安装?
能不能以第三方控件为基础,自制组件?
比如,以RxRichEdit为基础,自制一个RichEdit控件,不就可以实现相应的功能了吗?
是否可行?能不能脱离第三方控件运行、安装?
#27
如果你要从RxRichEdit之类的三方组件继承的话,这就是依赖该组件了。
安装时需要带上原三方组件的bpl包。不合适。
安装时需要带上原三方组件的bpl包。不合适。
#28
确实不合适,谢谢妖哥指教!
#1
Component-->Install Packages-->找到bpl文件添加,确定.
如果你的组件写的标准,新建一个工程时,在对应的选项卡下就可以看到有新的组件图标。拖放到窗体上即可。
如果你的组件写的标准,新建一个工程时,在对应的选项卡下就可以看到有新的组件图标。拖放到窗体上即可。
#2
楼主这个问题我觉得没有那么简单,肯定还有下文
#3
那是肯定的。这帖子没有20个回复结不了帐的。水源大牛请准备好搜索引擎。
#4
我用Component-->Install Packages-->找到bpl文件加入过,成功,而且在Install Component窗体能看到新加的组件,和dbgo之类的组件是并列的。
但,这似乎毫无意义,根本就没办法使用。
这并不是我要的效果,我是想把组件加入到工具面板中的samples之类的面板中。
#5
你需要修改你的组件单元中,关于RegisterComponents函数的参数。
至于"这似乎毫无意义,根本就没办法使用。",不清楚你的组件是如何写的,实现了什么功能。
#6
//妖哥请看:
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#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 <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
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
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#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 <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
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
#7
另外有件事请妖哥帮忙.
我有时候发错了帖子不能编辑修改,请妖哥给我一个编辑的权限.
我有时候发错了帖子不能编辑修改,请妖哥给我一个编辑的权限.
#8
Sorry, CSDN的帖子和回复,只有对应版块的版主才能编辑,普通用户没有权限,并且版主也没有办法管理用户的权限。
我先帮你看看组件的问题。
#9
namespace Richedit41
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TRichEdit4)};
RegisterComponents(L"Samples", classes, 0);
}
}
将红色部分改成:
namespace RichEdit4
就可以了。
#10
妖哥真神,这种错误都能发现。
现在可以安装组件了,在SAMPLES面板也看得到组件。
但,将此组件置入一个空窗体,编绎链接,则会出错,首先是提示找不到RichEdit4.bpi,然后提示UNIT1.cpp里RichEdit4::什么什么错误。。。。
下面是改好后的源码:
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#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 <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
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
//---------------------------------------------------------------------------
麻烦妖哥再帮我看看,问题出在哪。
现在可以安装组件了,在SAMPLES面板也看得到组件。
但,将此组件置入一个空窗体,编绎链接,则会出错,首先是提示找不到RichEdit4.bpi,然后提示UNIT1.cpp里RichEdit4::什么什么错误。。。。
下面是改好后的源码:
//RichEdit4.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#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 <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
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
//---------------------------------------------------------------------------
麻烦妖哥再帮我看看,问题出在哪。
#11
将组件包生成的aa.bpi和aa.lib所在的路径,加入到工程选项的lib目录中:
Project-->Options-->Directories and conditionals右侧的Library path-->找到上述的路径,Add进来,再编译即可。
#12
现在的问题是只有aa.bpl,没有aa.bpi和aa.lib
#13
不可能。你好好找找吧。看看工程目录中设置的lib文件输出到哪个目录去了?
#14
我就写了一个.cpp和一个.h,然后用Install Component菜单安装的。
#15
建议你安装到一个新的package中,这样会产生独立的对应的bpi和lib文件。默认的话,应该是安装到dclusr.bpl中去了。
#16
选安装到新package,会要求输入package名字,比如,输入RichEdit4,这时就会生成一个RichEdit4.bpl文件。但,还是没有bpi和lib。
我上面所说的错误,就是这种情况。
#17
躺着看……
#18
应该还目录设置的问题,我整了一个例子,你去这里下载看看:
http://down.ccrun.com/temp/richedit4.7z
BTW:我个人习惯设置工程目录的最终输出到Bin目录下,Lib目录设置为_Lib
http://down.ccrun.com/temp/richedit4.7z
BTW:我个人习惯设置工程目录的最终输出到Bin目录下,Lib目录设置为_Lib
#19
问题在于我不会整包,我只会写.cpp和.h,用若干个cpp和h组成一个大的程序,生成obj连接成exe。
不过,妖哥整的工程我编绎了,通过,也能安装,也能出现在面板上。
但是,之后,新建一个空窗体,放上一个TRichEdit4控件,运行,然后就杯具了。
显示:无法启动此程序,因为计算机中丢失了borlndmm.dat。尝试重新安装该程序以解决此问题。
不知道这是什么原因?
#20
找不到borlndmm相关这个不怕,你用Release模式编译以后就可以了。
记的设置一下release配置中,取消Use Dynamic library前面的对钩。
记的设置一下release配置中,取消Use Dynamic library前面的对钩。
#21
我用静态连接,通过了!
程序可以运行了。
但是,这个RichEdit还是不能贴入图片。
何故?
另外,那个找不到borlndmm.dat可能是我系统的原因,因为我刚才发现一个别的软件也突然不能运行了(不是我编的软件),也是报这个错。
是不是我今天折腾这个RichEdit,把系统给折腾坏了?要不要重装windows?
#22
汗,费这么大劲,原来是想在RichEdit中帖图啊。貌似你这个代码没有多大用处的。因为你的组件是从TCustomRichEdit继承的,应该还是原生的版本。而不是2.0以后的RichEdit。
关于支持贴图及其他富文本格式的RichEdit,实现起来挺麻烦的(如果你参考过RichView组件的源码就知道了)
关于支持贴图及其他富文本格式的RichEdit,实现起来挺麻烦的(如果你参考过RichView组件的源码就知道了)
#23
拷,就为了这破事,把我的windows都整残了。
要实现这个功能,除了用第三方控件之外,有其他简单点的办法没?
#24
我以前只简单的加载过RichEdit2.0,没有再深层次的研究过。至于在RichEdit中插入位图,通过richole单元的支持,也是可以实现的。但是并不完美。
如果你愿意花点时间研究一下RichView的实现,可能收获比较多,但是工作量也很大。
如果你愿意花点时间研究一下RichView的实现,可能收获比较多,但是工作量也很大。
#25
生命有限,就不去做无谓重复了。
还是决定用第三方控件了。
今天一天的折腾,已经让人元气大伤了。
#26
妖哥,突然想到一个问题:
能不能以第三方控件为基础,自制组件?
比如,以RxRichEdit为基础,自制一个RichEdit控件,不就可以实现相应的功能了吗?
是否可行?能不能脱离第三方控件运行、安装?
能不能以第三方控件为基础,自制组件?
比如,以RxRichEdit为基础,自制一个RichEdit控件,不就可以实现相应的功能了吗?
是否可行?能不能脱离第三方控件运行、安装?
#27
如果你要从RxRichEdit之类的三方组件继承的话,这就是依赖该组件了。
安装时需要带上原三方组件的bpl包。不合适。
安装时需要带上原三方组件的bpl包。不合适。
#28
确实不合适,谢谢妖哥指教!