如何写一个注册的类? 该怎么写?谢谢了先! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TOutlookBarEditor = class(TComponentEditor) function GetVerb(Index: Integer): string; override; function GetVerbCount: Integer; override ; procedure Edit; override; procedure ExecuteVerb(Index: Integer); override; end; Delphi中用户可以自己声明属性编辑器在程序设计期间对第三方控件进行设计,对属性编辑器的声明可以在注册控件的时候通过RegisterComponentEditor过程进行定义,具体为: procedure RegisterComponentEditor(ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass); 当然,用户在注册前要定义自己的属性编辑器,下面是一个例子: TOutlookBarEditor = class(TComponentEditor) function GetVerb(Index: Integer): string; override; function GetVerbCount: Integer; override ; procedure Edit; override; procedure ExecuteVerb(Index: Integer); override; end; 其中最关键的部分在于对RegisterComponentEditor的引用。 在Delphi5.0中,可以直接将$(DELPHI)\Source\ToolsAPI目录下的DsgnIntf.pas文件拷贝到控件的设计目录下或者拷贝到$(DELPHI)\Lib目录即可。 在Delphi6.0中,Delphi将文件分解成DesignIntf.pas和DesignEditors.pas两个文件,所以引用时要将$(DELPHI)\Source\ToolsAPI目录下的DesignIntf.pas和DesignEditors.pas两个文件拷贝到控件的设计目录下或者拷贝到$(DELPHI)\Lib目录。 当然,如果你的Delphi Package的搜索路径或者Delphi IDE的搜索路径可以搜索到$(DELPHI)\Source\ToolsAPI目录就省去此麻烦。 但是,在Delphi 6.0中,如果就此编译,会出现找不到Proxies.dcu文件的问题。因为Proxies被编译了,在Delphi的目录中根本就找不到此相关文件,它已经被编译到designide.dcp文件中,解决方案很简单,就是在你的Package中引用designide.dcp文件即可,具体作法是: Project->View Source->在requires部分加入对designide的引用即可。 由于此部分文件只是在设计期间才有效,所以你的Package在设计时就要注意: 不要在运行期间将在进行期间使用的文件加入对DesignIntf.pas和DesignEditors.pas两个文件的引用,否则依然会出现找不到Proxies.dcu文件的问题,要将文件脱离! 当然,如果你的Package要在Delphi 5.0及Delphi6.0下同时能运行,那就要下点功夫通过编辑器的版本进行控制,Delphi 6.0的编辑器版本是VER140,Delphi 5.0的编辑器版本是VER130,下面是本人的一个真实的引用文件: uses Classes, {$IFDEF VER140}DesignIntf, DesignEditors{$ELSE}DsgnIntf{$ENDIF}; Package部分由于版本不同而对不同的版本要进行不同的设计,再此就不叙述了! 其它补记:由于Delphi 5.0和Delphi 6.0对过程及参数的定义区域不同而出现错误,所以在编写两个版本的Package时一定要注意引用虚函数时出现的问题。例如对TControl控件的SetAutoSize(Value: Boolean)过程的引用: 在Delphi 5.0中定义为: private procedure SetAutoSize(Value: Boolean); 而在Delphi 6.0中定义为: protected procedure SetAutoSize(Value: Boolean); virtual; 此时的定义要根据自己的实际情况定义了,可不能随便定义了! 在Delphi程序中操作注册表 --------------------------------------------------------------------------------32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。 一、创建和释放TRegistry对象 1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create; 2.释放TRegistry对象。对注册表操作结束后,应释放TRegistry对象所占内存:ARegistry.Destroy。 二、指定要操作的键 操作注册表时,首先应指定操作的主键:先给属性RootKey赋值以指定根键,然后用方法OpenKey来指定要操作的主键名。 1.指定根键(RootKey)。 根键是注册表的入口,也注册表信息的分类,其值可为: HKEY-CLASSES-ROOT:存储整个系统对象类信息,如ActiveX对象注册、文件关联等信息。 HKEY-CURRENT-USER:存储当前用户的配置信息。为属性RootKey的默认值。 HKEY-LOCAL-MACHINE:存储当前系统的软硬件配置信息。应用程序自己的信息可以存储在该根键下。 HKEY-USERS:存储所有用户通用的配置信息。 还可以是HKEY-CURRENT-CONFIG、HKEY-DYN-DATA。 2.指定要操作的主键。 Function OpenKey(const Key: string; CanCreate: Boolean): Boolean; Key:主键名,是键名全名中除去根键的部分,如Software。 CanCreate:在指定的主键名不存在时,是否允许创建该主键,True表示允许。 返回值True表示操作成功。 3.关闭当前主键。 在读取或存储信息之后,应及时将关闭当前主键:procedure CloseKey。 三、从注册表中读取信息 Read系列方法从注册表读取指定的信息(字符串、二进制和十六进制),并转换为指定的类型。 1.Read系列方法。 function ReadString(const Name: string): string; 读取一个字符串值,Name为字符串名称。 function ReadInteger(const Name: string): Integer; 读取一个整数值,Name为整数名称。 function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer):Integer; 读取二进制值,Name为二进制值名称,Buffer为接收缓冲区,BufSize为缓冲区大小,返回为实际读取的字节数。 其它方法还有:ReadBool、ReadCurrency、ReadDate、ReadDateTime、ReadFloat、ReadTime。 2.读取信息一例(显示Windows的版本)。 在HKEY-LOCAL-MACHINE下,有三个字符串值Version、VersionNumber和SubVersionNumber,用于记录当前Windows的版本号。 {请在Uses中包含Registry单元} procedure TForm1.Button1Click(Sender:TObject); var ARegistry : TRegistry; begin ARegistry := TRegistry.Create; //建立一个TRegistry实例 with ARegistry do begin RootKey := HKEY-LOCAL-MACHINE;//指定根键为HKEY-LOCAL-MACHINE //打开主键Software if OpenKey( ′Software′,false ) then begin memo1.lines.add('Windows版本:′+ ReadString(′Version′)); memo1.lines.add('Windows版本号:′ + ReadString(′VersionNumber′)); memo1.lines.add(′Windows子版本号:′ + ReadString(′SubVersionNumber′)); end; CloseKey;//关闭主键 Destroy;//释放内存 end; end; 四、向注册表中写入信息 Write系列方法将信息转化为指定的类型,并写入注册表。 1.Write系列方法。 procedure WriteString(const Name, Value: string); 写入一个字符串值,Name为字符串的名称,Value为字符串值。 procedure WriteInteger(const Name: string; Value: Integer); 写入一个整数值。 procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer); 写入二进制值,Name为二进制值的名称,Buffer为包含二进制值的缓冲区,BufSize为缓冲区大小。 其它方法还有:WriteBool、WriteCurrency、WriteDate、WriteDateTime、WriteFloat、WriteTime。 2.写入信息一例。 下面程序使Delphi随Windows启动而自动运行。 var ARegistry : TRegistry; begin ARegistry := TRegistry.Create; //建立一个TRegistry实例 with ARegistry do begin RootKey:=HKEY-LOCAL-MACHINE; if OpenKey(′Software′,True) then WriteString(′delphi′,′C:Files.exe′); CloseKey; Destroy; end; end; 五、键值维护 除了在注册表中读取、存储外,程序可能还需要增加主键、删除主键、主键改名、数据值改名等。 1.创建新主键:function CreateKey(const Key: string): Boolean。 Key即为主键名,返回值True表示操作成功。 2.删除主键:function DeleteKey(const Key: string): Boolean。 Key即为主键名,返回值True表示操作成功。 3.复制或移动主键:procedure MoveKey(const OldName, NewName: string; Delete: Boolean)。 OldName、NewName分别表示源主键名和目标主键名;Delete表示是否删除源主键,True表示删除,False表示保留。 复制或移动一个主键将复制或移动该子键下的所有数据值和子键内容。 4.判断指定主键是否存在,其下是否有主键,并获取主键名称。 KeyExists用于判断指定主键是否存在: function KeyExists(const Key: string): Boolean;//返回值为True表示主键存在。 HasSubKeys用于判断指定主键下是否有子键:function HasSubKeys: Boolean; 返回值为True表示主键下有子键。 GetKeyNames用于获取子键名称:procedure GetKeyNames(Strings: TStrings); Strings用于返回当前主键下各子键的名称。 5.获取主键下的数据值名称:procedure GetValueNames(Strings: TStrings)。 Strings用于返回当前主键下各数值名称。 如要获取当前系统中的拨号连接名称,可利用获取主键HKEY-USERS .DEFAULT下的数值名称的方法来进行。 6.判断数值名称存在、数值名称改名。 ValueExists用于判断数值名称是否存在: function ValueExists(const Name: string): Boolean; 返回值为True表示数值名称存在。 RenameValue用于数值名称改名: procedure RenameValue(const OldName, NewName: string); 以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。 to rmichael: 谢谢你,我是想知道怎样写一个注册的类,不是操作注册表,并不一定是注册表加密,也可以是其它的方式。 initialization registerclasses([TApplication,TButton,TForm])end; 如何产生 定长的 不重复 的字符串 最好是 数字 字母 组合 一个比较棘手的问题,大家有没有好建议 DELPHI登陆窗体怎么制作啊~!!连接数据库 Delphi多人开发,一般都用什么源代码管理工具啊? 我很困惑。。。。 能通过internet网访问SQL SERVER吗? 现在在DBEdit里能显示日期,但在我的DBGrid里不能同步显示,请问这是什么原因?TKS!!! 数据库组件放在dataMoudle还是在窗体中 高难度!!!UP也有分!! 求教:Query中DBMemo的Update问题 帮我想想在DLL中用什么类型的参数合适 关于QuickRep1.PrinterSetup;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override ;
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
end;
属性编辑器的声明可以在注册控件的时候通过RegisterComponentEditor过程进行定义,
具体为:
procedure RegisterComponentEditor(ComponentClass: TComponentClass; Compo
nentEditor: TComponentEditorClass);
当然,用户在注册前要定义自己的属性编辑器,下面是一个例子:
TOutlookBarEditor = class(TComponentEditor)
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override ;
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
end;
其中最关键的部分在于对RegisterComponentEditor的引用。
在Delphi5.0中,可以直接将$(DELPHI)\Source\ToolsAPI目录下的DsgnIntf.pas文
件拷贝到控件的设计目录下或者拷贝到$(DELPHI)\Lib目录即可。
在Delphi6.0中,Delphi将文件分解成DesignIntf.pas和DesignEditors.pas两个文
件,所以引用时要将$(DELPHI)\Source\ToolsAPI目录下的DesignIntf.pas和DesignEdi
tors.pas两个文件拷贝到控件的设计目录下或者拷贝到$(DELPHI)\Lib目录。
当然,如果你的Delphi Package的搜索路径或者Delphi IDE的搜索路径可以搜索到
$(DELPHI)\Source\ToolsAPI目录就省去此麻烦。
但是,在Delphi 6.0中,如果就此编译,会出现找不到Proxies.dcu文件的问题。因
为Proxies被编译了,在Delphi的目录中根本就找不到此相关文件,它已经被编译到des
ignide.dcp文件中,解决方案很简单,就是在你的Package中引用designide.dcp文件即
可,具体作法是:
Project->View Source->在requires部分加入对designide的引用即可。
由于此部分文件只是在设计期间才有效,所以你的Package在设计时就要注意:
不要在运行期间将在进行期间使用的文件加入对DesignIntf.pas和DesignEditors.
pas两个文件的引用,否则依然会出现找不到Proxies.dcu文件的问题,要将文件脱离! 当然,如果你的Package要在Delphi 5.0及Delphi6.0下同时能运行,那就要下点功
夫通过编辑器的版本进行控制,Delphi 6.0的编辑器版本是VER140,Delphi 5.0的编辑
器版本是VER130,下面是本人的一个真实的引用文件:
uses
Classes, {$IFDEF VER140}DesignIntf, DesignEditors{$ELSE}DsgnIntf{$ENDI
F};
Package部分由于版本不同而对不同的版本要进行不同的设计,再此就不叙述了!
其它补记:由于Delphi 5.0和Delphi 6.0对过程及参数的定义区域不同而出现错误
,所以在编写两个版本的Package时一定要注意引用虚函数时出现的问题。例如对TCont
rol控件的SetAutoSize(Value: Boolean)过程的引用:
在Delphi 5.0中定义为:
private
procedure SetAutoSize(Value: Boolean);
而在Delphi 6.0中定义为:
protected
procedure SetAutoSize(Value: Boolean); virtual;
此时的定义要根据自己的实际情况定义了,可不能随便定义了!
--------------------------------------------------------------------------------
32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。
一、创建和释放TRegistry对象 1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create; 2.释放TRegistry对象。对注册表操作结束后,应释放TRegistry对象所占内存:ARegistry.Destroy。 二、指定要操作的键 操作注册表时,首先应指定操作的主键:先给属性RootKey赋值以指定根键,然后用方法OpenKey来指定要操作的主键名。 1.指定根键(RootKey)。 根键是注册表的入口,也注册表信息的分类,其值可为: HKEY-CLASSES-ROOT:存储整个系统对象类信息,如ActiveX对象注册、文件关联等信息。 HKEY-CURRENT-USER:存储当前用户的配置信息。为属性RootKey的默认值。 HKEY-LOCAL-MACHINE:存储当前系统的软硬件配置信息。应用程序自己的信息可以存储在该根键下。 HKEY-USERS:存储所有用户通用的配置信息。 还可以是HKEY-CURRENT-CONFIG、HKEY-DYN-DATA。 2.指定要操作的主键。 Function OpenKey(const Key: string; CanCreate: Boolean): Boolean; Key:主键名,是键名全名中除去根键的部分,如Software。 CanCreate:在指定的主键名不存在时,是否允许创建该主键,True表示允许。 返回值True表示操作成功。 3.关闭当前主键。 在读取或存储信息之后,应及时将关闭当前主键:procedure CloseKey。 三、从注册表中读取信息 Read系列方法从注册表读取指定的信息(字符串、二进制和十六进制),并转换为指定的类型。 1.Read系列方法。 function ReadString(const Name: string): string; 读取一个字符串值,Name为字符串名称。 function ReadInteger(const Name: string): Integer; 读取一个整数值,Name为整数名称。 function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer):Integer; 读取二进制值,Name为二进制值名称,Buffer为接收缓冲区,BufSize为缓冲区大小,返回为实际读取的字节数。 其它方法还有:ReadBool、ReadCurrency、ReadDate、ReadDateTime、ReadFloat、ReadTime。 2.读取信息一例(显示Windows的版本)。 在HKEY-LOCAL-MACHINE下,有三个字符串值Version、VersionNumber和SubVersionNumber,用于记录当前Windows的版本号。 {请在Uses中包含Registry单元} procedure TForm1.Button1Click(Sender:TObject); var ARegistry : TRegistry; begin ARegistry := TRegistry.Create; //建立一个TRegistry实例 with ARegistry do begin RootKey := HKEY-LOCAL-MACHINE;//指定根键为HKEY-LOCAL-MACHINE //打开主键Software if OpenKey( ′Software′,false ) then begin memo1.lines.add('Windows版本:′+ ReadString(′Version′)); memo1.lines.add('Windows版本号:′ + ReadString(′VersionNumber′)); memo1.lines.add(′Windows子版本号:′ + ReadString(′SubVersionNumber′)); end; CloseKey;//关闭主键 Destroy;//释放内存 end; end; 四、向注册表中写入信息 Write系列方法将信息转化为指定的类型,并写入注册表。 1.Write系列方法。 procedure WriteString(const Name, Value: string); 写入一个字符串值,Name为字符串的名称,Value为字符串值。 procedure WriteInteger(const Name: string; Value: Integer); 写入一个整数值。 procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer); 写入二进制值,Name为二进制值的名称,Buffer为包含二进制值的缓冲区,BufSize为缓冲区大小。 其它方法还有:WriteBool、WriteCurrency、WriteDate、WriteDateTime、WriteFloat、WriteTime。 2.写入信息一例。 下面程序使Delphi随Windows启动而自动运行。 var ARegistry : TRegistry; begin ARegistry := TRegistry.Create; //建立一个TRegistry实例 with ARegistry do begin RootKey:=HKEY-LOCAL-MACHINE; if OpenKey(′Software′,True) then WriteString(′delphi′,′C:Files.exe′); CloseKey; Destroy; end; end; 五、键值维护 除了在注册表中读取、存储外,程序可能还需要增加主键、删除主键、主键改名、数据值改名等。 1.创建新主键:function CreateKey(const Key: string): Boolean。 Key即为主键名,返回值True表示操作成功。 2.删除主键:function DeleteKey(const Key: string): Boolean。 Key即为主键名,返回值True表示操作成功。 3.复制或移动主键:procedure MoveKey(const OldName, NewName: string; Delete: Boolean)。 OldName、NewName分别表示源主键名和目标主键名;Delete表示是否删除源主键,True表示删除,False表示保留。 复制或移动一个主键将复制或移动该子键下的所有数据值和子键内容。 4.判断指定主键是否存在,其下是否有主键,并获取主键名称。 KeyExists用于判断指定主键是否存在: function KeyExists(const Key: string): Boolean;//返回值为True表示主键存在。 HasSubKeys用于判断指定主键下是否有子键:function HasSubKeys: Boolean; 返回值为True表示主键下有子键。 GetKeyNames用于获取子键名称:procedure GetKeyNames(Strings: TStrings); Strings用于返回当前主键下各子键的名称。 5.获取主键下的数据值名称:procedure GetValueNames(Strings: TStrings)。 Strings用于返回当前主键下各数值名称。 如要获取当前系统中的拨号连接名称,可利用获取主键HKEY-USERS .DEFAULT下的数值名称的方法来进行。 6.判断数值名称存在、数值名称改名。 ValueExists用于判断数值名称是否存在: function ValueExists(const Name: string): Boolean; 返回值为True表示数值名称存在。 RenameValue用于数值名称改名: procedure RenameValue(const OldName, NewName: string); 以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。
谢谢你,我是想知道怎样写一个注册的类,不是操作注册表,并不一定是注册表加密,也可以是其它的方式。
registerclasses([TApplication,TButton,TForm])
end;