Delphi has had Inifle-Support for as long as I can remember. Inifiles are great for storing Application- and Usersettings, but I found myself doing the same things in each Application I wrote. Retrieve an appropiate directory for storing the actual file, creating and freeing the TInifile-Object.
I wanted something that I can just add to my project to store and retrieve simple values in a TInifile-like manner. Here is the result: TAppSettings. It relies on the aforementioned JSON-Library "Delphi Web Utils".
As an example the getter and setter for integer:
This alone doesn't help with the initial problem, it just changes the format of the file. The interesting part is at the bottom of the unit.
Adding this unit to your project automatically creates two Objects of TAppSettings, one for UserSettings and one for ApplicationSettings. Before I wrote TAppSettings I always had two procedures "LoadIni" and "SaveIni" in my application where I would load and save all my application settings, because that were the only places I could access the settings. Now I just use the settings wherever I need them.
You can download the complete unit here.
I wanted something that I can just add to my project to store and retrieve simple values in a TInifile-like manner. Here is the result: TAppSettings. It relies on the aforementioned JSON-Library "Delphi Web Utils".
type
TAppSettings = class
protected
fFilename : string;
fSaveOnFree: boolean;
fSettings : TJSONObject;
function createOrGetSection(aSection : string) : TJSONObject;
public
constructor Create(aFilename : string);
destructor Destroy; override;
procedure Save;
function getInteger(aSection, aKey : string; aDefault : integer) : integer;
function getString(aSection, aKey : string; aDefault : string) : string;
function getFloat(aSection, aKey : string; aDefault : double ) : double;
function getBool(aSection, aKey : string; aDefault : boolean) : boolean;
procedure setValue(aSection, aKey : string; aValue : integer); overload;
procedure setValue(aSection, aKey : string; aValue : string); overload;
procedure setValue(aSection, aKey : string; aValue : double); overload;
procedure setValue(aSection, aKey : string; aValue : boolean); overload;
property SaveOnFree : boolean read fSaveOnFree write fSaveOnFree;
procedure OpenPathInExplorer;
end;As an example the getter and setter for integer:
function TAppSettings.getInteger(aSection, aKey: string;
aDefault: integer): integer;
var
section : TJSONObject;
begin
result := aDefault;
section := fSettings.optJSONObject(aSection);
if section <> nil then result := section.optInt(aKey);
end;
function TAppSettings.createOrGetSection(aSection: string): TJSONObject;
begin
result := fSettings.optJSONObject(aSection);
if result = nil then
begin
result := TJSONObject.create;
fSettings.put(aSection,result);
end;
end;
procedure TAppSettings.setValue(aSection, aKey: string; aValue: integer);
var
section : TJSONObject;
begin
section := createOrGetSection(aSection);
section.put(aKey, aValue);
end;This alone doesn't help with the initial problem, it just changes the format of the file. The interesting part is at the bottom of the unit.
interface
const
COMPANY_NAME = 'MyCompany';
[...]
var
AppSettings, UserSettings : TAppSettings;
[...]
function GetSpecialFolder(Folder: Integer): String;
var
Path: array[0..MAX_PATH] of char;
begin
If SHGetSpecialFolderPath(0, @Path, Folder, false)
then Result:=Path
else Result:='';
end;
function GetApplicationName : string;
begin
result := ExtractFilename(ParamStr(0));
delete(result,length(result)-3,4);
end;
initialization
begin
ForceDirectories(GetSpecialFolder(CSIDL_COMMON_APPDATA)+'\'+COMPANY_NAME+'\'+GetApplicationName);
ForceDirectories(GetSpecialFolder(CSIDL_APPDATA)+'\'+COMPANY_NAME+'\'+GetApplicationName);
AppSettings := TAppSettings.Create(GetSpecialFolder(CSIDL_COMMON_APPDATA)+'\'+COMPANY_NAME+'\'+GetApplicationName+'\settings.json');
UserSettings := TAppSettings.Create(GetSpecialFolder(CSIDL_APPDATA)+'\'+COMPANY_NAME+'\'+GetApplicationName+'\settings.json');
end;
finalization
begin
AppSettings.Free;
UserSettings.Free;
end;Adding this unit to your project automatically creates two Objects of TAppSettings, one for UserSettings and one for ApplicationSettings. Before I wrote TAppSettings I always had two procedures "LoadIni" and "SaveIni" in my application where I would load and save all my application settings, because that were the only places I could access the settings. Now I just use the settings wherever I need them.
You can download the complete unit here.
Keine Kommentare:
Kommentar veröffentlichen