📄 jvqappregistrystorage.pas
字号:
TmpHKEY: HKEY;
I: Integer;
SubKeyName: array [0..255] of Char;
EnumRes: Longint;
begin
Key := GetAbsPath(Path);
if RegKeyExists(FRegHKEY, Key) then
if RegOpenKey(FRegHKEY, PChar(Key), TmpHKEY) = ERROR_SUCCESS then
begin
Strings.BeginUpdate;
try
I := 0;
repeat
EnumRes := RegEnumKey(TmpHKEY, I, SubKeyName, SizeOf(SubKeyName));
if (EnumRes = ERROR_SUCCESS) and (not ReportListAsValue or
not ListStored(Path + RegPathDelim + SubKeyName)) then
Strings.Add(SubKeyName);
Inc(I);
until EnumRes <> ERROR_SUCCESS;
if EnumRes <> ERROR_NO_MORE_ITEMS then
raise EJclRegistryError.CreateRes(@RsEEnumeratingRegistry);
finally
RegCloseKey(TmpHKEY);
Strings.EndUpdate;
end;
end;
end;
procedure TJvAppRegistryStorage.EnumValues(const Path: string; const Strings: TStrings;
const ReportListAsValue: Boolean);
var
PathIsList: Boolean;
Key: string;
TmpHKEY: HKEY;
I: Integer;
Name: array [0..511] of Char;
NameLen: Cardinal;
EnumRes: Longint;
begin
PathIsList := ReportListAsValue and ListStored(Path);
if PathIsList then
Strings.Add('');
Key := GetAbsPath(Path);
if RegKeyExists(FRegHKEY, Key) then
if RegOpenKey(FRegHKEY, PChar(Key), TmpHKEY) = ERROR_SUCCESS then
begin
Strings.BeginUpdate;
try
I := 0;
repeat
NameLen := SizeOf(Name);
EnumRes := RegEnumValue(TmpHKEY, I, Name, NameLen, nil, nil, nil, nil);
if (EnumRes = ERROR_SUCCESS) and (not PathIsList or (not AnsiSameText(cCount, Name) and
not NameIsListItem(Name))) then
Strings.Add(Name);
Inc(I);
until EnumRes <> ERROR_SUCCESS;
if EnumRes <> ERROR_NO_MORE_ITEMS then
raise EJclRegistryError.CreateRes(@RsEEnumeratingRegistry);
finally
RegCloseKey(TmpHKEY);
Strings.EndUpdate;
end;
end;
end;
function TJvAppRegistryStorage.IsFolderInt(const Path: string; ListIsValue: Boolean): Boolean;
var
RefPath: string;
PathHKEY: HKEY;
I: Integer;
Name: array [0..511] of Char;
NameLen: Cardinal;
EnumRes: Longint;
begin
Result := False;
RefPath := GetAbsPath(Path);
if RegOpenKey(FRegHKEY, PChar(RefPath), PathHKEY) = ERROR_SUCCESS then
try
Result := True;
if ListIsValue and (RegQueryValueEx(PathHKEY, cCount, nil, nil, nil, nil) = ERROR_SUCCESS) then
begin
Result := False;
I := 0;
repeat
NameLen := SizeOf(Name);
EnumRes := RegEnumValue(PathHKEY, I, Name, NameLen, nil, nil, nil, nil);
Result := (EnumRes = ERROR_SUCCESS) and not AnsiSameText(cCount, Name) and
not NameIsListItem(Name);
Inc(I);
until (EnumRes <> ERROR_SUCCESS) or Result;
if EnumRes <> ERROR_NO_MORE_ITEMS then
raise EJclRegistryError.CreateRes(@RsEEnumeratingRegistry);
end;
finally
RegCloseKey(PathHKEY);
end;
end;
function TJvAppRegistryStorage.PathExistsInt(const Path: string): Boolean;
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
Result := RegKeyExists(FRegHKEY, SubKey + RegPathDelim + ValueName);
end;
function TJvAppRegistryStorage.ValueStoredInt(const Path: string): Boolean;
var
SubKey: string;
ValueName: string;
TmpKey: HKEY;
begin
SplitKeyPath(Path, SubKey, ValueName);
Result := RegKeyExists(FRegHKEY, SubKey);
if Result then
if RegOpenKey(FRegHKEY, PChar(SubKey), TmpKey) = ERROR_SUCCESS then
try
Result := RegQueryValueEx(TmpKey, PChar(ValueName), nil, nil, nil, nil) = ERROR_SUCCESS;
finally
RegCloseKey(TmpKey);
end
else
raise EJclRegistryError.CreateResFmt(@RsUnableToOpenKeyRead, [SubKey]);
end;
procedure TJvAppRegistryStorage.DeleteValueInt(const Path: string);
var
SubKey: string;
ValueName: string;
begin
if ValueStored(Path) then
begin
SplitKeyPath(Path, SubKey, ValueName);
RegDeleteEntry(FRegHKEY, SubKey, ValueName);
end;
end;
procedure TJvAppRegistryStorage.DeleteSubTreeInt(const Path: string);
var
KeyRoot: string;
begin
KeyRoot := GetAbsPath(Path);
if RegKeyExists(FRegHKEY, KeyRoot) then
RegDeleteKeyTree(FRegHKEY, KeyRoot);
end;
function TJvAppRegistryStorage.DoReadInteger(const Path: string; Default: Integer): Integer;
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
try
Result := RegReadIntegerDef(FRegHKEY, SubKey, ValueName, Default);
except
on E: EJclRegistryError do
if StorageOptions.DefaultIfReadConvertError then
Result := Default
else
raise;
end;
end;
procedure TJvAppRegistryStorage.DoWriteInteger(const Path: string; Value: Integer);
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
CreateKey(SubKey);
RegWriteInteger(FRegHKEY, SubKey, ValueName, Value);
end;
function TJvAppRegistryStorage.DoReadBoolean(const Path: string; Default: Boolean): Boolean;
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
try
Result := RegReadBoolDef(FRegHKEY, SubKey, ValueName, Default);
except
on E: EJclRegistryError do
if StorageOptions.DefaultIfReadConvertError then
Result := Default
else
raise;
end;
end;
procedure TJvAppRegistryStorage.DoWriteBoolean(const Path: string; Value: Boolean);
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
CreateKey(SubKey);
RegWriteBool(FRegHKEY, SubKey, ValueName, Value);
end;
function TJvAppRegistryStorage.DoReadFloat(const Path: string; Default: Extended): Extended;
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
Result := Default;
try
RegReadBinary(FRegHKEY, SubKey, ValueName, Result, SizeOf(Result));
except
on E: EJclRegistryError do
if StorageOptions.DefaultIfReadConvertError then
Result := Default
else
raise;
end;
end;
procedure TJvAppRegistryStorage.DoWriteFloat(const Path: string; Value: Extended);
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
CreateKey(SubKey);
RegWriteBinary(FRegHKEY, SubKey, ValueName, Value, SizeOf(Value));
end;
function TJvAppRegistryStorage.DoReadString(const Path: string; const Default: string): string;
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
try
Result := RegReadStringDef(FRegHKEY, SubKey, ValueName, Default);
except
on E: EJclRegistryError do
if StorageOptions.DefaultIfReadConvertError then
Result := Default
else
raise;
end;
end;
procedure TJvAppRegistryStorage.DoWriteString(const Path: string; const Value: string);
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
CreateKey(SubKey);
RegWriteString(FRegHKEY, SubKey, ValueName, Value);
end;
function TJvAppRegistryStorage.DoReadBinary(const Path: string; Buf: Pointer; BufSize: Integer): Integer;
var
SubKey: string;
ValueName: string;
begin
SplitKeyPath(Path, SubKey, ValueName);
Result := RegReadBinary(FRegHKEY, SubKey, ValueName, Buf, BufSize);
end;
procedure TJvAppRegistryStorage.DoWriteBinary(const Path: string; Buf: Pointer; BufSize: Integer);
var
SubKey: string;
ValueName: string;
TmpBuf: Byte;
begin
TmpBuf := Byte(Buf);
SplitKeyPath(Path, SubKey, ValueName);
CreateKey(SubKey);
RegWriteBinary(FRegHKEY, SubKey, ValueName, TmpBuf, BufSize);
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQAppRegistryStorage.pas,v $';
Revision: '$Revision: 1.20 $';
Date: '$Date: 2005/03/08 08:38:33 $';
LogPath: 'JVCL\run'
);
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -