Каждый раз, начиная какой-либо проект, всплывает один и тот-же, на мой взгляд, довольно надоедливый вопрос - "Модуль настроек".
Казалось бы, полезная и нужная вещь, без которой у уважающих себя разработчиков не обходится ни один проект. За исключением, может быть, самых гениальных :).
Каждый привык по своему уменьшать "неприятность" этого процесса. Кто-то ограничевается малым количеством настроек. Кто-то переносит свои наработки из проекта в проект, целым модулем включаю форму и контролы, чем я и сам довольно долго занимался. Кто-то всякий раз делает все с нуля, как правило натыкаясь на одни и теже грабли.
Каждый метод "хорош" по своему, каждый из них, по своему, наровит попортить нервишки. Предлагаю Вам свое решение этого вопроса, которое должно значительно сократить, наши с Вами, затраты времени.
Описание компонента
Компонент содержит минимальный, джентельменский, набор для удобной работы со свойствами. После установки он по умолчанию располагается в панели "BuBa Group" (это не случайно, но об этом в другом топике).
Компонент позволяет хранить все настройки, на выбор - в реестре или .ini-файле. Все данные об опциях, хранятся в свойстве Items. Для редактирования этих данных, к компоненту привязан собственный редактор свойств, представляющий из себя окно с двумя колонками: "Список опций" и "Параметры выбранной опции".
Добавление и удаление опций, осуществляется посредством контекстного меню левой колонки. В параметрах, для каждой опции задается - "Идентификатор", "Секция", "Значение по умолчанию". Ограничений, на эти значения, ни каких не накладывается. Однако необходимо помнить что все значения, этих опций, хранятся в компоненте, как и в .ini-файле, в текстовом виде. А значит Вам прийдется позаботиться о приведении типов самостоятельно. Но это, на мой взягляд, как раз наименьшее из зол, и было сделано мною намерено, в пользу максимального упрощения пользования.
Для работы с опциями как со списком используется свойство Items (класс TOptionList). Для обращения к опциям можно пользоваться как индексом:
Options1.Items[0].Value := 'Значение'; Options1.Items[0].Save;
Так и используя поиск по идентификатору и секцие:
with Options1.Items.Find('Параметр 1', 'Основная секция') do
begin
Ident := 'Первый параметр';
Section := 'Главная секция';
Value := 'Истина где-то рядом';
end;
Для загрузки и сохранения опций, в компоненте предусмотрено две основные возможности:
- Загрузка/Сохранение всех опций, методами компонента LoadAllOptions и SaveAllOptions.
- Загрузка/Сохранение каждой опции по отдельности через методы опций Load и Save.
Также с помощью свойства AutoSave, включается режим автоматического сохранения каждой опции, при любом изменении ее значения. Это свойство влияет лишь на поведение при изменении значения опции, если были изменены секция, идентификатор или значение по умолчанию, необходимо сохранять с помощью описаных выше методов.
Для установки реакции, на изменение каждой из опций, используется событие компонента OnOptionChange, который содержит объект CurrentOption: TOption, явлюящийся опцией вызвавшей событие.
Пример обработчика события:
procedure TForm1.Options1OptionChange(Sender: TObject; CurrentOption: TOption);
begin
if CurrentOption.Ident = 'Поверх всех окон' then
begin
CheckBox1.Checked := StrToBool(CurrentOption.Value);
if CheckBox1.Checked then
FormStyle := fsStayOnTop
else
FormStyle := fsNormal;
end;
if CurrentOption.Ident = 'Приветствие' then
LabeledEdit1.Text := CurrentOption.Value;
if CurrentOption.Ident = 'Прозрачность формы' then
begin
AlphaBlend := CurrentOption.Value <> '0';
TrackBar1.Position := StrToInt(CurrentOption.Value);
AlphaBlendValue := 255 - TrackBar1.Position;
end;
if CurrentOption.Ident = 'Время запуска' then
LabeledEdit2.Text := CurrentOption.Value;
if CurrentOption.Ident = 'Цвет формы' then
begin
ColorBox1.Selected := StringToColor(CurrentOption.Value);
Color := ColorBox1.Selected;
end;
end;
Событие вызывается только при измененившемся значении опции, что защищает программу от возможной рекурсии. После добавления опции в список и описании в событии OnOptionChange, его можно легко использовать в любом месте программы. Пример:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
Options1.Items.Find('Поверх всех окон', 'Внешний вид').Value := BoolToStr(CheckBox1.Checked);
end;
procedure TForm1.ColorBox1Change(Sender: TObject);
begin
Options1.Items.Find('Цвет формы', 'Внешний вид').Value := ColorToString(ColorBox1.Selected);
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Options1.Items.Find('Прозрачность формы', 'Внешний вид').Value := IntToStr(TrackBar1.Position);
end;
procedure TForm1.LabeledEdit1Change(Sender: TObject);
begin
Options1.Items.Find('Приветствие', 'Запуск').Value := LabeledEdit1.Text;
end;
Компонент не очищает реестр и .ini-файлы, от неиспользуемых больше опций! Функцию очистки, я сделаю чуть позже, при этом реализация методов компонента изменятся не будет, так-что Вам не прийдется перенастраивать компонент. Все используемые ветки в реестре и .ini-файлы, при необходимости, создаются автоматически! Так-же, при добавлении компонента в проект, автоматически задается, наиболее вероятное значение, свойств отвечающих за место расположения .ini-файла и ветки реестра.
Установка и тестирование компонента
Для работы компоненту требуется установить следующие файлы из архива:
- Options.dcu
- Options.pas
- PropertyEditor.dcu
- PropertyEditor.dfm
- PropertyEditor.pas
Это можно сделать пакетом TOptions_pack.dpk который тоже находится в архиве. После этого, как уже говорилось выше, компонент можно найти на панэли "BuBa Group" вашего Delphi. Так-же в архиве находится папка Test, с маленьким проектом, демонстрирующим использование компонента.
Компонент был протестирован, и является полностью рабочим, при желании можете свободно использовать его в своих программах. В дальнейшем, сам компонент менятся не будет (только в случае ошибок и упоминаемого выше момента), но на его базе, будет создаваться новый компонент с более широкими возможностями. Пишите свои предложения и пожелания по новому компоненту. Сообщите если будут обнаружены ошибки в работе этого компонента. Буду рад справедливой критике и Вашему мнению по данному вопросу :)
TOptionPropertyEditor v.1.3. Версия от 17.10.2009. Рекомендуемая версия!
- Добавлен новый тип опции "ShortCut", позволяющий работать с быстрыми клавишами. Для него добавлено свое удобное поле ввода.
- Добавлена возможность изменения порядка опций в списке. Теперь их можно перемещать с помощью мыши и распологая так как вам удобно.
- Изменен принцип работы метода Value. Теперь с ним можно работать без каких либо преобразований. Значение опции будет представлено в виде типа указанного в ее настройках. Что значительно упрощает работу с компонентом.
- Изменена реализация метода Find. Теперь не обязательно указывать секцию опции, достаточно указать только идентификатор.
- Исправлена ошибка в событии OnLoaded, который теперь корректно вызывается после того как отработает метод LoadAllOptions
- Исправлена еще одна ошибка в свойстве FileName, которая при изменении каталога проекта могла "превратится" в нагромождение путей.
- Исправлена опция Автоприменение. При включении и выключении этой опции возникала ошибка, в случае если не выделена ни одна опция.
- Исправлена ошибка не позволяющая задавать текстовые имена секциям.
- Исправлена ошибка с полем ввода для типа Float, не позволяющая сохранять дробные значения
Пример работы с новыми свойствами:
//получаем значения опций внутри обработчика событий:
CheckBox1.Checked := CurrentOption.Value;
TrackBar1.Position := CurrentOption.Value;
LabeledEdit2.Text := CurrentOption.Value;
ColorBox1.Selected := CurrentOption.Value;
//задаем значения опциям в программе через поиск по идентификатору:
Options1.Items.Find('Приветствие').Value := LabeledEdit1.Text;
Options1.Items.Find('Прозрачность формы').Value := TrackBar1.Position;
Options1.Items.Find('Цвет формы').Value := ColorBox1.Selected;
Options1.Items.Find('Поверх всех окон').Value := CheckBox1.Checked;
Options1.Items.Find('Время запуска').Value := Date + Time;
История версий и изменений
Версия 1.1 от 10.10.2009:
- Значительные изменения были внесены не только в редактор свойств, но и в сам компонент. В связи с этим, добавлен учет версий компонента, сейчас и в дальнейшем Вы можете спокойно устанавливать новые версии компонента, не боясь потерять список опций и настройки компонента.
- Добавлен параметр "Тип опции", для удобного ввода значений. Для каждого из 6-и предлагаемых типов (string, Integer, Boolean, Float, TDateTime, TColor), предусмотрено свое удобное поле ввода.
- Добавлен переключатель "Автоприменение". При включеном состоянии все изменения автоматически сохраняются. При выключенном для сохранения необходимо нажать кнопку "Применить", или [Enter].
- Добавлена возможность отменить изменения. Работает независимо от состояния режима "Автоприменения".
- Добавлено два новых события OnLoaded и OnOptionLoad, событие OnOptionChange больше не вызывается при загрузке опций.
- Добавлен метод ValueChosenType, который позволяет работать с любой опцией без преобразования данных, указав ее тип.
- Добавлен метод ValueAnyType, который позволяет работать с любой опцией без преобразования данных, без необходимости указывать тип. Это свойство нужно использовать только при работе с простыми типами: string, integer, boolean, float. При работе с классами (TDateTime и TColor) необходимо использовать метод ValueChosenType, для избежания ошибок.
Пример работы с новыми свойствами:
//получаем значения опций внутри обработчика событий:
CheckBox1.Checked := CurrentOption.ValueAnyType;
TrackBar1.Position := CurrentOption.ValueAnyType;
LabeledEdit2.Text := CurrentOption.Value;
ColorBox1.Selected := CurrentOption.ValueChosenType[otColor];
//задаем значения опциям в программе через поиск по идентификатору:
Options1.Items.Find('Приветствие', 'Запуск').Value := LabeledEdit1.Text;
Options1.Items.Find('Прозрачность формы', 'Внешний вид').ValueAnyType := TrackBar1.Position;
Options1.Items.Find('Цвет формы', 'Внешний вид').ValueChosenType[otColor] := ColorBox1.Selected;
Options1.Items.Find('Поверх всех окон', 'Внешний вид').ValueAnyType := CheckBox1.Checked;
Options1.Items.Find('Время запуска', 'Запуск').ValueChosenType[otDateTime] := Date + Time;
Версия 0.2 от 5.10.2009:
- Исправлено свойство FileName. Можно было ввести имя файла без каталога, в результате чего настройки сохранялись "неизвестно где".
- Изменена реакция на двойной клик по компоненту, теперь dbl-click вызывает редактор свойства Items. Раньше создавался обработчик события OnOptionChange.
- Добавлена реакция на двойной щелчек, по списку опций, в редакторе свойства Items. При щелчке по "пустому месту" добавляется новая опция. При щелчке по существующей опцие вызывается контекстное меню.
Установка.Внимание! При установке желательно что-бы в Delphi не было открытых форм с компонентом. Удалите старую версию компонента, с помощью контекстного меню пакета предыдущей версии. Установите новую версию компонента. Переустановка является абсолютно безболезненной и не повлияет на свойства и методы, определенные у компонентов используемых в Ваших проектах.
TOptions v.1.6. Новая версия компонента для комфортной работы с опциями в Delphi
Мой блог находят по следующим фразам
- c++ builder 2009 update 1
- работа с процессами в delphi
- программа мотиватор
- скачать delphi for ubuntu
- пробег мыши по экрану
- delphi get и post
- Delphi в Internet
Хотите найти арендаторов спецтехники или подать объявление с предложением о продаже или покупке спецтехники? Вся спецтехника на TruckList.ru! Покупка, продажа любой спецтехники.
-------------------------
| Делись! | Загружай! | Плюсуй! |
| | |











05 Окт 2009 в 5:09 пп
Чё-то я сразу даже как-то не допёр, что в редакторе надо пользоваться контекстным меню, чтоб добавить/удалить опцию :) Может сделать добавление до двойному клику?
05 Окт 2009 в 6:05 пп
Будет исполнено. Сделаю возможность добавления даблкликом на пустом месте в списке.
Да и сам редактор привяжу к двойному щелчку по компоненту. Так пожалуй будет удобнее.
05 Окт 2009 в 8:14 пп
Выложено обновление компонента!
14 Дек 2009 в 12:17 пп
Компонент у становился нормально, но при попытке вызвать окно добавления настроек появляется ошибка:
Error reading ColorBox1.Style: Unvalid property value14 Дек 2009 в 4:04 пп
К сожалению разработчик компонента не я, поэтому особо помочь нечем. Но, судя по сообщению, у Вас более старая версия Delphi. Последняя версия Компонента разрабатывалась под Delphi 2010
27 Дек 2009 в 7:50 пп
Не скачивается компонент! Пишет что его нету.
За статьи спасибо!
27 Дек 2009 в 7:51 пп
теперь все нормально О.о
27 Дек 2009 в 8:15 пп
Сранно-странно. Я ничего даже не делал :)
03 Янв 2010 в 1:59 пп
Я так точно не понял как именно загружать опции из файла… Делаю это через… ну не так как надо.
Еще проблема в том что у меня есть комбо бокс, опция настроена что бы при выборе итима из него, все сохранялось… оно сохраняется но при загрузки опять стандартным становится, при этом в ини ничего не меняется (но когда меняю итимы все работает)
тоисть проблема ппри загрузке…
напишите пример загрузки )
03 Янв 2010 в 2:52 пп
Жаль, конечно, что не я разрабатывал компонент…сейчас в Linux больше работаю. В ближайшее время постараюсь найти пример работы с этим компонентом, по-моему где-то был
10 Янв 2010 в 8:35 пп
Компонент устанавливается нормально.
У кого не запустился, советую закинуть файл из архива компонента «Options.dcu» в папку со своим проектом.
Компонент хороший, спасибо.
04 Апр 2010 в 5:01 пп
Давно мечтал о таком компоненте, обрадовался… Увы! Сохранение опций в ini файле или реестре подходит только для простых локальных приложений. В многопользовательских СУБД параметры приложения устанавливаются администратором централизованно и хранить их нужно в БД. Не планируется реализовать такую возможность?
04 Апр 2010 в 5:06 пп
Вообще, Виталий, на сколько я помню, Серёга писал этот компонент именно для локального приложения. К сожалению автор сего компонента бесследно пропал поэтому ничего про новые версии сказать не могу.
22 Авг 2010 в 11:56 пп
А вот и не бесследно :)
Виталий, если вопрос конечно еще актуален, могу и для БД адаптировать.
Но так как я в делфи с БД особо дел не имел, с Вас пару строк о необходимых контролах, и приемах работы с ними. (пару — тройку, не больше(:).
Времени у меня правда как всегда не особо много, но на развитие TOptions-а найду.