НАСТРОЙКИ
Отображение формы настроек переделано. Теперь она создаётся только 1 раз при первом вызове. Добавлен выпадающий списк для выбора локализаций. Кнопка сброса к дефолту изменена. Чтение настроек из abtool.ini (кроме локализаций). Сброс контроллов к актуальным настройкам при каждом показе формы настроек. Считанные настройки хранятся в глобальной переменной внутри uOptions. Таким образом: - исключены циклические ссылки с участием dMain ради доступа к настройкам - теперь можно только вызвать конструктор TOptions, а сам созданный объект нигде не сохранять: объект GlobalOptions уже будет доступен Новая функция dMain.GetLocalesIniFileList для получения списка файлов локализаций. Обновлены ini-файлы. Мелочи по оформлению кода.
This commit is contained in:
373
uoptions.pas
Normal file
373
uoptions.pas
Normal file
@@ -0,0 +1,373 @@
|
||||
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.
|
||||
Reference in New Issue
Block a user