Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Свежие комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал SeregaAltmer 5 октября 2009 в 04:32.
Категории: Компоненты Delphi.


TOptions Каждый раз, начиная какой-либо проект, всплывает один и тот-же, на мой взгляд, довольно надоедливый вопрос - "Модуль настроек".

Казалось бы, полезная и нужная вещь, без которой у уважающих себя разработчиков не обходится ни один проект. За исключением, может быть, самых гениальных :).

Каждый привык по своему уменьшать "неприятность" этого процесса. Кто-то ограничевается малым количеством настроек. Кто-то переносит свои наработки из проекта в проект, целым модулем включаю форму и контролы, чем я и сам довольно долго занимался. Кто-то всякий раз делает все с нуля, как правило натыкаясь на одни и теже грабли.

Каждый метод "хорош" по своему, каждый из них, по своему, наровит попортить нервишки. Предлагаю Вам свое решение этого вопроса, которое должно значительно сократить, наши с Вами, затраты времени.

Описание компонента

Компонент содержит минимальный, джентельменский, набор для удобной работы со свойствами. После установки он по умолчанию располагается в панели "BuBa Group" (это не случайно, но об этом в другом топике).

Компонент позволяет хранить все настройки, на выбор - в реестре или .ini-файле. Все данные об опциях, хранятся в свойстве Items. Для редактирования этих данных, к компоненту привязан собственный редактор свойств, представляющий из себя окно с двумя колонками: "Список опций" и "Параметры выбранной опции".

Добавление и удаление опций, осуществляется посредством контекстного меню левой колонки. В параметрах, для каждой опции задается - "Идентификатор", "Секция", "Значение по умолчанию". Ограничений, на эти значения, ни каких не накладывается. Однако необходимо помнить что все значения, этих опций, хранятся в компоненте, как и в .ini-файле, в текстовом виде. А значит Вам прийдется позаботиться о приведении типов самостоятельно. Но это, на мой взягляд, как раз наименьшее из зол, и было сделано мною намерено, в пользу максимального упрощения пользования.TOptionsPropertyEditor

Для работы с опциями как со списком используется свойство Items (класс TOptionList). Для обращения к опциям можно пользоваться как индексом:

Options1.Items[0].Value := 'Значение';
Options1.Items[0].Save;

Так и используя поиск по идентификатору и секцие:

with Options1.Items.Find('Параметр 1', 'Основная секция') do
begin
  Ident := 'Первый параметр';
  Section := 'Главная секция';
  Value := 'Истина где-то рядом';
end;

TOptions_ObjectInspectorДля загрузки и сохранения опций, в компоненте предусмотрено две основные возможности:

  1. Загрузка/Сохранение всех опций, методами компонента LoadAllOptions и SaveAllOptions.
  2. Загрузка/Сохранение каждой опции по отдельности через методы опций 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. Рекомендуемая версия!

TOptionPropertyEditor v.1.3
Изменения:

  1. Добавлен новый тип опции "ShortCut", позволяющий работать с быстрыми клавишами. Для него добавлено свое удобное поле ввода.
  2. Добавлена возможность изменения порядка опций в списке. Теперь их можно перемещать с помощью мыши и распологая так как вам удобно.
  3. Изменен принцип работы метода Value. Теперь с ним можно работать без каких либо преобразований. Значение опции будет представлено в виде типа указанного в ее настройках. Что значительно упрощает работу с компонентом.
  4. Изменена реализация метода Find. Теперь не обязательно указывать секцию опции, достаточно указать только идентификатор.
  5. Исправлена ошибка в событии OnLoaded, который теперь корректно вызывается после того как отработает метод LoadAllOptions
  6. Исправлена еще одна ошибка в свойстве FileName, которая при изменении каталога проекта могла "превратится" в нагромождение путей.
  7. Исправлена опция Автоприменение. При включении и выключении этой опции возникала ошибка, в случае если не выделена ни одна опция.
  8. Исправлена ошибка не позволяющая задавать текстовые имена секциям.
  9. Исправлена ошибка с полем ввода для типа 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:

TOptionPropertyEditor v.1.1

  1. Значительные изменения были внесены не только в редактор свойств, но и в сам компонент. В связи с этим, добавлен учет версий компонента, сейчас и в дальнейшем Вы можете спокойно устанавливать новые версии компонента, не боясь потерять список опций и настройки компонента.
  2. Добавлен параметр "Тип опции", для удобного ввода значений. Для каждого из 6-и предлагаемых типов (string, Integer, Boolean, Float, TDateTime, TColor), предусмотрено свое удобное поле ввода.
  3. Добавлен переключатель "Автоприменение". При включеном состоянии все изменения автоматически сохраняются. При выключенном для сохранения необходимо нажать кнопку "Применить", или [Enter].
  4. Добавлена возможность отменить изменения. Работает независимо от состояния режима "Автоприменения".
  5. Добавлено два новых события OnLoaded и OnOptionLoad, событие OnOptionChange больше не вызывается при загрузке опций.
  6. Добавлен метод ValueChosenType, который позволяет работать с любой опцией без преобразования данных, указав ее тип.
  7. Добавлен метод 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:

  1. Исправлено свойство FileName. Можно было ввести имя файла без каталога, в результате чего настройки сохранялись "неизвестно где".
  2. Изменена реакция на двойной клик по компоненту, теперь dbl-click вызывает редактор свойства Items. Раньше создавался обработчик события OnOptionChange.
  3. Добавлена реакция на двойной щелчек, по списку опций, в редакторе свойства Items. При щелчке по "пустому месту" добавляется новая опция. При щелчке по существующей опцие вызывается контекстное меню.

Установка.Внимание! При установке желательно что-бы в Delphi не было открытых форм с компонентом. Удалите старую версию компонента, с помощью контекстного меню пакета предыдущей версии. Установите новую версию компонента. Переустановка является абсолютно безболезненной и не повлияет на свойства и методы, определенные у компонентов используемых в Ваших проектах.

TOptions v.1.6. Новая версия компонента для комфортной работы с опциями в Delphi

Мой блог находят по следующим фразам

-------------------------
Хотите найти арендаторов спецтехники или подать объявление с предложением о продаже или покупке спецтехники? Вся спецтехника на TruckList.ru! Покупка, продажа любой спецтехники.
-------------------------
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (14)

WP_Cloudy
  • Vlad пишет:

    Чё-то я сразу даже как-то не допёр, что в редакторе надо пользоваться контекстным меню, чтоб добавить/удалить опцию :) Может сделать добавление до двойному клику?

  • SeregaAltmer пишет:

    Будет исполнено. Сделаю возможность добавления даблкликом на пустом месте в списке.
    Да и сам редактор привяжу к двойному щелчку по компоненту. Так пожалуй будет удобнее.

  • SeregaAltmer пишет:

    Выложено обновление компонента!

  • Alex пишет:

    Компонент у становился нормально, но при попытке вызвать окно добавления настроек появляется ошибка:

    Error reading ColorBox1.Style: Unvalid property value

     

  • Vlad пишет:

    К сожалению разработчик компонента не я, поэтому особо помочь нечем. Но, судя по сообщению, у Вас более старая версия Delphi. Последняя версия Компонента разрабатывалась под Delphi 2010

  • jpg пишет:

    Не скачивается компонент! Пишет что его нету.
     
    За статьи спасибо!

  • jpg пишет:

    теперь все нормально О.о

  • Vlad пишет:

    Сранно-странно. Я ничего даже не делал :)

  • mimi пишет:

    Я так точно не понял как именно загружать опции из файла… Делаю это через… ну не так как надо.
    Еще проблема в том что у меня есть комбо бокс, опция настроена что бы при выборе итима из него, все сохранялось… оно сохраняется но при загрузки опять стандартным становится, при этом в ини ничего не меняется (но когда меняю итимы все работает)
    тоисть проблема ппри загрузке…
    напишите пример загрузки )

  • Vlad пишет:

    Жаль, конечно, что не я разрабатывал компонент…сейчас в Linux больше работаю. В ближайшее время постараюсь найти пример работы с этим компонентом, по-моему где-то был

  • Николай пишет:

    Компонент устанавливается нормально.
    У кого не запустился, советую закинуть файл из архива компонента «Options.dcu» в папку со своим проектом.
    Компонент хороший, спасибо.

  • Виталий пишет:

    Давно мечтал о таком компоненте, обрадовался… Увы! Сохранение опций в ini файле или реестре подходит только для простых локальных приложений. В многопользовательских СУБД параметры приложения устанавливаются администратором централизованно и хранить их нужно в БД. Не планируется реализовать такую возможность?

  • Vlad пишет:

    Вообще, Виталий, на сколько я помню, Серёга писал этот компонент именно для локального приложения. К сожалению автор сего компонента бесследно пропал поэтому ничего про новые версии сказать не могу.

  • SeregaAltmer пишет:

    А вот и не бесследно :)

    Виталий, если вопрос конечно еще актуален, могу и для БД адаптировать.
    Но так как я в делфи с БД особо дел не имел, с Вас пару строк о необходимых контролах, и приемах работы с ними. (пару — тройку, не больше(:).

    Времени у меня правда как всегда не особо много, но на развитие TOptions-а найду.

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник