374 lines
16 KiB
ObjectPascal
374 lines
16 KiB
ObjectPascal
|
unit uOptions;
|
|||
|
|
|||
|
{$mode objfpc}{$H+}
|
|||
|
|
|||
|
interface
|
|||
|
|
|||
|
uses
|
|||
|
Classes, SysUtils, Forms, IniFiles, uFileUtils;
|
|||
|
|
|||
|
type
|
|||
|
// Класс настроек
|
|||
|
|
|||
|
{ TOptions }
|
|||
|
|
|||
|
TOptions = class(TIniFile)
|
|||
|
strict private
|
|||
|
// Файл локализации
|
|||
|
FLocale: string;
|
|||
|
|
|||
|
// Прилипание к краям экрана
|
|||
|
FScreenSnap: Boolean;
|
|||
|
// Показывать описания пакетов
|
|||
|
FShowPkgDesc: Boolean;
|
|||
|
// Рисовать в деревьях линии уровней вложенности
|
|||
|
FDrawOutlines: Boolean;
|
|||
|
// Поверх всех окон
|
|||
|
FOnTop: Boolean;
|
|||
|
|
|||
|
// Немедленно сообщать о коде возврата <> 0
|
|||
|
FChkExitCodes: Boolean;
|
|||
|
// Не снимать отметку с чекбокса при коде возврата <> 0
|
|||
|
FDntUnChkItems: Boolean;
|
|||
|
// Раскрашивать список программ после установки
|
|||
|
FColorSoftTree: Boolean;
|
|||
|
// Отображать общий ход установки программ
|
|||
|
FShowProgress: Boolean;
|
|||
|
// Тихий импорт REG-файлов
|
|||
|
FQuietREG: Boolean;
|
|||
|
// Раскрывать дерево после загрузки пакета
|
|||
|
FExpandSoft: Boolean;
|
|||
|
|
|||
|
// Скрывать главное окно при запуске утилит
|
|||
|
FHideOnTool: Boolean;
|
|||
|
// Раскрывать дерево после загрузки пакета
|
|||
|
FExpandTools: Boolean;
|
|||
|
|
|||
|
// Последняя позиция по горизонтали от левого края экрана
|
|||
|
FLeft: Integer;
|
|||
|
// Последняя позиция по вертикали от верхнего края экрана
|
|||
|
FTop: Integer;
|
|||
|
// Последняя ширина
|
|||
|
FWidth: Integer;
|
|||
|
// Последняя высота
|
|||
|
FHeight: Integer;
|
|||
|
|
|||
|
// Параметры, с которыми запушена ABTool
|
|||
|
FCLParams: TStringList;
|
|||
|
private
|
|||
|
// Установка параметра локализации
|
|||
|
procedure SetLocale(ALngFilename: string);
|
|||
|
public
|
|||
|
// Файл локализации
|
|||
|
property Locale: string read FLocale write SetLocale;
|
|||
|
|
|||
|
// Прилипание к краям экрана
|
|||
|
property ScreenSnap: Boolean read FScreenSnap write FScreenSnap default True;
|
|||
|
// Показывать описания пакетов
|
|||
|
property ShowPkgDesc: Boolean read FShowPkgDesc write FShowPkgDesc default True;
|
|||
|
// Рисовать в деревьях линии уровней вложенности
|
|||
|
property DrawOutlines: Boolean read FDrawOutlines write FDrawOutlines default True;
|
|||
|
// Поверх всех окон
|
|||
|
property OnTop: Boolean read FOnTop write FOnTop default False;
|
|||
|
|
|||
|
// Немедленно сообщать о коде возврата <> 0
|
|||
|
property ChkExitCodes: Boolean read FChkExitCodes write FChkExitCodes default True;
|
|||
|
// Не снимать отметку с чекбокса при коде возврата <> 0
|
|||
|
property DntUnChkItems: Boolean read FDntUnChkItems write FDntUnChkItems default True;
|
|||
|
// Раскрашивать список программ после установки
|
|||
|
property ColorSoftTree: Boolean read FColorSoftTree write FColorSoftTree default True;
|
|||
|
// Отображать общий ход установки программ
|
|||
|
property ShowProgress: Boolean read FShowProgress write FShowProgress default True;
|
|||
|
// Тихий импорт REG-файлов
|
|||
|
property QuietREG: Boolean read FQuietREG write FQuietREG default True;
|
|||
|
// Раскрывать дерево после загрузки пакета
|
|||
|
property ExpandSoft: Boolean read FExpandSoft write FExpandSoft default True;
|
|||
|
|
|||
|
// Скрывать главное окно при запуске утилит
|
|||
|
property HideOnTool: Boolean read FExpandSoft write FExpandSoft default False;
|
|||
|
// Раскрывать дерево после загрузки пакета
|
|||
|
property ExpandTools: Boolean read FExpandSoft write FExpandSoft default True;
|
|||
|
|
|||
|
// Последняя позиция по горизонтали от левого края экрана
|
|||
|
property Left: Integer read FLeft write FLeft;
|
|||
|
// Последняя позиция по вертикали от верхнего края экрана
|
|||
|
property Top: Integer read FTop write FTop;
|
|||
|
// Последняя ширина
|
|||
|
property Width: Integer read FWidth write FWidth default 350;
|
|||
|
// Последняя высота
|
|||
|
property Height: Integer read FHeight write FHeight default 450;
|
|||
|
|
|||
|
// Параметры, с которыми запушена ABTool
|
|||
|
property CLParams: TStringList read FCLParams;
|
|||
|
// Пути ко всем доступным файлам локализаций
|
|||
|
function ReadAvailableLocales(AFullPaths: Boolean = True): TStringList;
|
|||
|
|
|||
|
// Создание объекта настроек и установка настроек
|
|||
|
constructor Create(AIniFilename: string); overload;
|
|||
|
// Деструктор объекта настроек
|
|||
|
destructor Destroy(); override;
|
|||
|
// Определение наличия доп. ключей запуска
|
|||
|
function HasCLParams: Boolean;
|
|||
|
// Установка параметров командной строки, с которыми запущен ABTool
|
|||
|
procedure ReadCLParams;
|
|||
|
// Поиск ключа запуска среди всех, с которыми запущен ABTool
|
|||
|
function FindCLParam(AParamName: string): Boolean;
|
|||
|
// Чтение настроек
|
|||
|
procedure Load;
|
|||
|
|
|||
|
end; // TOptions
|
|||
|
|
|||
|
var
|
|||
|
// Настройки - глобальный объект, доступный всем модулям, сославшимся на этот
|
|||
|
GlobalOptions: TOptions;
|
|||
|
|
|||
|
implementation
|
|||
|
|
|||
|
{ TOptions }
|
|||
|
|
|||
|
{------------------------------------------------------------------------------
|
|||
|
Конструктор: TOptions.Create()
|
|||
|
Назначение: Создание объекта настроек и установка настроек
|
|||
|
------------------------------------------------------------------------------}
|
|||
|
constructor TOptions.Create(AIniFilename: string);
|
|||
|
begin
|
|||
|
if HasCLParams then
|
|||
|
ReadCLParams;
|
|||
|
//ReadAvailableLocales;
|
|||
|
inherited Create(AIniFilename, [ifoStripComments, ifoStripInvalid]);
|
|||
|
Load;
|
|||
|
GlobalOptions := Self;
|
|||
|
end;
|
|||
|
|
|||
|
{------------------------------------------------------------------------------
|
|||
|
Деструктор: TOptions.Destroy()
|
|||
|
------------------------------------------------------------------------------}
|
|||
|
destructor TOptions.Destroy();
|
|||
|
begin
|
|||
|
inherited Destroy();
|
|||
|
end;
|
|||
|
|
|||
|
{------------------------------------------------------------------------------
|
|||
|
Функция: TOptions.HasCLParams()
|
|||
|
Назначение: Определение наличия доп. ключей запуска
|
|||
|
Возвращает: boolean
|
|||
|
------------------------------------------------------------------------------}
|
|||
|
function TOptions.HasCLParams: Boolean;
|
|||
|
begin
|
|||
|
Result := ParamCount > 0;
|
|||
|
//if FDebug then
|
|||
|
// Log('DoesABToolHaveKeys(): '+BoolToStr(Result));
|
|||
|
end;
|
|||
|
|
|||
|
{------------------------------------------------------------------------------
|
|||
|
Процедура: TOptions.ReadCLParams()
|
|||
|
Назначение: Установка параметров командной строки, с которыми запущен ABTool
|
|||
|
------------------------------------------------------------------------------}
|
|||
|
procedure TOptions.ReadCLParams;
|
|||
|
var
|
|||
|
i: byte;
|
|||
|
begin
|
|||
|
if HasCLParams then
|
|||
|
begin
|
|||
|
FCLParams := TStringList.Create;
|
|||
|
for i := 1 to ParamCount do
|
|||
|
FCLParams.Add(Trim(LowerCase(ParamStr(i))));
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
{------------------------------------------------------------------------------
|
|||
|
Функция: TOptions.FindCLParam()
|
|||
|
Назначение: Поиск ключа запуска среди всех, с которыми запущен ABTool
|
|||
|
Возвращает: boolean
|
|||
|
------------------------------------------------------------------------------}
|
|||
|
function TOptions.FindCLParam(AParamName: string): Boolean;
|
|||
|
var
|
|||
|
i: Smallint;
|
|||
|
begin
|
|||
|
Result := False;
|
|||
|
if HasCLParams then
|
|||
|
begin
|
|||
|
for i := 0 to FCLParams.Count - 1 do
|
|||
|
if Pos(LowerCase(AParamName), FCLParams.Strings[i]) > 0 then
|
|||
|
begin
|
|||
|
Result := True;
|
|||
|
Exit;
|
|||
|
end;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
{------------------------------------------------------------------------------
|
|||
|
Процедура: TOptions.Load()
|
|||
|
Назначение: Чтение настроек
|
|||
|
------------------------------------------------------------------------------}
|
|||
|
procedure TOptions.Load;
|
|||
|
begin
|
|||
|
try
|
|||
|
//TODO создание дефолтного файла настроек при отсутсвии такового
|
|||
|
//TODO создание файла настроек по умолчанию
|
|||
|
SetLocale(ReadString('Options', 'Locale', ''));
|
|||
|
|
|||
|
FScreenSnap := ReadBool('Options', 'ScreenSnap', True);
|
|||
|
FShowPkgDesc := ReadBool('Options', 'ShowPkgDesc', True);
|
|||
|
FDrawOutlines := ReadBool('Options', 'DrawOutlines', True);
|
|||
|
FOnTop := ReadBool('Options', 'OnTop', False);
|
|||
|
|
|||
|
FChkExitCodes := ReadBool('Options', 'ChkExitCodes', False);
|
|||
|
FDntUnChkItems := ReadBool('Options', 'DntUnChkItems', True);
|
|||
|
FColorSoftTree := ReadBool('Options', 'ColorSoftTree', True);
|
|||
|
FShowProgress := ReadBool('Options', 'ShowProgress', True);
|
|||
|
FQuietREG := ReadBool('Options', 'QuietREG', False);
|
|||
|
FExpandSoft := ReadBool('Options', 'ExpandSoft', True);
|
|||
|
|
|||
|
FHideOnTool := ReadBool('Options', 'HideOnTool', False);
|
|||
|
FExpandTools := ReadBool('Options', 'ExpandTools', True);
|
|||
|
|
|||
|
FLeft := ReadInteger('Options', 'Left', (Screen.Width div 2) - 175);
|
|||
|
FTop := ReadInteger('Options', 'Top', (Screen.Height div 2) - 225);
|
|||
|
FWidth := ReadInteger('Options', 'Width', 350);
|
|||
|
FHeight := ReadInteger('Options', 'Height', 450);
|
|||
|
except // SysErrorMessage(GetLastError)
|
|||
|
On E: Exception do
|
|||
|
begin
|
|||
|
raise Exception.Create('Не удалось прочитать настройки из файла abtool.ini.');
|
|||
|
//+ #13#10 +
|
|||
|
//'Сейчас он будет создан с параметрами по умолчанию.' + #13#10 +
|
|||
|
//'Сообщение системы: ' + #13#10 + E.Message + '(' + IntToStr(GetLastError) + ') ');
|
|||
|
//SaveOptions(true);
|
|||
|
end;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
{------------------------------------------------------------------------------
|
|||
|
Процедура: TOptions.SetLocale()
|
|||
|
Назначение: Установка параметра локализации
|
|||
|
------------------------------------------------------------------------------}
|
|||
|
procedure TOptions.SetLocale(ALngFilename: string);
|
|||
|
begin
|
|||
|
//TODO проверка существования файла локализации
|
|||
|
FLocale := ALngFilename;
|
|||
|
end;
|
|||
|
|
|||
|
{------------------------------------------------------------------------------
|
|||
|
Процедура: TOptions.ReadAvailableLocales()
|
|||
|
Назначение: Получение списка всех доступных файлов локализаций
|
|||
|
Вх. параметры:
|
|||
|
FullPaths: boolean - возвращать полные пути (true) или только имена
|
|||
|
файлов (false). По умолчанию true.
|
|||
|
Возвращает: TStringList
|
|||
|
------------------------------------------------------------------------------}
|
|||
|
function TOptions.ReadAvailableLocales(AFullPaths: Boolean = True): TStringList;
|
|||
|
begin
|
|||
|
Result := GetLocalesIniFileList(AFullPaths);
|
|||
|
end;
|
|||
|
|
|||
|
{
|
|||
|
// Чтение настроек
|
|||
|
function LoadOptions: boolean;
|
|||
|
begin
|
|||
|
Result := false;
|
|||
|
if Options.Debug then
|
|||
|
Log('LoadOptions()');
|
|||
|
Log('Загрузка настроек из abtool.ini...');
|
|||
|
if not (FileExists(ABToolIniPath + 'abtool.ini')) then begin
|
|||
|
Log('Файла настроек не существует. Сейчас он будет создан с параметрами по умолчанию...');
|
|||
|
SaveOptions(true);
|
|||
|
end // if FileExists
|
|||
|
else begin
|
|||
|
try
|
|||
|
try
|
|||
|
with Options do begin
|
|||
|
ABToolIniFile := TInifile.Create(ABToolIniPath + 'abtool.ini');
|
|||
|
ABToolKeys := TStringList.Create;
|
|||
|
ABToolKeys := GetABToolKeys;
|
|||
|
if Options.Debug then
|
|||
|
Log('LoadOptions(): ABToolKeys='+GetABToolKeys.text);
|
|||
|
// Непосредственно чтение настроек из INI в память
|
|||
|
if FindCLParam('+lang') then begin
|
|||
|
LangFile := ReadString('Options','LangFile','');
|
|||
|
if Options.Debug then
|
|||
|
Log('LoadOptions(): LangFile='+LangFile);
|
|||
|
end; // if +lang
|
|||
|
Left := ReadInteger('Options','Left', (Screen.Width div 2) - 180);
|
|||
|
Top := ReadInteger('Options','Top', (Screen.Height div 2) - 292);
|
|||
|
Width := ReadInteger('Options','Width', 360);
|
|||
|
Height := ReadInteger('Options','Height', 485);
|
|||
|
ChkExitCodes := ReadBool('Options','ChkExitCodes',false);
|
|||
|
DntUnChkItems := ReadBool('Options','DntUnChkItems',true);
|
|||
|
ColorSoftTree := ReadBool('Options','ColorSoftTree',true);
|
|||
|
ShowProgress := ReadBool('Options','ShowProgress',true);
|
|||
|
ExpandSoft := ReadBool('Options','ExpandSoft',true);
|
|||
|
QuietREG := ReadBool('Options','QuietREG',false);
|
|||
|
HideOnTool := ReadBool('Options','HideOnTool',false);
|
|||
|
ExpandTools := ReadBool('Options','ExpandTools',true);
|
|||
|
ShowLog := ReadBool('Options','ShowLog',true);
|
|||
|
DrawOutlines := ReadBool('Options','DrawOutlines',true);
|
|||
|
ScreenSnap := ReadBool('Options','ScreenSnap',true);
|
|||
|
OnTop := ReadBool('Options','OnTop',false);
|
|||
|
ShowPkgDesc := ReadBool('Options','ShowPkgDesc',true);
|
|||
|
SrchVisible := ReadBool('Options','SrchVisible',false);
|
|||
|
ScrollLog := ReadBool('Options','ScrollLog',true);
|
|||
|
LastSoftPkg := ReadString('Options','LastSoftPkg', '');
|
|||
|
LastToolPkg := ReadString('Options','LastToolPkg', '');
|
|||
|
if Options.Debug then begin
|
|||
|
Log('LoadOptions(): Left='+Left.ToString);
|
|||
|
Log('LoadOptions(): Top='+Top.ToString);
|
|||
|
Log('LoadOptions(): Width='+Width.ToString);
|
|||
|
Log('LoadOptions(): Height='+Height.ToString);
|
|||
|
Log('LoadOptions(): ChkExitCodes='+BoolToStr(ChkExitCodes));
|
|||
|
Log('LoadOptions(): DntUnChkItems='+BoolToStr(DntUnChkItems));
|
|||
|
Log('LoadOptions(): ColorSoftTree='+BoolToStr(ColorSoftTree));
|
|||
|
Log('LoadOptions(): ShowProgress='+BoolToStr(ShowProgress));
|
|||
|
Log('LoadOptions(): ExpandSoft='+BoolToStr(ExpandSoft));
|
|||
|
Log('LoadOptions(): QuietREG='+BoolToStr(QuietREG));
|
|||
|
Log('LoadOptions(): HideOnTool='+BoolToStr(HideOnTool));
|
|||
|
Log('LoadOptions(): ExpandTools='+BoolToStr(ExpandTools));
|
|||
|
Log('LoadOptions(): DrawOutlines='+BoolToStr(DrawOutlines));
|
|||
|
Log('LoadOptions(): ScreenSnap='+BoolToStr(ScreenSnap));
|
|||
|
Log('LoadOptions(): OnTop='+BoolToStr(OnTop));
|
|||
|
Log('LoadOptions(): ShowPkgDesc='+BoolToStr(ShowPkgDesc));
|
|||
|
Log('LoadOptions(): SrchVisible='+BoolToStr(SrchVisible));
|
|||
|
Log('LoadOptions(): ScrollLog='+BoolToStr(ScrollLog));
|
|||
|
Log('LoadOptions(): LastSoftPkg='+LastSoftPkg);
|
|||
|
Log('LoadOptions(): ScrollLog='+LastToolPkg);
|
|||
|
end;
|
|||
|
end; // with Options
|
|||
|
Result := true;
|
|||
|
except // SysErrorMessage(GetLastError)
|
|||
|
On E: Exception Do Begin
|
|||
|
Raise Exception.Create('Не удалось прочитать настройки из файла abtool.ini.' + #13#10 +
|
|||
|
'Сейчас он будет создан с параметрами по умолчанию.' + #13#10 +
|
|||
|
'Сообщение системы: ' + #13#10 + E.Message + '(' + IntToStr(GetLastError) + ') ');
|
|||
|
Log('Не удалось прочитать настройки из файла abtool.ini.' + #13#10 +
|
|||
|
'Сейчас он будет создан с параметрами по умолчанию.' + #13#10 +
|
|||
|
'Сообщение системы: ' + #13#10 + E.Message + '(' + IntToStr(GetLastError) + ') ');
|
|||
|
if Options.Debug then
|
|||
|
Log('LoadOptions() EXCEPTION Stack Trace:' + #13#10 + E.StackTrace);
|
|||
|
SaveOptions(true);
|
|||
|
End; // On E: Exception
|
|||
|
end; // except
|
|||
|
finally
|
|||
|
// if Options.ABToolIniFile <> nil then
|
|||
|
// Options.Free;
|
|||
|
end; // finally
|
|||
|
end; // if not FileExists
|
|||
|
end;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
end.
|