谢谢各位的帮忙,我按照上面的方法都不行,加上DesignIntf, DesignEditors后,控件倒是
可以安装,但是安装后不能使用,程序老提示没有proxies.duc,我发现是designeditors中
调用了proxies,好像是个代理的什么东西,但是delphi带的例子程序pielib.dpk确没有
这种错误,我看了程序也没发现什么不一样的的地方。我的dpk文件中也包含了designide.dcp
vcl.dcp,vclx.dcp,rtl.dcp,应该不会有露过的地方,下面我把源码贴出来,大家再帮我看下,
另外这儿还有两个问题,1,我重载了create,设置text='',为什么生成的控件text确不为空呢
2,如何从面版上彻底删除自己安装的组件呢,我把dpk中pas文件载编译,好像可以,但这样
太麻烦了,还有没有其他好的办法呢?我的信箱kangdeguo@sohu.com,mikewolf_gkd@sohu.com,mikewolf_gkd@163.com
大家如果有属性编辑器控件的例子请发给我一份 谢谢!!!
unit GGkdEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls,
Graphics, StrUtils,DesignIntf,DesignEditors,Dialogs;//graphics为Tbitmap需要,strUtils为rightstr需要
type
aboutstring= record
name:string;
version:string;
email:string;
end;
//数字编辑框
TNumEdit = class(TEdit)
private
FRollInput: boolean;
FAbout: AboutString;
procedure SetRollInput(const Value: boolean);
procedure SetAbout(const Value: AboutString);
protected
procedure KeyPress(var Key: Char); override;
public
//重载TEdit的创建方法,这是一个构造函数
constructor Create(AOwner:TComponent);override ;
published
//定义是否允许属性编辑框滚动输入属性,缺省为true
property RollInput:boolean read FRollInput write SetRollInput default true;
property About:AboutString read FAbout write SetAbout;
end;
//About的属性编辑器
TAboutProperty = class(TPropertyEditor)
public
procedure Edit;override;
function GetAttributes:TPropertyAttributes;override;
function GetValue:string;override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('GControl', [TNumEdit]);
RegisterPropertyEditor(TypeInfo(AboutString),nil,'',TAboutProperty);
end;
{ TNumEdit }
constructor TNumEdit.Create(AOwner: TComponent);
begin
//首先继承TEdit的create
inherited create(AOwner);
//下面为自己添加的代码
//定义缺省的字体,Arial,根据自己的经验,此种字体在各个系统中显示比较整齐
//没有毛边现象
Font.Name:='Arial';
//定义字体的大小,这儿为11,即为5号字
Font.Size:=11;
//设置编辑框初始值为空,因为每次我加入一个编辑框第一件事就是清空它。
Text:='';
//初始可以滚动编辑框
RollInput:=True;
end;
procedure TNumEdit.KeyPress(var Key: Char);
var
cRect:TRect;
bm:TBitmap;
begin
//继承TEdit的keypress处理...
inherited KeyPress(key);
//输入滚动的处理
//如果不为Tab键、回车键、左移方向键、回退键、而且是否滚动属性为false,进行处理
if (not RollInput) and (ord(key)<>VK_TAB) and (ord(key)<>VK_RETURN) and (ord(key)<>VK_LEFT) and (ord(key)<>VK_BACK) then
begin
Windows.GetClientRect(self.Handle,cRect); //获取编辑框的客户区
bm:=TBitmap.Create; //创建一个位图
//设置位图的高度、宽度使和编辑框的高度、宽度相同,设置位图的字体和编即框一样
bm.Width :=cRect.Right;
bm.Height:=cRect.Bottom;
bm.Canvas.Font :=self.Font ;
if bm.Canvas.TextWidth(self.Text+key)>cRect.Right then
//如果超出范围,则把当前字符修改无效字符
key:=#0;
bm.free; //释放位图资源
end;
//不是数字的处理
if ((key<'0') or (key>'9')) and (key<>char(VK_BACK)) then
key:=chr(0);
end;
procedure TNumEdit.SetAbout(const Value: AboutString);
begin
FAbout := Value;
end;
procedure TNumEdit.SetRollInput(const Value: boolean);
begin
FRollInput := Value;
end;
{ TAboutProperty }
procedure TAboutProperty.Edit;
var
msg:string;
begin
inherited;
msg:='TNumEdit组件'+chr(13)+chr(10)+'Edited by 郭康德,2002-08-11';
msg:=msg+chr(13)+chr(10)+'Email:kangdeguo@sohu.com';
Showmessage(msg);
end;
function TAboutProperty.GetAttributes: TPropertyAttributes;
begin
Result:=[paMultiSelect,padialog,paReadOnly];
end;
function TAboutProperty.GetValue: string;
begin
Result:='Click On...for About box';
end;
end.