📄 jvqappxmlstorage.pas
字号:
ANode: TJvSimpleXmlElem;
//Buffer: Extended;
begin
if AutoReload and not IsUpdating then
Reload;
SplitKeyPath(Path, ParentPath, ValueName);
ANode := CreateAndSetNode(ParentPath);
Xml.Options := [sxoAutoCreate, sxoAutoIndent];
// ANode.Items.ItemNamed[ValueName].Value := FloatToStr(Value);
ANode.Items.ItemNamed[ValueName].Value := BufToBinStr(@Value, SizeOf(Value));
Xml.Options := [sxoAutoIndent];
if AutoFlush and not IsUpdating then
Flush;
end;
function TJvCustomAppXMLStorage.DoReadString(const Path: string; const Default: string): string;
var
ParentPath: string;
ValueName: string;
Node: TJvSimpleXmlElem;
begin
if AutoReload and not IsUpdating then
Reload;
SplitKeyPath(Path, ParentPath, ValueName);
Node := GetNodeFromPath(ParentPath);
if Assigned(Node) and Assigned(Node.Items.ItemNamed[ValueName]) then
try
Result := Node.Items.ItemNamed[ValueName].Value;
except
if StorageOptions.DefaultIfReadConvertError then
Result := Default
else
raise;
end
else
if StorageOptions.DefaultIfValueNotExists then
Result := Default
else
raise EJVCLException.CreateResFmt(@RsEPathDoesntExists, [Path]);
end;
procedure TJvCustomAppXMLStorage.DoWriteString(const Path: string; const Value: string);
var
ParentPath: string;
ValueName: string;
ANode: TJvSimpleXmlElem;
begin
if AutoReload and not IsUpdating then
Reload;
SplitKeyPath(Path, ParentPath, ValueName);
ANode := CreateAndSetNode(ParentPath);
Xml.Options := [sxoAutoCreate, sxoAutoIndent];
ANode.Items.ItemNamed[ValueName].Value := Value;
Xml.Options := [sxoAutoIndent];
if AutoFlush and not IsUpdating then
Flush;
end;
function TJvCustomAppXMLStorage.DoReadBinary(const Path: string; Buf: Pointer; BufSize: Integer): Integer;
var
Value: string;
begin
if AutoReload and not IsUpdating then
Reload;
Value := DoReadString(Path, '');
Result := BinStrToBuf(Value, Buf, BufSize);
end;
procedure TJvCustomAppXMLStorage.DoWriteBinary(const Path: string; Buf: Pointer; BufSize: Integer);
begin
if AutoReload and not IsUpdating then
Reload;
DoWriteString(Path, BufToBinStr(Buf, BufSize));
if AutoFlush and not IsUpdating then
Flush;
end;
procedure TJvCustomAppXMLStorage.EnumFolders(const Path: string;
const Strings: TStrings; const ReportListAsValue: Boolean);
var
RefPath: string;
I: Integer;
Node: TJvSimpleXmlElem;
begin
if AutoReload and not IsUpdating then
Reload;
RefPath := GetAbsPath(Path);
if RefPath = '' then
RefPath := cEmptyPath;
Node := GetNodeFromPath(RefPath);
if Node <> nil then
begin
Strings.BeginUpdate;
try
Strings.Clear;
for I := 0 to Node.Items.Count - 1 do
Strings.Add(Node.Items[I].Name);
finally
Strings.EndUpdate;
end;
end
else
raise EJVCLException.CreateResFmt(@RsEPathDoesntExists, [RefPath]);
end;
procedure TJvCustomAppXMLStorage.EnumValues(const Path: string;
const Strings: TStrings; const ReportListAsValue: Boolean);
var
PathIsList: Boolean;
RefPath: string;
I: Integer;
Node: TJvSimpleXmlElem;
Name: string;
begin
if AutoReload and not IsUpdating then
Reload;
PathIsList := ReportListAsValue and ListStored(Path);
RefPath := GetAbsPath(Path);
if RefPath = '' then
RefPath := cEmptyPath;
Node := GetNodeFromPath(RefPath);
if Node <> nil then
begin
Strings.BeginUpdate;
try
Strings.Clear;
for I := 0 to Node.Items.Count - 1 do
begin
Name := Node.Items[I].Name;
if (not PathIsList or (not AnsiSameText(cCount, Name) and
not NameIsListItem(Name))) then
Strings.Add(Name);
end;
finally
Strings.EndUpdate;
end;
end
else
raise EJVCLException.CreateResFmt(@RsEPathDoesntExists, [RefPath]);
end;
function TJvCustomAppXMLStorage.IsFolderInt(const Path: string;
ListIsValue: Boolean): Boolean;
var
RefPath: string;
ValueNames: TStrings;
I: Integer;
Node: TJvSimpleXmlElem;
Name: string;
begin
if AutoReload and not IsUpdating then
Reload;
RefPath := GetAbsPath(Path);
if RefPath = '' then
RefPath := cEmptyPath;
Node := GetNodeFromPath(RefPath);
Result := False;
if Assigned(Node) and ListIsValue and
Assigned(Node.Items.ItemNamed[cCount]) then
begin
ValueNames := TStringList.Create;
try
I := 0;
repeat
Name := Node.Items[I].Name;
Result := not AnsiSameText(cCount, Name) and not NameIsListItem(Name);
Inc(I);
until (I = Node.Items.Count) or Result;
finally
ValueNames.Free;
end;
end;
end;
function TJvCustomAppXMLStorage.GetRootNodeName: string;
begin
Result := Xml.Root.Name;
end;
function TJvCustomAppXMLStorage.CreateAndSetNode(Key: string): TJvSimpleXmlElem;
begin
Xml.Options := [sxoAutoCreate, sxoAutoIndent];
Result := GetNodeFromPath(Key);
Xml.Options := [sxoAutoIndent];
end;
function TJvCustomAppXMLStorage.GetNodeFromPath(Path: string; StartNode: TJvSimpleXmlElem = nil): TJvSimpleXmlElem;
var
NodeList: TStringList;
I: Integer;
Node: TJvSimpleXmlElem;
NodeName: string;
begin
Result := nil;
if AutoReload and not IsUpdating then
Reload;
NodeList := TStringList.Create;
if StartNode <> nil then
Node := StartNode
else
Node := Xml.Root;
try
try
StrToStrings(Path, '\', NodeList, False);
for I := 0 to NodeList.Count - 1 do
begin
// Node names cannot have spaces in them so we replace
// those spaces by the replacement string. If there is
// no such string, we trigger an exception as the XML
// standard doesn't allow spaces in node names
NodeName := EnsureNoWhiteSpaceInNodeName(NodeList[I]);
// If the name is the same as the root AND the first in
if not ((I = 0) and (NodeName = Xml.Root.Name)) then
if Assigned(Node.Items.ItemNamed[NodeName]) then
Node := Node.Items.ItemNamed[NodeName]
else
Exit;
end;
finally
NodeList.Free;
end;
except
Node := nil;
end;
Result := Node;
end;
function TJvCustomAppXMLStorage.PathExistsInt(const Path: string): Boolean;
var
SubKey: string;
ValueName: string;
Node: TJvSimpleXmlElem;
begin
Result := False;
SplitKeyPath(Path, SubKey, ValueName);
Node := GetNodeFromPath(SubKey);
if Assigned(Node) then
Result := Assigned(Node.Items.ItemNamed[ValueName]);
end;
function TJvCustomAppXMLStorage.DoReadBoolean(const Path: string;
Default: Boolean): Boolean;
var
ParentPath: string;
ValueName: string;
Node: TJvSimpleXmlElem;
begin
if AutoReload and not IsUpdating then
Reload;
SplitKeyPath(Path, ParentPath, ValueName);
Node := GetNodeFromPath(ParentPath);
if Assigned(Node) and Assigned(Node.Items.ItemNamed[ValueName]) then
try
Result := Node.Items.ItemNamed[ValueName].BoolValue;
except
if StorageOptions.DefaultIfReadConvertError then
Result := Default
else
raise;
end
else
if StorageOptions.DefaultIfValueNotExists then
Result := Default
else
raise EJVCLException.CreateResFmt(@RsEPathDoesntExists, [Path]);
end;
procedure TJvCustomAppXMLStorage.DoWriteBoolean(const Path: string;
Value: Boolean);
var
ParentPath: string;
ValueName: string;
ANode: TJvSimpleXmlElem;
begin
if AutoReload and not IsUpdating then
Reload;
SplitKeyPath(Path, ParentPath, ValueName);
ANode := CreateAndSetNode(ParentPath);
Xml.Options := [sxoAutoCreate, sxoAutoIndent];
ANode.Items.ItemNamed[ValueName].BoolValue := Value;
Xml.Options := [sxoAutoIndent];
if AutoFlush and not IsUpdating then
Flush;
end;
function TJvCustomAppXMLStorage.GetAsString: string;
begin
Result := Xml.SaveToString;
end;
procedure TJvCustomAppXMLStorage.SetAsString(const Value: string);
begin
Xml.LoadFromString(Value);
end;
function TJvCustomAppXMLStorage.DefaultExtension: string;
begin
Result := 'xml';
end;
//=== { TJvAppXMLFileStorage } ===============================================
procedure TJvAppXMLFileStorage.Flush;
begin
if (FullFileName <> '') and not ReadOnly then
Xml.SaveToFile(FullFileName);
end;
procedure TJvAppXMLFileStorage.Reload;
begin
if FileExists(FullFileName) and not IsUpdating then
Xml.LoadFromFile(FullFileName);
end;
//=== { Common procedures } ==================================================
procedure StorePropertyStoreToXmlFile(APropertyStore: TJvCustomPropertyStore;
const AFileName: string; const AAppStoragePath: string = '');
var
AppStorage: TJvAppXMLFileStorage;
SaveAppStorage: TJvCustomAppStorage;
SaveAppStoragePath: string;
begin
if not Assigned(APropertyStore) then
Exit;
AppStorage := TJvAppXMLFileStorage.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 LoadPropertyStoreFromXmlFile(APropertyStore: TJvCustomPropertyStore;
const AFileName: string; const AAppStoragePath: string = '');
var
AppStorage: TJvAppXMLFileStorage;
SaveAppStorage: TJvCustomAppStorage;
SaveAppStoragePath: string;
begin
if not Assigned(APropertyStore) then
Exit;
AppStorage := TJvAppXMLFileStorage.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: JvQAppXMLStorage.pas,v $';
Revision: '$Revision: 1.23 $';
Date: '$Date: 2005/02/06 14:06:00 $';
LogPath: 'JVCL\run'
);
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -