📄 jvqpropertystore.pas
字号:
LoadProperties;
end;
procedure TJvCustomPropertyStore.Assign(Source: TPersistent);
begin
if Source is Self.ClassType then
CloneClass(Source, Self)
else
inherited Assign(Source);
end;
procedure TJvCustomPropertyStore.Clear;
begin
end;
function TJvCustomPropertyStore.TranslatePropertyName(AName: string): string;
begin
Result := AName;
end;
procedure TJvCustomPropertyStore.SetAutoLoad(Value: Boolean);
begin
if not Assigned(Owner) then
Exit;
if Owner is TJvCustomPropertyStore then
FAutoLoad := False
else
if Value <> AutoLoad then
FAutoLoad := Value;
end;
procedure TJvCustomPropertyStore.DisableAutoLoadDown;
var
Index: Integer;
PropName: string;
begin
for Index := 0 to GetPropCount(Self) - 1 do
begin
PropName := GetPropName(Self, Index);
if IgnoreProperties.IndexOf(PropName) < 0 then
if FIntIgnoreProperties.IndexOf(PropName) < 0 then
if PropType(Self, GetPropName(Self, Index)) = tkClass then
if (TPersistent(GetOrdProp(Self, PropName)) is TJvCustomPropertyStore) then
TJvCustomPropertyStore(TPersistent(GetOrdProp(Self, PropName))).AutoLoad := False;
end;
end;
procedure TJvCustomPropertyStore.UpdateChildPaths(OldPath: string);
var
Index: Integer;
VisPropName: string;
PropName: string;
PropertyStore: TJvCustomPropertyStore;
begin
if Assigned(AppStorage) then
begin
if OldPath = '' then
OldPath := AppStoragePath;
for Index := 0 to GetPropCount(Self) - 1 do
begin
PropName := GetPropName(Self, Index);
VisPropName := AppStorage.TranslatePropertyName(Self, PropName, False);
if IgnoreProperties.IndexOf(PropName) >= 0 then
Continue;
if FIntIgnoreProperties.IndexOf(PropName) >= 0 then
Continue;
if PropType(Self, PropName) = tkClass then
if (TPersistent(GetOrdProp(Self, PropName)) is TJvCustomPropertyStore) then
begin
PropertyStore := TJvCustomPropertyStore(TPersistent(GetOrdProp(Self, PropName)));
if (PropertyStore.AppStoragePath = AppStorage.ConcatPaths([OldPath, VisPropName])) or
(PropertyStore.AppStoragePath = '') then
PropertyStore.AppStoragePath := AppStorage.ConcatPaths([AppStoragePath, VisPropName]);
end;
end;
end;
end;
procedure TJvCustomPropertyStore.SetPath(Value: string);
var
OldPath: string;
begin
OldPath := FAppStoragePath;
if Value <> AppStoragePath then
FAppStoragePath := Value;
UpdateChildPaths(OldPath);
end;
procedure TJvCustomPropertyStore.SetAppStorage(Value: TJvCustomAppStorage);
var
Index: Integer;
PropName: string;
begin
if Value <> FAppStorage then
begin
for Index := 0 to GetPropCount(Self) - 1 do
begin
PropName := GetPropName(Self, Index);
if IgnoreProperties.IndexOf(PropName) >= 0 then
Continue;
if FIntIgnoreProperties.IndexOf(PropName) >= 0 then
Continue;
if PropType(Self, PropName) = tkClass then
if (TPersistent(GetOrdProp(Self, PropName)) is TJvCustomPropertyStore) then
TJvCustomPropertyStore(TPersistent(GetOrdProp(Self, PropName))).AppStorage := Value;
end;
FAppStorage := Value;
UpdateChildPaths;
end;
end;
function TJvCustomPropertyStore.GetIgnoreProperties: TJvIgnorePropertiesStringList;
begin
Result := FIgnoreProperties;
end;
procedure TJvCustomPropertyStore.SetIgnoreProperties(Value: TJvIgnorePropertiesStringList);
begin
FIgnoreProperties.Assign(Value);
end;
function TJvCustomPropertyStore.GetLastSaveTime: TDateTime;
begin
Result := 0;
if not Enabled then
Exit;
if AppStoragePath = '' then
Exit;
try
if AppStorage.ValueStored(AppStorage.ConcatPaths([AppStoragePath, cLastSaveTime])) then
Result := AppStorage.ReadDateTime(AppStorage.ConcatPaths([AppStoragePath, cLastSaveTime]));
except
Result := 0;
end;
end;
procedure TJvCustomPropertyStore.LoadProperties;
begin
if not Enabled then
Exit;
if not Assigned(AppStorage) then
Exit;
UpdateChildPaths;
FLastLoadTime := Now;
if ClearBeforeLoad then
Clear;
if Assigned(FOnBeforeLoadProperties) then
FOnBeforeLoadProperties(Self);
LoadData;
AppStorage.ReadPersistent(AppStoragePath, Self, True, True, CombinedIgnoreProperties);
if Assigned(FOnAfterLoadProperties) then
FOnAfterLoadProperties(Self);
end;
procedure TJvCustomPropertyStore.StoreProperties;
var
SaveProperties: Boolean;
begin
if not Enabled then
Exit;
if ReadOnly then
Exit;
if not Assigned(AppStorage) then
Exit;
AppStorage.BeginUpdate;
try
UpdateChildPaths;
DisableAutoLoadDown;
SaveProperties := IgnoreLastLoadTime or (GetLastSaveTime < FLastLoadTime);
if DeleteBeforeStore then
AppStorage.DeleteSubTree(AppStoragePath);
if not IgnoreLastLoadTime then
AppStorage.WriteString(AppStorage.ConcatPaths([AppStoragePath, cLastSaveTime]), DateTimeToStr(Now));
if Assigned(FOnBeforeStoreProperties) then
FOnBeforeStoreProperties(Self);
if SaveProperties then
StoreData;
AppStorage.WritePersistent(AppStoragePath, Self, True, CombinedIgnoreProperties);
if Assigned(FOnAfterStoreProperties) then
FOnAfterStoreProperties(Self);
finally
AppStorage.EndUpdate;
end;
end;
procedure TJvCustomPropertyStore.LoadData;
begin
end;
procedure TJvCustomPropertyStore.StoreData;
begin
end;
//=== { TJvCustomPropertyListStore } =========================================
constructor TJvCustomPropertyListStore.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FItems := CreateItemList;
CreateListEntries := True;
FreeObjects := True;
FItemName := cItem;
FIntIgnoreProperties.Add('ItemName');
FIntIgnoreProperties.Add('FreeObjects');
FIntIgnoreProperties.Add('CreateListEntries');
end;
destructor TJvCustomPropertyListStore.Destroy;
begin
Clear;
FreeAndNil(FItems);
inherited Destroy;
end;
function TJvCustomPropertyListStore.GetItems: TStringList;
begin
Result := FItems;
end;
procedure TJvCustomPropertyListStore.StoreData;
begin
inherited StoreData;
AppStorage.WriteList(AppStoragePath, nil, Count, WriteSLOItem, DeleteSLOItems, ItemName);
end;
procedure TJvCustomPropertyListStore.LoadData;
begin
inherited LoadData;
AppStorage.ReadList(AppStoragePath, nil, ReadSLOItem, ItemName);
end;
procedure TJvCustomPropertyListStore.Clear;
var
I: Integer;
begin
if FreeObjects then
for I := 0 to Count - 1 do
if Assigned(Objects[I]) then
begin
Objects[I].Free;
Objects[I] := nil;
end;
if Assigned(Items) then
Items.Clear;
inherited Clear;
end;
function TJvCustomPropertyListStore.CreateItemList: TStringList;
begin
Result := TStringList.Create;
end;
function TJvCustomPropertyListStore.CreateObject: TObject;
begin
Result := nil;
end;
function TJvCustomPropertyListStore.GetString(Index: Integer): string;
begin
if Assigned(Items) then
Result := Items.Strings[Index]
else
Result := '';
end;
function TJvCustomPropertyListStore.GetObject(Index: Integer): TObject;
begin
if Assigned(Items) then
Result := Items.Objects[Index]
else
Result := nil;
end;
procedure TJvCustomPropertyListStore.SetString(Index: Integer; Value: string);
begin
Items.Strings[Index] := Value;
end;
procedure TJvCustomPropertyListStore.SetObject(Index: Integer; Value: TObject);
begin
Items.Objects[Index] := Value;
end;
function TJvCustomPropertyListStore.GetCount: Integer;
begin
if Assigned(Items) then
Result := Items.Count
else
Result := -1;
end;
function TJvCustomPropertyListStore.GetSorted: Boolean;
begin
Result := FItems.Sorted;
end;
procedure TJvCustomPropertyListStore.SetSorted (Value: Boolean);
begin
FItems.Sorted := Value;
end;
function TJvCustomPropertyListStore.GetDuplicates: TDuplicates;
begin
Result := FItems.Duplicates;
end;
procedure TJvCustomPropertyListStore.SetDuplicates (Value: TDuplicates);
begin
FItems.Duplicates := Value;
end;
procedure TJvCustomPropertyListStore.ReadSLOItem(Sender: TJvCustomAppStorage;
const Path: string; const List: TObject; const Index: Integer; const ItemName: string);
var
NewObject: TObject;
NewObjectName: string;
begin
if Index >= Count then
begin
if not CreateListEntries then
Exit;
NewObject := CreateObject;
if Assigned(NewObject) then
begin
if NewObject is TJvCustomPropertyStore then
begin
TJvCustomPropertyStore(NewObject).AppStoragePath :=
Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]);
TJvCustomPropertyStore(NewObject).AppStorage := AppStorage;
TJvCustomPropertyStore(NewObject).LoadProperties;
end
else
if NewObject is TPersistent then
Sender.ReadPersistent(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]),
TPersistent(NewObject), True, True, CombinedIgnoreProperties);
if Sender.ValueStored(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)])) then
NewObjectName := Sender.ReadString(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]))
else
NewObjectName := '';
Items.AddObject(NewObjectName, NewObject);
end
else
Items.Add(Sender.ReadString(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)])))
end
else
if Assigned(Objects[Index]) then
begin
if Objects[Index] is TJvCustomPropertyStore then
begin
TJvCustomPropertyStore(Objects[Index]).AppStoragePath :=
Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]);
TJvCustomPropertyStore(Objects[Index]).LoadProperties;
end
else
if Objects[Index] is TPersistent then
Sender.ReadPersistent(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]),
TPersistent(Objects[Index]), True, True, CombinedIgnoreProperties);
if Sender.ValueStored(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)])) then
Strings[Index] := Sender.ReadString(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]))
else
Strings[Index] := '';
end
else
Strings[Index] := Sender.ReadString(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]));
end;
procedure TJvCustomPropertyListStore.WriteSLOItem(Sender: TJvCustomAppStorage; const Path: string; const List: TObject;
const Index: Integer; const ItemName: string);
begin
if Assigned(Objects[Index]) then
begin
if Objects[Index] is TJvCustomPropertyStore then
begin
TJvCustomPropertyStore(Objects[Index]).AppStoragePath :=
Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]);
TJvCustomPropertyStore(Objects[Index]).AppStorage := AppStorage;
TJvCustomPropertyStore(Objects[Index]).StoreProperties;
end
else
if Objects[Index] is TPersistent then
Sender.WritePersistent(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]),
TPersistent(Objects[Index]), True, CombinedIgnoreProperties);
if Strings[Index] <> '' then
Sender.WriteString(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]), Strings[Index]);
end
else
Sender.WriteString(Sender.ConcatPaths([Path, ItemName + IntToStr(Index)]), Strings[Index]);
end;
procedure TJvCustomPropertyListStore.DeleteSLOItems(Sender: TJvCustomAppStorage;
const Path: string; const List: TObject; const First, Last: Integer; const ItemName: string);
var
I: Integer;
begin
for I := First to Last do
Sender.DeleteValue(Sender.ConcatPaths([Path, ItemName + IntToStr(I)]));
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvQPropertyStore.pas,v $';
Revision: '$Revision: 1.21 $';
Date: '$Date: 2005/02/06 14:06:16 $';
LogPath: 'JVCL\run'
);
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -