📄 jvqappinistorage.pas
字号:
SplitKeyPath(Path, Section, Key);
if ValueExists(Section, Key) then
begin
Value := ReadValue(Section, Key);
Result := BinStrToBuf(Value, Buf, BufSize);
end
else
Result := 0;
end;
procedure TJvCustomAppIniStorage.DoWriteBinary(const Path: string; Buf: Pointer; BufSize: Integer);
var
Section: string;
Key: string;
begin
SplitKeyPath(Path, Section, Key);
WriteValue(Section, Key, BufToBinStr(Buf, BufSize));
end;
procedure TJvCustomAppIniStorage.EnumFolders(const Path: string; const Strings: TStrings;
const ReportListAsValue: Boolean);
var
RefPath: string;
I: Integer;
begin
Strings.BeginUpdate;
try
RefPath := GetAbsPath(Path);
if RefPath = '' then
RefPath := DefaultSection;
if AutoReload and not IsUpdating then
Reload;
IniFile.ReadSections(Strings);
I := Strings.Count - 1;
while I >= 0 do
begin
if (RefPath <> '') and ((Copy(Strings[I], 1, Length(RefPath) + 1) <> RefPath + PathDelim) or
(Pos(PathDelim, Copy(Strings[I], 2 + Length(RefPath), Length(Strings[I]) - Length(RefPath))) > 0)) then
Strings.Delete(I)
else
if ReportListAsValue and ValueExists(Strings[I], cCount) then
Strings.Delete(I)
else
if RefPath <> '' then
Strings[I] := Copy(Strings[I], 1 + Length(RefPath), Length(Strings[I]) - Length(RefPath));
Dec(I);
end;
finally
Strings.EndUpdate;
end;
end;
procedure TJvCustomAppIniStorage.EnumValues(const Path: string; const Strings: TStrings;
const ReportListAsValue: Boolean);
var
PathIsList: Boolean;
RefPath: string;
I: Integer;
begin
Strings.BeginUpdate;
try
PathIsList := ReportListAsValue and ListStored(Path);
RefPath := GetAbsPath(Path);
if RefPath = '' then
RefPath := DefaultSection;
if AutoReload and not IsUpdating then
Reload;
IniFile.ReadSectionValues(RefPath, Strings);
for I := Strings.Count - 1 downto 0 do
begin
Strings[I] := Copy(Strings[I], 1, Pos(cKeyValueSeparator, Strings[I]) - 1);
if PathIsList and (AnsiSameText(cCount, Strings[I]) or NameIsListItem(Strings[I])) then
Strings.Delete(I);
end;
if PathIsList then
Strings.Add('');
finally
Strings.EndUpdate;
end;
end;
function TJvCustomAppIniStorage.CalcDefaultSection(Section: string): string;
begin
// Changed by Jens Fudickar to support DefaultSections; Similar to ReadValue
// (rom) made it a private method
if (Section = '') or (Section[1] = '.') then
Result := DefaultSection + Section
else
Result := Section;
if (Result = '') or (Result[1] = '.') then
raise EJVCLAppStorageError.CreateRes(@RsEReadValueFailed);
end;
function TJvCustomAppIniStorage.ValueExists(const Section, Key: string): Boolean;
begin
if IniFile <> nil then
begin
if AutoReload and not IsUpdating then
Reload;
Result := IniFile.ValueExists(CalcDefaultSection(Section), Key);
end
else
Result := False;
end;
function TJvCustomAppIniStorage.ReadValue(const Section, Key: string): string;
begin
if IniFile <> nil then
begin
if AutoReload and not IsUpdating then
Reload;
if TJvAppIniStorageOptions(StorageOptions).ReplaceCRLF then
Result := ReplaceSlashNToCRLF(IniFile.ReadString(CalcDefaultSection(Section), Key, ''))
else
Result := IniFile.ReadString(CalcDefaultSection(Section), Key, '');
if TJvAppIniStorageOptions(StorageOptions).PreserveLeadingTrailingBlanks then
Result := RestoreLeadingTrailingBlanks(Result);
end
else
Result := '';
end;
procedure TJvCustomAppIniStorage.WriteValue(const Section, Key, Value: string);
begin
if IniFile <> nil then
begin
if AutoReload and not IsUpdating then
Reload;
if TJvAppIniStorageOptions(StorageOptions).PreserveLeadingTrailingBlanks then
if TJvAppIniStorageOptions(StorageOptions).ReplaceCRLF then
IniFile.WriteString(CalcDefaultSection(Section), Key,
SaveLeadingTrailingBlanks(ReplaceCRLFToSlashN(Value)))
else
IniFile.WriteString(CalcDefaultSection(Section), Key,
SaveLeadingTrailingBlanks(Value))
else
if TJvAppIniStorageOptions(StorageOptions).ReplaceCRLF then
IniFile.WriteString(CalcDefaultSection(Section), Key, ReplaceCRLFToSlashN(Value))
else
IniFile.WriteString(CalcDefaultSection(Section), Key, Value);
if AutoFlush and not IsUpdating then
Flush;
end;
end;
procedure TJvCustomAppIniStorage.DeleteSubTreeInt(const Path: string);
var
TopSection: string;
Sections: TStringList;
I: Integer;
begin
if IniFile <> nil then
begin
TopSection := GetAbsPath(Path);
Sections := TStringList.Create;
try
if AutoReload and not IsUpdating then
Reload;
IniFile.ReadSections(Sections);
if TopSection = '' then
for I := 0 to Sections.Count - 1 do
IniFile.EraseSection(Sections[I])
else
for I := 0 to Sections.Count - 1 do
if Pos(TopSection, Sections[I]) = 1 then
IniFile.EraseSection(Sections[I]);
if AutoFlush and not IsUpdating then
Flush;
finally
Sections.Free;
end;
end;
end;
procedure TJvCustomAppIniStorage.RemoveValue(const Section, Key: string);
var
LSection: string;
begin
if IniFile <> nil then
begin
if AutoReload and not IsUpdating then
Reload;
LSection := CalcDefaultSection(Section);
if IniFile.ValueExists(LSection, Key) then
begin
IniFile.DeleteKey(LSection, Key);
if AutoFlush and not IsUpdating then
Flush;
end
else
if IniFile.SectionExists(LSection + '\' + Key) then
begin
IniFile.EraseSection(LSection + '\' + Key);
if AutoFlush and not IsUpdating then
Flush;
end;
end;
end;
function TJvCustomAppIniStorage.PathExistsInt(const Path: string): Boolean;
var
Section: string;
Key: string;
begin
if AutoReload and not IsUpdating then
Reload;
SplitKeyPath(Path, Section, Key);
Result := IniFile.SectionExists(Section + '\' + Key);
end;
function TJvCustomAppIniStorage.IsFolderInt(const Path: string; ListIsValue: Boolean): Boolean;
var
RefPath: string;
ValueNames: TStrings;
I: Integer;
begin
RefPath := GetAbsPath(Path);
if RefPath = '' then
RefPath := DefaultSection;
if AutoReload and not IsUpdating then
Reload;
Result := IniFile.SectionExists(RefPath);
if Result and ListIsValue and IniFile.ValueExists(RefPath, cCount) then
begin
Result := False;
ValueNames := TStringList.Create;
try
EnumValues(Path, ValueNames, True);
I := ValueNames.Count - 1;
while Result and (I >= 0) do
begin
Result := not AnsiSameText(ValueNames[I], cCount) and not NameIsListItem(ValueNames[I]);
Dec(I);
end;
finally
ValueNames.Free;
end;
end;
end;
class function TJvCustomAppIniStorage.GetStorageOptionsClass: TJvAppStorageOptionsClass;
begin
Result := TJvAppIniStorageOptions;
end;
function TJvCustomAppIniStorage.GetAsString: string;
var
TmpList: TStringList;
begin
TmpList := TStringList.Create;
try
IniFile.GetStrings(TmpList);
Result := TmpList.Text;
finally
TmpList.Free;
end;
end;
procedure TJvCustomAppIniStorage.SetAsString(const Value: string);
var
TmpList: TStringList;
begin
TmpList := TStringList.Create;
try
TmpList.Text := Value;
IniFile.SetStrings(TmpList);
finally
TmpList.Free;
end;
end;
function TJvCustomAppIniStorage.DefaultExtension: string;
begin
Result := 'ini';
end;
//=== { TJvAppIniFileStorage } ===============================================
procedure TJvAppIniFileStorage.Flush;
var
path:String;
begin
if (FullFileName <> '') and not ReadOnly then
begin
IniFile.Rename(FullFileName, False);
path := ExtractFilePath(IniFile.FileName);
ForceDirectories(path); // NEW! Otherwise it would throw an exception when application is shutting down.
IniFile.UpdateFile;
end;
end;
procedure TJvAppIniFileStorage.Reload;
begin
if FileExists(FullFileName) and not IsUpdating then
IniFile.Rename(FullFileName, True);
end;
//=== { Common procedures } ==================================================
procedure StorePropertyStoreToIniFile(APropertyStore: TJvCustomPropertyStore;
const AFileName: string; const AAppStoragePath: string = '');
var
AppStorage: TJvAppIniFileStorage;
SaveAppStorage: TJvCustomAppStorage;
SaveAppStoragePath: string;
begin
if not Assigned(APropertyStore) then
Exit;
AppStorage := TJvAppIniFileStorage.Create(nil);
try
AppStorage.Location := flCustom;
AppStorage.FileName := AFileName;
SaveAppStorage := APropertyStore.AppStorage;
SaveAppStoragePath := APropertyStore.AppStoragePath;
try
APropertyStore.AppStoragePath := AAppStoragePath;
APropertyStore.AppStorage := AppStorage;
APropertyStore.StoreProperties;
finally
APropertyStore.AppStoragePath := SaveAppStoragePath;
APropertyStore.AppStorage := SaveAppStorage;
end;
finally
AppStorage.Free;
end;
end;
procedure LoadPropertyStoreFromIniFile(APropertyStore: TJvCustomPropertyStore;
const AFileName: string; const AAppStoragePath: string = '');
var
AppStorage: TJvAppIniFileStorage;
SaveAppStorage: TJvCustomAppStorage;
SaveAppStoragePath: string;
begin
if not Assigned(APropertyStore) then
Exit;
AppStorage := TJvAppIniFileStorage.Create(nil);
try
AppStorage.Location := flCustom;
AppStorage.FileName := AFileName;
SaveAppStorage := APropertyStore.AppStorage;
SaveAppStoragePath := APropertyStore.AppStoragePath;
try
APropertyStore.AppStoragePath := AAppStoragePath;
APropertyStore.AppStorage := AppStorage;
APropertyStore.LoadProperties;
finally
APropertyStore.AppStoragePath := SaveAppStoragePath;
APropertyStore.AppStorage := SaveAppStorage;
end;
finally
AppStorage.Free;
end;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQAppIniStorage.pas,v $';
Revision: '$Revision: 1.25 $';
Date: '$Date: 2005/02/11 10:11:55 $';
LogPath: 'JVCL\run'
);
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -