AnthonyAxenov
685274a356
Отображение формы настроек переделано. Теперь она создаётся только 1 раз при первом вызове. Добавлен выпадающий списк для выбора локализаций. Кнопка сброса к дефолту изменена. Чтение настроек из abtool.ini (кроме локализаций). Сброс контроллов к актуальным настройкам при каждом показе формы настроек. Считанные настройки хранятся в глобальной переменной внутри uOptions. Таким образом: - исключены циклические ссылки с участием dMain ради доступа к настройкам - теперь можно только вызвать конструктор TOptions, а сам созданный объект нигде не сохранять: объект GlobalOptions уже будет доступен Новая функция dMain.GetLocalesIniFileList для получения списка файлов локализаций. Обновлены ini-файлы. Мелочи по оформлению кода.
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.
|