📄 jvformplacement.pas
字号:
procedure TJvWinMinMaxInfo.SetMinMaxInfo(Index: Integer; AValue: Integer);
begin
if GetMinMaxInfo(Index) <> AValue then
begin
with FMinMaxInfo do
begin
case Index of
0:
ptMaxPosition.X := AValue;
1:
ptMaxPosition.Y := AValue;
2:
ptMaxSize.Y := AValue;
3:
ptMaxSize.X := AValue;
4:
ptMaxTrackSize.Y := AValue;
5:
ptMaxTrackSize.X := AValue;
6:
ptMinTrackSize.Y := AValue;
7:
ptMinTrackSize.X := AValue;
end;
end;
if FOwner <> nil then
FOwner.MinMaxInfoModified;
end;
end;
function TJvWinMinMaxInfo.DefaultMinMaxInfo: Boolean;
begin
with FMinMaxInfo do
begin
Result := not ((ptMinTrackSize.X <> 0) or (ptMinTrackSize.Y <> 0) or
(ptMaxTrackSize.X <> 0) or (ptMaxTrackSize.Y <> 0) or
(ptMaxSize.X <> 0) or (ptMaxSize.Y <> 0) or
(ptMaxPosition.X <> 0) or (ptMaxPosition.Y <> 0));
end;
end;
//=== { TJvFormStorage } =====================================================
constructor TJvFormStorage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FStoredProps := TStringList.Create;
FStoredValues := TJvStoredValues.Create(Self);
FStoredValues.Storage := Self;
end;
destructor TJvFormStorage.Destroy;
begin
FStoredProps.Free;
FStoredProps := nil;
FStoredValues.Free;
FStoredValues := nil;
inherited Destroy;
end;
procedure TJvFormStorage.SetNotification;
var
I: Integer;
Component: TComponent;
begin
for I := StoredProps.Count - 1 downto 0 do
begin
Component := TComponent(StoredProps.Objects[I]);
if Component <> nil then
Component.FreeNotification(Self);
end;
end;
function TJvFormStorage.GetStoredProps: TStrings;
begin
Result := FStoredProps;
end;
procedure TJvFormStorage.SetStoredProps(AValue: TStrings);
begin
FStoredProps.Assign(AValue);
SetNotification;
end;
procedure TJvFormStorage.SetStoredValues(AValue: TJvStoredValues);
begin
FStoredValues.Assign(AValue);
end;
function TJvFormStorage.GetStoredValue(const Name: string): Variant;
begin
Result := StoredValues.StoredValue[Name];
end;
procedure TJvFormStorage.SetStoredValue(const Name: string; AValue: Variant);
begin
StoredValues.StoredValue[Name] := AValue;
end;
procedure TJvFormStorage.Loaded;
begin
inherited Loaded;
UpdateStoredList(Owner, FStoredProps, True);
end;
procedure TJvFormStorage.WriteState(Writer: TWriter);
begin
UpdateStoredList(Owner, FStoredProps, False);
inherited WriteState(Writer);
end;
procedure TJvFormStorage.Notification(AComponent: TComponent; Operation: TOperation);
var
I: Integer;
Component: TComponent;
begin
inherited Notification(AComponent, Operation);
if not (csDestroying in ComponentState) and (Operation = opRemove) and
(FStoredProps <> nil) then
for I := FStoredProps.Count - 1 downto 0 do
begin
Component := TComponent(FStoredProps.Objects[I]);
if Component = AComponent then
FStoredProps.Delete(I);
end;
end;
procedure TJvFormStorage.SaveProperties;
begin
with TJvPropertyStorage.Create do
try
AppStoragePath := ConcatPaths ([Self.AppStoragePath, StoredPropsPath]);
AppStorage := Self.AppStorage;
StoreObjectsProps(Owner, FStoredProps);
finally
Free;
end;
end;
procedure TJvFormStorage.RestoreProperties;
begin
with TJvPropertyStorage.Create do
try
AppStoragePath := ConcatPaths ([Self.AppStoragePath, StoredPropsPath]);
AppStorage := Self.AppStorage;
try
LoadObjectsProps(Owner, FStoredProps);
except
{ ignore any exceptions }
end;
finally
Free;
end;
end;
procedure TJvFormStorage.SavePlacement;
Var
JvAppStorageHandler: IJvAppStorageHandler;
begin
inherited SavePlacement;
if Supports(Owner, IJvAppStorageHandler, JvAppStorageHandler)then
JvAppStorageHandler.WriteToAppStorage(AppStorage, AppStoragePath);
SaveProperties;
StoredValues.SaveValues;
end;
procedure TJvFormStorage.RestorePlacement;
Var
JvAppStorageHandler: IJvAppStorageHandler;
begin
inherited RestorePlacement;
FRestored := True;
if Supports(Owner, IJvAppStorageHandler, JvAppStorageHandler)then
JvAppStorageHandler.ReadFromAppStorage(AppStorage, AppStoragePath);
RestoreProperties;
StoredValues.RestoreValues;
end;
//=== { TJvIniLink } =========================================================
destructor TJvIniLink.Destroy;
begin
FOnSave := nil;
FOnLoad := nil;
SetStorage(nil);
inherited Destroy;
end;
procedure TJvIniLink.SetStorage(AValue: TJvFormPlacement);
begin
if FStorage <> AValue then
begin
if FStorage <> nil then
FStorage.RemoveLink(Self);
if AValue <> nil then
AValue.AddLink(Self);
end;
end;
procedure TJvIniLink.SaveToIni;
begin
if Assigned(FOnSave) then
FOnSave(Self);
end;
procedure TJvIniLink.LoadFromIni;
begin
if Assigned(FOnLoad) then
FOnLoad(Self);
end;
//=== { TJvStoredValue } =====================================================
constructor TJvStoredValue.Create(Collection: TCollection);
begin
inherited Create(Collection);
FValue := Unassigned;
end;
procedure TJvStoredValue.Assign(Source: TPersistent);
begin
if Source is TJvStoredValue then
begin
if VarIsEmpty(TJvStoredValue(Source).Value) then
Clear
else
Value := TJvStoredValue(Source).Value;
Name := TJvStoredValue(Source).Name;
KeyString := TJvStoredValue(Source).KeyString;
end
else
inherited Assign(Source);
end;
function TJvStoredValue.GetDisplayName: string;
begin
if FName = '' then
Result := inherited GetDisplayName
else
Result := FName;
end;
procedure TJvStoredValue.SetDisplayName(const AValue: string);
begin
if (AValue <> '') and (AnsiCompareText(AValue, FName) <> 0) and
(Collection is TJvStoredValues) and (TJvStoredValues(Collection).IndexOf(AValue) >= 0) then
raise EJVCLException.CreateRes(@SDuplicateString);
FName := AValue;
inherited SetDisplayName(AValue);
end;
function TJvStoredValue.GetStoredValues: TJvStoredValues;
begin
if Collection is TJvStoredValues then
Result := TJvStoredValues(Collection)
else
Result := nil;
end;
procedure TJvStoredValue.Clear;
begin
FValue := Unassigned;
end;
function TJvStoredValue.IsValueStored: Boolean;
begin
Result := not VarIsEmpty(FValue);
end;
procedure TJvStoredValue.Save;
var
SaveValue: Variant;
SaveStrValue: string;
PathName: string;
begin
PathName := StoredValues.Storage.ConcatPaths([StoredValues.Path, Name]);
SaveValue := Value;
if Assigned(FOnSave) then
FOnSave(Self, SaveValue);
if KeyString <> '' then
begin
SaveStrValue := VarToStr(SaveValue);
SaveStrValue := XorEncode(KeyString, SaveStrValue);
StoredValues.Storage.WriteString(PathName, SaveStrValue);
end
else
if VarIsInt(SaveValue) then
StoredValues.Storage.WriteInteger(PathName, SaveValue)
else
if VarType(SaveValue) in [varSingle, varDouble, varCurrency] then
StoredValues.Storage.WriteFloat(PathName, SaveValue)
else
if VarType(SaveValue) in [varDate] then
StoredValues.Storage.WriteDateTime(PathName, SaveValue)
else
if VarType(SaveValue) in [varBoolean] then
StoredValues.Storage.WriteBoolean(PathName, SaveValue)
else
StoredValues.Storage.WriteString(PathName, SaveValue);
end;
procedure TJvStoredValue.Restore;
var
RestoreValue: Variant;
RestoreStrValue, DefaultStrValue: string;
PathName: string;
begin
PathName := StoredValues.Storage.ConcatPaths([StoredValues.Path, Name]);
if KeyString <> '' then
begin
DefaultStrValue := VarToStr(Value);
DefaultStrValue := XorEncode(KeyString, DefaultStrValue);
RestoreStrValue := StoredValues.Storage.ReadString(PathName, DefaultStrValue);
RestoreStrValue := XorDecode(KeyString, RestoreStrValue);
RestoreValue := RestoreStrValue;
end
else
if VarIsInt(Value) then
RestoreValue := StoredValues.Storage.ReadInteger(PathName, Value)
else
if VarType(Value) in [varSingle, varDouble, varCurrency] then
RestoreValue := StoredValues.Storage.ReadFloat(PathName, Value)
else
if VarType(Value) in [varDate] then
RestoreValue := StoredValues.Storage.ReadDateTime(PathName, Value)
else
if VarType(Value) in [varBoolean] then
RestoreValue := StoredValues.Storage.ReadBoolean(PathName, Value)
else
RestoreValue := StoredValues.Storage.ReadString(PathName, Value);
if Assigned(FOnRestore) then
FOnRestore(Self, RestoreValue);
Value := RestoreValue;
end;
//=== { TJvStoredValues } ====================================================
constructor TJvStoredValues.Create(AOwner: TPersistent);
begin
inherited Create(AOwner, TJvStoredValue);
end;
function TJvStoredValues.IndexOf(const Name: string): Integer;
begin
for Result := 0 to Count - 1 do
if AnsiCompareText(Items[Result].Name, Name) = 0 then
Exit;
Result := -1;
end;
function TJvStoredValues.GetItem(Index: Integer): TJvStoredValue;
begin
Result := TJvStoredValue(inherited Items[Index]);
end;
procedure TJvStoredValues.SetItem(Index: Integer; StoredValue: TJvStoredValue);
begin
inherited SetItem(Index, TCollectionItem(StoredValue));
end;
function TJvStoredValues.GetStoredValue(const Name: string): Variant;
var
StoredValue: TJvStoredValue;
begin
StoredValue := GetValue(Name);
if StoredValue = nil then
Result := Null
else
Result := StoredValue.Value;
end;
procedure TJvStoredValues.SetStoredValue(const Name: string; AValue: Variant);
var
StoredValue: TJvStoredValue;
begin
StoredValue := GetValue(Name);
if StoredValue = nil then
begin
StoredValue := TJvStoredValue(Add);
StoredValue.Name := Name;
StoredValue.Value := AValue;
end
else
StoredValue.Value := AValue;
end;
function TJvStoredValues.GetValue(const Name: string): TJvStoredValue;
var
I: Integer;
begin
I := IndexOf(Name);
if I < 0 then
Result := nil
else
Result := Items[I];
end;
procedure TJvStoredValues.SetValue(const Name: string; StoredValue: TJvStoredValue);
var
I: Integer;
begin
I := IndexOf(Name);
if I >= 0 then
Items[I].Assign(StoredValue);
end;
procedure TJvStoredValues.SaveValues;
var
I: Integer;
begin
for I := 0 to Count - 1 do
Items[I].Save;
end;
procedure TJvStoredValues.RestoreValues;
var
I: Integer;
begin
for I := 0 to Count - 1 do
Items[I].Restore;
end;
function TJvFormStorage.GetDefaultStoredValue(const Name: string; DefValue: Variant): Variant;
begin
Result := StoredValue[Name];
if Result = Null then
Result := DefValue;
end;
procedure TJvFormStorage.SetDefaultStoredValue(const Name: string;
DefValue: Variant; const AValue: Variant);
begin
if AValue = Null then
StoredValue[Name] := DefValue
else
StoredValue[Name] := AValue;
end;
function TJvFormStorage.GetStoredValuesPath: string;
begin
Result := FStoredValues.Path;
end;
procedure TJvFormStorage.SetStoredValuesPath(const AValue: string);
begin
FStoredValues.Path := AValue;
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -