Delphi的TRegistry注册表类方法详解 ●GetDataInfo方法 Function GetDataInfo(const ValueName:String;Var Value:TRegDataInfo):Boolean; TregDataType=(rdunknown,rdstring,rdexpandstring,rdexpandstring,rdinterger,rdbinary); TregDataInfo=record Regdata:TRegDataType;数据类型 dataSize:integer;数据大小 end valuename:和当前键关联的数据值名称 value:返回数据的信息,如为rdstring和rdexpandstring类型,则数据大小包括字符串未尾的空结束字符。 如果成功返回True,失败返回False,并且Value的值为zeros rdexpandstring:是一个包含环境变量的字符串;如“%PATH%”。●CreateKey方法 Function CreateKey(const Key:string):Boolena; 新建一个名为Key的键,Key可以为绝对的或相对的名字,绝对名用反斜杠“\”开头,相对名是新建一个当前键的子键。新建没有值。 成功返回True,否则返回False,如果该键已存在将不产生效果。●DeleteKey方法 Function DeleteKey(const Key:string):Boolean; 删除一个键及相关联的数据,在win95中子键也将被删除,NT中子键必须一个个删除。●DeleteValue方法 Function DeleteValue (const Name:string):Boolean; 删除当前键中指定的一个数据值name。●GetDataSize方法 Function GetDataSize(const ValueName:string):integer; 返回当前键中一个指定数值ValueName数据的大小。●GetDataType方法 Function GetDataType(const Valuename;string):TRegDataType; 返回当前键中一个指定数值Valuename数据的类型。●GetKeyInfo方法 Function GetKeyInfo(var value:TRegkeyinfo):Boolean; 返回当前键的信息,在于value中。 TRegkeyinfo=record maxsubkeylen:integer;子键名的最长值(字节) numvalues:integer;键值的数量 maxvaluelen;最长的键值名的长度 Filetime:TFileTime;最后一次更改的时间 end;●Getkeynames方法 Procedure Getkeynames(strings:Tsrtings); 返回当前键所有子键的名子列表串。●Getvaluenames Procedure Getvaluenames(strings:Tstrings); 返回当前键所有键值名的列表串。●Hassubkeys方法 Function hassubKeys:Boolean; 判断当前键是否有子键,有返回True,否则返回False。●keyExists方法 Function KeyExists(const Key:string):Boolean; 判断指定的键是否存在。●LoadKey方法 Function LoadKey(const Key,fileNmae:string):Boolean; 在根键下新建 从一个文件中加载注册信息到子键中,文件注册信息中包含数据值名、子键和数据。 LoadKey使创建一个键单一化,子键,键值和数据在一人操作中完成,所有这些称为一组,和单独地创建它们不同应用程序可以在一个文件中读取一组数据,这在用户运行中重新设置有特别的用处。 Key为要创建子键的名子 FileName:为文件的位置,所指定的文件必须为以前用SaveKey函数或RegSaveKey API函数所建立的,文件名不能包括扩展名。●OpenKey方法 Function OpenKey(const Key:string;cancreate:Boolean):Boolean; 使用该函数可以指定一个键作为当前键,如果键为nil,则当前键 将设置为根键。 Cancreate决定是否在指定键不存在时创建该键,该函数创建的键的键值将不确定。 如果成功地打开或创建,该函数返回True。●OpenKeyReadOnly方法 function OpenKeyReadOnly(const Key: String): Boolean; 以只读的方式打开Key值指定的键。●CloseKey方法 procedure CloseKey; 当不再使用一个键时应用该方法关闭该键。●MoveKey方法 procedure MoveKey(const OldName, NewName: String; Delete: Boolean); 该方法移动或复制一个键到一个新的位置,并把键的名子改为NewName。 在Win95/98下该的子键和数据将被一起移动或复制到新的位置,在NT下子键必须用MoveKey明确的移动或自制。●读取数据的方法 function ReadBinaryData(const Name: String; var Buffer; BufSize: Integer):Integer; function ReadBool(const Name: String): Boolean; function ReadCurrency(const Name: String): Currency; function ReadDate(const Name: String): TDateTime; function ReadDateTime(const Name: String): TDateTime; function ReadFloat(const Name: String): Double; function ReadInteger(const Name: String): Integer; function ReadString(const Name: String): String; function ReadTime(const Name: String): TDateTime; 以上方法从当前主键读取相应数据类型的键值的数据,如果类型不匹配将产生一个异常。●RegistryConnect方法 function RegistryConnect(const UNCName: String): Boolean; 与另一台计算机的注册表建立连接,在建立连接前应将Rootkey属性设为HKEY_USERS或HKEY_LOCAL_MACHINE。 UNCName是另一台计算机的名子。格式如:\\computername
转贴:在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\Borland\Delphi。 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\Software\Microsoft\Windows\CurrentVersion下,有三个字符串值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\Microsoft\Windows\CurrentVersion if OpenKey( ′Software\Microsoft\Windows\CurrentVersion′,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\Microsoft\Windows\CurrentVersion\Run′,True) then WriteString(′delphi′,′C:\Program Files\borland\delphi3\bin\delphi32.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\RemoteAccess\Addresses下的数值名称的方法来进行。 6.判断数值名称存在、数值名称改名。 ValueExists用于判断数值名称是否存在: function ValueExists(const Name: string): Boolean; 返回值为True表示数值名称存在。 RenameValue用于数值名称改名: procedure RenameValue(const OldName, NewName: string); 以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。 以上程序在PWIN 98+Delphi 3.0下调试通过。
用注册表对Delphi程序进行加密 本加密方法分三部分: 1. 根据对注册表的搜索结果判定设置对话框的内容。 2. 若初次使用,则设新密码;若是已经设置密码,则进行验证。 3. 一个密码变换小程序(比原来的复杂得多)。当然,如果需要修改密码的功能,只要将设置密码部分改动一下即可。 一、程序启动时,通过搜索注册表,判断是否已有密码,来确定窗口的显示内容。不过事先应有以下的声明然后才能使用: 在user中加入TRegistry,在var声明中加入以下几个窗体变量: TheReg: TRegistry; KeyName,ValueStr,tempStr:String; procedure TfrmPass.FormShow(Sender: TObject); begin TheReg := TRegistry.Create; try TheReg.RootKey := HKEY-LOCAL-MACHINE; KeyName := ′SOFTWARE\Mypassword′; //有该键则打开,没有则创建 if TheReg.OpenKey(KeyName, True) then begin tempStr:=ExtractFileName(Application.ExeName); //读取密码 ValueStr:=TheReg.ReadString(tempStr); //密码不为空则修改窗体为验证密码 if ValueStr<>′′ then begin edit2.Visible:=false; frmPass.Caption:=′验证密码′; edit1.SetFocus; OK.Caption:=′确定′; end //密码为空则修改窗体为设置密码对话框 else begin showmessage(′第一次使用请设置密码!′); edit2.Visible:=true; frmPass.Caption:=′请设置新密码′; edit1.SetFocus; OK.Caption:=′设置′; end; TheReg.CloseKey; end; finally TheReg.Free; end; end; 二、按钮的响应代码:包括新设密码和验证密码。 procedure TfrmPass.OKClick(Sender: TObject); begin //根据Edit2的显示与否判断已有密码,进行验证 if edit2.Visible=false then begin if pass(edit1.text)=ValueStr then begin showmessage(′密码正确!′); end else begin showmessage(′密码不正确!无权操作!′); halt; end; end //无密码,设置新密码 else begin if edit1.text=edit2.text then begin TheReg := TRegistry.Create; TheReg.RootKey := HKEY-LOCAL-MACHINE; KeyName := ′SOFTWARE\Mypassword′; if TheReg.OpenKey(KeyName, True) then TheReg.WriteString(tempStr,pass(edit1.text)); TheReg.CloseKey; end else begin showmessage(′再次键入的密码不一致,请重
Function GetDataInfo(const ValueName:String;Var Value:TRegDataInfo):Boolean;
TregDataType=(rdunknown,rdstring,rdexpandstring,rdexpandstring,rdinterger,rdbinary);
TregDataInfo=record
Regdata:TRegDataType;数据类型
dataSize:integer;数据大小
end
valuename:和当前键关联的数据值名称
value:返回数据的信息,如为rdstring和rdexpandstring类型,则数据大小包括字符串未尾的空结束字符。
如果成功返回True,失败返回False,并且Value的值为zeros
rdexpandstring:是一个包含环境变量的字符串;如“%PATH%”。●CreateKey方法
Function CreateKey(const Key:string):Boolena;
新建一个名为Key的键,Key可以为绝对的或相对的名字,绝对名用反斜杠“\”开头,相对名是新建一个当前键的子键。新建没有值。
成功返回True,否则返回False,如果该键已存在将不产生效果。●DeleteKey方法
Function DeleteKey(const Key:string):Boolean;
删除一个键及相关联的数据,在win95中子键也将被删除,NT中子键必须一个个删除。●DeleteValue方法
Function DeleteValue (const Name:string):Boolean;
删除当前键中指定的一个数据值name。●GetDataSize方法
Function GetDataSize(const ValueName:string):integer;
返回当前键中一个指定数值ValueName数据的大小。●GetDataType方法
Function GetDataType(const Valuename;string):TRegDataType;
返回当前键中一个指定数值Valuename数据的类型。●GetKeyInfo方法
Function GetKeyInfo(var value:TRegkeyinfo):Boolean;
返回当前键的信息,在于value中。
TRegkeyinfo=record
maxsubkeylen:integer;子键名的最长值(字节)
numvalues:integer;键值的数量
maxvaluelen;最长的键值名的长度
Filetime:TFileTime;最后一次更改的时间
end;●Getkeynames方法
Procedure Getkeynames(strings:Tsrtings);
返回当前键所有子键的名子列表串。●Getvaluenames
Procedure Getvaluenames(strings:Tstrings);
返回当前键所有键值名的列表串。●Hassubkeys方法
Function hassubKeys:Boolean;
判断当前键是否有子键,有返回True,否则返回False。●keyExists方法
Function KeyExists(const Key:string):Boolean;
判断指定的键是否存在。●LoadKey方法
Function LoadKey(const Key,fileNmae:string):Boolean;
在根键下新建
从一个文件中加载注册信息到子键中,文件注册信息中包含数据值名、子键和数据。
LoadKey使创建一个键单一化,子键,键值和数据在一人操作中完成,所有这些称为一组,和单独地创建它们不同应用程序可以在一个文件中读取一组数据,这在用户运行中重新设置有特别的用处。
Key为要创建子键的名子
FileName:为文件的位置,所指定的文件必须为以前用SaveKey函数或RegSaveKey API函数所建立的,文件名不能包括扩展名。●OpenKey方法
Function OpenKey(const Key:string;cancreate:Boolean):Boolean;
使用该函数可以指定一个键作为当前键,如果键为nil,则当前键 将设置为根键。
Cancreate决定是否在指定键不存在时创建该键,该函数创建的键的键值将不确定。
如果成功地打开或创建,该函数返回True。●OpenKeyReadOnly方法
function OpenKeyReadOnly(const Key: String): Boolean;
以只读的方式打开Key值指定的键。●CloseKey方法
procedure CloseKey;
当不再使用一个键时应用该方法关闭该键。●MoveKey方法
procedure MoveKey(const OldName, NewName: String; Delete: Boolean);
该方法移动或复制一个键到一个新的位置,并把键的名子改为NewName。
在Win95/98下该的子键和数据将被一起移动或复制到新的位置,在NT下子键必须用MoveKey明确的移动或自制。●读取数据的方法
function ReadBinaryData(const Name: String; var Buffer; BufSize: Integer):Integer;
function ReadBool(const Name: String): Boolean;
function ReadCurrency(const Name: String): Currency;
function ReadDate(const Name: String): TDateTime;
function ReadDateTime(const Name: String): TDateTime;
function ReadFloat(const Name: String): Double;
function ReadInteger(const Name: String): Integer;
function ReadString(const Name: String): String;
function ReadTime(const Name: String): TDateTime;
以上方法从当前主键读取相应数据类型的键值的数据,如果类型不匹配将产生一个异常。●RegistryConnect方法
function RegistryConnect(const UNCName: String): Boolean;
与另一台计算机的注册表建立连接,在建立连接前应将Rootkey属性设为HKEY_USERS或HKEY_LOCAL_MACHINE。
UNCName是另一台计算机的名子。格式如:\\computername
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\Borland\Delphi。 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\Software\Microsoft\Windows\CurrentVersion下,有三个字符串值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\Microsoft\Windows\CurrentVersion if OpenKey( ′Software\Microsoft\Windows\CurrentVersion′,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\Microsoft\Windows\CurrentVersion\Run′,True) then WriteString(′delphi′,′C:\Program Files\borland\delphi3\bin\delphi32.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\RemoteAccess\Addresses下的数值名称的方法来进行。 6.判断数值名称存在、数值名称改名。 ValueExists用于判断数值名称是否存在: function ValueExists(const Name: string): Boolean; 返回值为True表示数值名称存在。 RenameValue用于数值名称改名: procedure RenameValue(const OldName, NewName: string); 以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。 以上程序在PWIN 98+Delphi 3.0下调试通过。
用注册表对Delphi程序进行加密
本加密方法分三部分: 1. 根据对注册表的搜索结果判定设置对话框的内容。 2. 若初次使用,则设新密码;若是已经设置密码,则进行验证。 3. 一个密码变换小程序(比原来的复杂得多)。当然,如果需要修改密码的功能,只要将设置密码部分改动一下即可。 一、程序启动时,通过搜索注册表,判断是否已有密码,来确定窗口的显示内容。不过事先应有以下的声明然后才能使用: 在user中加入TRegistry,在var声明中加入以下几个窗体变量: TheReg: TRegistry; KeyName,ValueStr,tempStr:String; procedure TfrmPass.FormShow(Sender: TObject); begin TheReg := TRegistry.Create; try TheReg.RootKey := HKEY-LOCAL-MACHINE; KeyName := ′SOFTWARE\Mypassword′; //有该键则打开,没有则创建 if TheReg.OpenKey(KeyName, True) then begin tempStr:=ExtractFileName(Application.ExeName); //读取密码 ValueStr:=TheReg.ReadString(tempStr); //密码不为空则修改窗体为验证密码 if ValueStr<>′′ then begin edit2.Visible:=false; frmPass.Caption:=′验证密码′; edit1.SetFocus; OK.Caption:=′确定′; end //密码为空则修改窗体为设置密码对话框 else begin showmessage(′第一次使用请设置密码!′); edit2.Visible:=true; frmPass.Caption:=′请设置新密码′; edit1.SetFocus; OK.Caption:=′设置′; end; TheReg.CloseKey; end; finally TheReg.Free; end; end; 二、按钮的响应代码:包括新设密码和验证密码。 procedure TfrmPass.OKClick(Sender: TObject); begin //根据Edit2的显示与否判断已有密码,进行验证 if edit2.Visible=false then begin if pass(edit1.text)=ValueStr then begin showmessage(′密码正确!′); end else begin showmessage(′密码不正确!无权操作!′); halt; end; end //无密码,设置新密码 else begin if edit1.text=edit2.text then begin TheReg := TRegistry.Create; TheReg.RootKey := HKEY-LOCAL-MACHINE; KeyName := ′SOFTWARE\Mypassword′; if TheReg.OpenKey(KeyName, True) then TheReg.WriteString(tempStr,pass(edit1.text)); TheReg.CloseKey; end else begin showmessage(′再次键入的密码不一致,请重