📄 jvqappstorage.pas
字号:
{******************************************************************************}
{* WARNING: JEDI VCL To CLX Converter generated unit. *}
{* Manual modifications will be lost on next release. *}
{******************************************************************************}
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvAppStorage.pas, released on --.
The Initial Developer of the Original Code is Marcel Bestebroer
Portions created by Marcel Bestebroer are Copyright (C) 2002 - 2003 Marcel
Bestebroer
All Rights Reserved.
Contributor(s):
Jens Fudickar
Olivier Sannier
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Description:
General storage unit - provides with a basic storage backend component to store application
specific data. Descendants can provide specific backends for registry, INI-files, DB, XML,
etc. Should be used to provide a common interface for storing data as is done in some of
the JVCL components (eg. JvFormPlacement/JvFormStorage).
This was requested in one of the comments of the JVCL 3.0 Survey Results.
Paths
=====
Paths are relative to the current path. Paths are specified using backslashes (\) between
individual folders and the value. Paths starting with a backslash are always relative to the root
storage (application specific root, absolute root path).
Dots (.) are used to reference parent folders with the following rules:
* a single dot (.) refers to the current folder
* each additional dot moves up a level in the folder hierarchie, ie. "....\Here" refers to a
folder three levels up from the current where a sub folder/value name "Here" is searched. Of
course the normal (OS path) specification can be used as well ("..\..\..\Here" would be the
same as the first example).
Multiple backslashes without names between them are ignored ("Root\\Here" is the same as
"Root\Here").
Storage hierarchies
===================
Each storage allows you add an unlimited number of sub storages. A sub storage is a symbolic
link between a path in a storage to another storage (which in turn can also provide sub storages).
Suppose you want to store both generic as well as user specific settings. This can be accomplished
with two stores, one for the generic settings and one specific for the current user. The generic
store (referred to as 'asRegBackend' from now on) will link to the user specific store (referred
to as 'asUserIniBackend' from now on) using asRegBackend.SubStorages. The RootPath for the
asUserIniBackend sub-store link will be set to 'UserSettings'. From that point on, any reference
to a sub path of '\UserSettings' from the asRegBackend storage will be handed over to the
asUserIniBackend storage. Examples:
Path Target
==== ======
\WinPath asRegBackend:'\WinPath'
\Generic\UserSettings\Me asRegBackend:'\Generic\UserSettings\Me'
\UserSettings asRegBackend:'\UserSettings'
\UserSettings\FirstName asUserIniBackend:'\FirstName'
\UserSettings\Sub1\Sub1.1 asUserIniBackend:'\Sub1\Sub1.1'
Because all settings can be read from a single store (from the application's perspective) you have
created the option to keep your settings storage and retrieval code simple and easy to understand.
Upon startup you can set asUserIniBackend to the correct INI file for the user that has logged on,
and you are ready to read in the settings of that user.
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvQAppStorage.pas,v 1.32 2005/02/06 14:06:00 asnepvangers Exp $
unit JvQAppStorage;
{$I jvcl.inc}
interface
uses
{$IFDEF COMPILER9_UP}
QWindows,
{$ENDIF COMPILER9_UP}
SysUtils, Classes, TypInfo,
{$IFDEF UNIX}
JvQJCLUtils,
{$ENDIF UNIX}
JvQComponent, JvQTypes;
const
// (rom) this name is shared in several units and should be made global
cItem = 'Item';
type
TJvCustomAppStorage = class;
TJvAppStorage = class;
TJvCustomAppStorageOptions = class;
TJvAppSubStorages = class;
TJvAppSubStorage = class;
EJVCLAppStorageError = class(EJVCLException);
{ TAppStorage does not automatically store published properties of a class that
supports the IJvAppStorageHandler interface. Instead it invokes the Read and
Write methods. }
IJvAppStorageHandler = interface
['{E3754817-49A3-4612-A228-5D44A088681D}']
procedure ReadFromAppStorage(AppStorage: TJvCustomAppStorage; const BasePath: string);
procedure WriteToAppStorage(AppStorage: TJvCustomAppStorage; const BasePath: string);
end;
{ TAppStorage automatically stores published properties of a class that
supports the IJvAppStoragePublishedProps interface, even if the class
supports the IJvAppStorageHandler interface, too. }
IJvAppStoragePublishedProps = interface
['{0211AEF7-CCE9-4F13-B3CE-287251C89182}']
end;
TJvAppStorageListItemEvent = procedure(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const Index: Integer; const ItemName: string) of object;
TJvAppStorageListDeleteEvent = procedure(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const First, Last: Integer; const ItemName: string) of object;
TJvAppStoragePropTranslateEvent = procedure(Sender: TJvCustomAppStorage; Instance: TPersistent;
var Name: string; const Reading: Boolean) of object;
TJvAppStorageCryptEvent = procedure(var Value: string) of object;
TJvAppStorageGetFileNameEvent = procedure(Sender: TJvCustomAppStorage;
var FileName: TFileName) of object;
TJvAppStorageObjectListItemCreateEvent = function(Sender: TJvCustomAppStorage; const Path: string; Index: Integer): TPersistent of object;
TJvAppStorageOptionsClass = class of TJvCustomAppStorageOptions;
TJvAppStorageEnumOption = (
aeoFolders, // report folders
aeoValues, // report values
aeoReportListAsValue, // report list as value (a list is actually a folder containing a Count and Item? values)
aeoReportRelative, // report all found folders and values relative to the requested path (otherwise relative to the Root path)
aeoRecursive); // scan sub folders as well
TJvAppStorageEnumOptions = set of TJvAppStorageEnumOption;
TFileLocation = (
flCustom, // FileName property will contain full path
{$IFDEF MSWINDOWS}
flWindows, // Store in %WINDOWS%; only use file name part of FileName property.
{$ENDIF MSWINDOWS}
flTemp, // Store in %TEMP%; only use file name part of FileName property.
flExeFile, // Store in same folder as application's exe file; only use file name part of FileName property.
flUserFolder); // Store in %USER%\Application Data. Use the FileName property if it's a relative path or only the file name part of FileName property.
TJvCustomAppStorage = class(TJvComponent)
private
FRoot: string;
FCurPath: string;
FStorageOptions: TJvCustomAppStorageOptions;
FSubStorages: TJvAppSubStorages;
FOnTranslatePropertyName: TJvAppStoragePropTranslateEvent;
FOnEncryptPropertyValue: TJvAppStorageCryptEvent;
FOnDecryptPropertyValue: TJvAppStorageCryptEvent;
FCryptEnabledStatus: Integer;
FAutoFlush: Boolean;
FUpdateCount: Integer;
FAutoReload: Boolean;
FCurrentInstanceCreateEvent: TJvAppStorageObjectListItemCreateEvent;
FReadOnly: Boolean;
function GetUpdating: Boolean;
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
//Returns the property count of an instance
function GetPropCount(Instance: TPersistent): Integer;
//Returns the property name of an instance at a certain index
function GetPropName(Instance: TPersistent; Index: Integer): string;
{ Retrieve the class that holds the storage options and format settings. }
class function GetStorageOptionsClass: TJvAppStorageOptionsClass; virtual;
{ Split the specified path into an absolute path and a value name (the last item in the path
string). Just a helper for all the storage methods. }
procedure SplitKeyPath(const Path: string; out Key, ValueName: string); virtual;
{ SubStorages property set method. Does nothing. }
procedure SetSubStorages(Value: TJvAppSubStorages);
{ Retrieve application specific root. Path is prepended to any path specified and serves as an
absolute root for any storage method. }
function GetRoot: string;
{ Set application specific root. Path is prepended to any path specified and serves as an
absolute root for any storage method. }
procedure SetRoot(const Value: string);
{ Retrieves currently set path (including the Root path). }
function GetCurrentPath: string;
{ Returns the path as an absolute path (including the Root path). If the given path does not
start with a backslash (\) the path is appended to the Root path, resolving any references to
parent folders. }
function GetAbsPath(const Path: string): string;
{ StringList item reader used by ReadStringList in the call to ReadList. }
procedure ReadStringListItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const Index: Integer; const ItemName: string);
{ StringList item writer used by WriteStringList in the call to WriteList. }
procedure WriteStringListItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const Index: Integer; const ItemName: string);
{ StringList item deleter used by WriteStringList in the call to WriteList. }
procedure DeleteStringListItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const First, Last: Integer; const ItemName: string);
{ Default Function for creating a new Object. The classname could be received from the AppStorage using the Path "Classname" }
function DefaultObjectListItemCreateEvent(Sender: TJvCustomAppStorage; const Path: string; Index: Integer): TPersistent;
{ ObjectList item reader used by ReadObjectList in the call to ReadList. }
procedure ReadObjectListItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const Index: Integer; const ItemName: string);
{ ObjectList item writer used by WriteObjectList in the call to WriteList. }
procedure WriteObjectListItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const Index: Integer; const ItemName: string);
{ ObjectList item deleter used by WriteObjectList in the call to WriteList. }
procedure DeleteObjectListItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const First, Last: Integer; const ItemName: string);
{ StringList item reader used by ReadStringObjectList in the call to ReadList. }
procedure ReadStringObjectListItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const Index: Integer; const ItemName: string);
{ StringList item writer used by WriteStringObjectList in the call to WriteList. }
procedure WriteStringObjectListItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const Index: Integer; const ItemName: string);
{ StringList item deleter used by WriteStringObjectList in the call to WriteList. }
procedure DeleteStringObjectListItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const First, Last: Integer; const ItemName: string);
{ Collection item reader used by ReadCollection in the call to ReadList. }
procedure ReadCollectionItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const Index: Integer; const ItemName: string);
{ Collection item writer used by WriteCollection in the call to WriteList. }
procedure WriteCollectionItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const Index: Integer; const ItemName: string);
{ Collection item deleter used by WriteCollection in the call to WriteList. }
procedure DeleteCollectionItem(Sender: TJvCustomAppStorage; const Path: string;
const List: TObject; const First, Last: Integer; const ItemName: string);
{ Enum all folders in the specified folder. }
procedure EnumFolders(const Path: string; const Strings: TStrings;
const ReportListAsValue: Boolean = True); virtual; abstract;
{ Enum all values below in the specified folder. }
procedure EnumValues(const Path: string; const Strings: TStrings;
const ReportListAsValue: Boolean = True); virtual; abstract;
{ Internal retrieval of GetStoredValues. Is used to handle recursiveness. }
procedure InternalGetStoredValues(const PrefixPath, SearchPath: string;
const Strings: TStrings; const Options: TJvAppStorageEnumOptions);
{ Current root path for storage. Paths used in other methods are relative to this path. }
function GetPath: string;
{ Specify a new root. Given path is relative to the current path. Se remarks above }
procedure SetPath(const Path: string);
{ Determines if the specified name belongs to a list value. }
class function NameIsListItem(const Name: string): Boolean;
{ Application specific root. Path is prepended to any specified path and serves as an absolute
root for any reading/writing. Not all implementation will use it. Generally it's used for
storages not specific to an application (such as the registry). }
property Root: string read GetRoot write SetRoot;
{ Set the StorageOptions Property }
procedure SetStorageOptions(Value: TJvCustomAppStorageOptions);
{ Invokes the OnTranslatePropertyName event if one is assigned. }
procedure DoTranslatePropertyName(Instance: TPersistent; var Name: string;
const Reading: Boolean);
{ Determines if the specified is a sub store of this storage (will scan the entire sub storage
hierarchy. }
function HasSubStorage(AStore: TJvCustomAppStorage): Boolean;
{ Determines if the path represents a folder (ignores sub stores) }
function IsFolderInt(const Path: string; ListIsValue: Boolean = True): Boolean; virtual; abstract;
{ Determines if the specified path exists (ignores sub stores) }
function PathExistsInt(const Path: string): Boolean; virtual; abstract;
{ Determines if the specified value is stored (ignores sub stores) }
function ValueStoredInt(const Path: string): Boolean; virtual; abstract;
{ Determines if the specified list is stored (ignores sub stores) }
function ListStoredInt(const Path: string): Boolean;
{ Deletes the specified value. If the value wasn't stored, nothing will happen (ignores sub
stores). }
procedure DeleteValueInt(const Path: string); virtual; abstract;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -