📄 freeotfesettings.pas
字号:
unit FreeOTFESettings;
// Description:
// By Sarah Dean
// Email: sdean12@sdean12.org
// WWW: http://www.FreeOTFE.org/
//
// -----------------------------------------------------------------------------
//
interface
uses
Classes; // Required for TShortCut
type
TDragDropFileType = (ftPrompt, ftFreeOTFE, ftLinux);
TSettingsSaveLocation = (slNone, slExeDir, slProfile);
const
DragDropFileTypeTitle: array [TDragDropFileType] of string = (
'<prompt user>',
'FreeOTFE',
'Linux'
);
SettingsSaveLocationTitle: array [TSettingsSaveLocation] of string = (
'<Do not save settings>',
'FreeOTFE executable dir',
'User profile'
);
SettingsSaveLocationSearchOrder: array [TSettingsSaveLocation] of TSettingsSaveLocation = (
slExeDir,
slProfile,
slNone
);
type
TFreeOTFESettings = class
protected
function IdentifyWhereSettingsStored(): TSettingsSaveLocation;
public
OptSettingsVersion: integer;
OptSaveSettings: TSettingsSaveLocation;
// General...
OptAllowMultipleInstances: boolean;
OptDisplayToolbar: boolean;
OptDisplayStatusbar: boolean;
OptAutoStartPortable: boolean;
// Drag 'n Drop...
OptDragDropFileType: TDragDropFileType;
// System tray icon related...
OptSystemTrayIconDisplay: boolean;
OptSystemTrayIconMinTo: boolean;
OptSystemTrayIconCloseTo: boolean;
// Hotkey related...
OptHKeyEnableDismount: boolean;
OptHKeyKeyDismount: TShortCut;
OptHKeyEnableDismountEmerg: boolean;
OptHKeyKeyDismountEmerg: TShortCut;
constructor Create();
procedure Load();
function Save(): boolean;
function DestroySettingsFile(loc: TSettingsSaveLocation): boolean;
function GetSettingsFilename(loc: TSettingsSaveLocation): string;
end;
var
// Global variable
Settings: TFreeOTFESettings;
implementation
uses
INIFiles,
Windows, // Required to get rid of compiler hint re DeleteFile
SysUtils, // Required for ChangeFileExt, DeleteFile
Dialogs,
SDUGeneral,
SDUDialogs,
Menus, // Required for ShortCutToText and TextToShortCut
ShlObj; // Required for CSIDL_PERSONAL
const
SETTINGS_V1 = 1;
SETTINGS_V2 = 2;
// -- General section --
SECTION_GENERAL = 'General';
OPT_SETTINGSVERSION = 'SettingsVersion';
DFLT_OPT_SETTINGSVERSION = SETTINGS_V2;
OPT_SAVESETTINGS = 'SaveSettings';
DFLT_OPT_SAVESETTINGS = slProfile;
OPT_ALLOWMULTIPLEINSTANCES = 'AllowMultipleInstances';
DFLT_OPT_ALLOWMULTIPLEINSTANCES = FALSE;
OPT_DISPLAYTOOLBAR = 'DisplayToolbar';
DFLT_OPT_DISPLAYTOOLBAR = TRUE;
OPT_DISPLAYSTATUSBAR = 'DisplayStatusbar';
DFLT_OPT_DISPLAYSTATUSBAR = TRUE;
OPT_AUTOSTARTPORTABLE = 'AutoStartPortable';
DFLT_OPT_AUTOSTARTPORTABLE = FALSE;
OPT_DRAGDROP = 'DragDropFileType';
DFLT_OPT_DRAGDROP = ord(ftFreeOTFE);
// -- System tray icon section --
SECTION_SYSTEMTRAYICON = 'SystemTrayIcon';
OPT_SYSTEMTRAYICONDISPLAY = 'Display';
DFLT_OPT_SYSTEMTRAYICONDISPLAY = FALSE;
OPT_SYSTEMTRAYICONMINTO = 'MinTo';
DFLT_OPT_SYSTEMTRAYICONMINTO = FALSE;
OPT_SYSTEMTRAYICONCLOSETO = 'CloseTo';
DFLT_OPT_SYSTEMTRAYICONCLOSETO = FALSE;
// -- Hotkey section --
SECTION_HOTKEY = 'Hotkeys';
OPT_HOTKEYENABLEDISMOUNT = 'EnableDismount';
DFLT_OPT_HOTKEYENABLEDISMOUNT = FALSE;
OPT_HOTKEYKEYDISMOUNT = 'KeyDismount';
DFLT_OPT_HOTKEYKEYDISMOUNT = 'Shift+Ctrl+D';
OPT_HOTKEYENABLEDISMOUNTEMERG = 'EnableDismountEmerg';
DFLT_OPT_HOTKEYENABLEDISMOUNTEMERG = FALSE;
OPT_HOTKEYKEYDISMOUNTEMERG = 'KeyDismountEmerg';
DFLT_OPT_HOTKEYKEYDISMOUNTEMERG = 'Shift+Ctrl+Alt+D';
constructor TFreeOTFESettings.Create();
begin
inherited;
Load();
end;
procedure TFreeOTFESettings.Load();
var
iniFile: TINIFile;
begin
OptSaveSettings:= IdentifyWhereSettingsStored();
iniFile := TINIFile.Create(GetSettingsFilename(OptSaveSettings));
try
OptSettingsVersion := iniFile.ReadInteger(SECTION_GENERAL, OPT_SETTINGSVERSION, SETTINGS_V1);
OptAllowMultipleInstances := iniFile.ReadBool(SECTION_GENERAL, OPT_ALLOWMULTIPLEINSTANCES, DFLT_OPT_ALLOWMULTIPLEINSTANCES);
OptDisplayToolbar := iniFile.ReadBool(SECTION_GENERAL, OPT_DISPLAYTOOLBAR, DFLT_OPT_DISPLAYTOOLBAR);
OptDisplayStatusbar := iniFile.ReadBool(SECTION_GENERAL, OPT_DISPLAYSTATUSBAR, DFLT_OPT_DISPLAYSTATUSBAR);
OptAutoStartPortable := iniFile.ReadBool(SECTION_GENERAL, OPT_AUTOSTARTPORTABLE, DFLT_OPT_AUTOSTARTPORTABLE);
OptDragDropFileType := TDragDropFileType(iniFile.ReadInteger(SECTION_GENERAL, OPT_DRAGDROP, DFLT_OPT_DRAGDROP));
OptSystemTrayIconDisplay := iniFile.ReadBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONDISPLAY, DFLT_OPT_SYSTEMTRAYICONDISPLAY);
OptSystemTrayIconMinTo := iniFile.ReadBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONMINTO, DFLT_OPT_SYSTEMTRAYICONMINTO);
OptSystemTrayIconCloseTo := iniFile.ReadBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONCLOSETO, DFLT_OPT_SYSTEMTRAYICONCLOSETO);
OptHKeyEnableDismount := iniFile.ReadBool(SECTION_HOTKEY, OPT_HOTKEYENABLEDISMOUNT, DFLT_OPT_HOTKEYENABLEDISMOUNT);
OptHKeyKeyDismount := TextToShortCut(iniFile.ReadString(SECTION_HOTKEY, OPT_HOTKEYKEYDISMOUNT, DFLT_OPT_HOTKEYKEYDISMOUNT));
OptHKeyEnableDismountEmerg := iniFile.ReadBool(SECTION_HOTKEY, OPT_HOTKEYENABLEDISMOUNTEMERG, DFLT_OPT_HOTKEYENABLEDISMOUNTEMERG);
OptHKeyKeyDismountEmerg := TextToShortCut(iniFile.ReadString(SECTION_HOTKEY, OPT_HOTKEYKEYDISMOUNTEMERG, DFLT_OPT_HOTKEYKEYDISMOUNTEMERG));
finally
iniFile.Free();
end;
end;
function TFreeOTFESettings.Save(): boolean;
var
allOK: boolean;
iniFile: TINIFile;
filename: string;
begin
allOK := TRUE;
if (OptSaveSettings <> slNone) then
begin
filename := GetSettingsFilename(OptSaveSettings);
try
iniFile := TINIFile.Create(filename);
try
iniFile.WriteInteger(SECTION_GENERAL, OPT_SETTINGSVERSION, SETTINGS_V2);
iniFile.WriteBool(SECTION_GENERAL, OPT_ALLOWMULTIPLEINSTANCES, OptAllowMultipleInstances);
iniFile.WriteBool(SECTION_GENERAL, OPT_DISPLAYTOOLBAR, OptDisplayToolbar);
iniFile.WriteBool(SECTION_GENERAL, OPT_DISPLAYSTATUSBAR, OptDisplayStatusbar);
iniFile.WriteBool(SECTION_GENERAL, OPT_AUTOSTARTPORTABLE, OptAutoStartPortable);
iniFile.WriteInteger(SECTION_GENERAL, OPT_DRAGDROP, ord(OptDragDropFileType));
iniFile.WriteBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONDISPLAY, OptSystemTrayIconDisplay);
iniFile.WriteBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONMINTO, OptSystemTrayIconMinTo);
iniFile.WriteBool(SECTION_SYSTEMTRAYICON, OPT_SYSTEMTRAYICONCLOSETO, OptSystemTrayIconCloseTo);
iniFile.WriteBool(SECTION_HOTKEY, OPT_HOTKEYENABLEDISMOUNT, OptHKeyEnableDismount);
iniFile.WriteString(SECTION_HOTKEY, OPT_HOTKEYKEYDISMOUNT, ShortCutToText(OptHKeyKeyDismount));
iniFile.WriteBool(SECTION_HOTKEY, OPT_HOTKEYENABLEDISMOUNTEMERG, OptHKeyEnableDismountEmerg);
iniFile.WriteString(SECTION_HOTKEY, OPT_HOTKEYKEYDISMOUNTEMERG, ShortCutToText(OptHKeyKeyDismountEmerg));
finally
iniFile.Free();
end;
except
on E: Exception do
begin
allOK := FALSE;
SDUMessageDlg(
'Your settings could not be saved.'+SDUCRLF+
SDUCRLF+
'Please ensure that you have suitable access rights in order to write to:'+SDUCRLF+
SDUCRLF+
filename,
mtError,
[mbOK],
0
);
end;
end;
end;
Result := allOK;
end;
function TFreeOTFESettings.DestroySettingsFile(loc: TSettingsSaveLocation): boolean;
var
filename: string;
begin
filename := GetSettingsFilename(loc);
Result := DeleteFile(filename);
end;
function TFreeOTFESettings.GetSettingsFilename(loc: TSettingsSaveLocation): string;
var
iniFilenameOnly: string;
filenameAndPath: string;
begin
filenameAndPath := '';
iniFilenameOnly := ChangeFileExt(ExtractFilename(ParamStr(0)), '.ini');
if (loc = slNone) then
begin
// Do nothing; already set to empty string
end
else if (loc = slExeDir) then
begin
filenameAndPath := ExtractFilePath(ParamStr(0)) + iniFilenameOnly;
end
else if (loc = slProfile) then
begin
filenameAndPath := SDUGetSpecialFolderPath(CSIDL_PERSONAL)+
'\'+
iniFilenameOnly
end
else
begin
showmessage('Unknown settings location?! Please report seeing this message!');
end;
Result := filenameAndPath;
end;
// Identify where user settings are stored
function TFreeOTFESettings.IdentifyWhereSettingsStored(): TSettingsSaveLocation;
var
sl: TSettingsSaveLocation;
filename: string;
retval: TSettingsSaveLocation;
checkLocation: TSettingsSaveLocation;
begin
retval := slNone;
for sl := low(SettingsSaveLocationSearchOrder) to high(SettingsSaveLocationSearchOrder) do
begin
checkLocation := SettingsSaveLocationSearchOrder[sl];
filename := GetSettingsFilename(checkLocation);
if (
(filename <> '') and
FileExists(filename)
) then
begin
retval := checkLocation;
break;
end;
end;
Result := retval;
end;
END.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -