Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  18:13[Войти] | [Зарегистрироваться]
Ответ на вопрос № 48961

02-02-2007 04:34
Здравствуйте! Хочу узнать о том как реализовать работу с настройками программы. Вот как сделано у меня:
настройки хранятся в реестре.
  TOptions = class (TObject)
    Path: String;
    Name: String;
    procedure Load; virtual; abstract;
    procedure Save; virtual; abstract;
  end;

  TGridOptions = class (TOptions)
    procedure Load; override;
    procedure Save; override;
  end;

  TOptionsList = array of TOptions;

var
  OptionsList: TOptionsList;

Опции у меня пока только у грида - настройка видимости полей в БД. Гридов несколько, все на нескольких формах. Хотелось бы абстрагироваться от названий форм,гридов и реализовать работу с ними в общем.То есть надо хранить в реестре назв. формы,грида(их может быть несколько) и в хотя бы список колонок с признаками видимости/невидимости(а лучше настраиваемый список свойств, которые могут храниться в реестре). Как примерно это можно сделать и можно ли? И попутно возникает ещё одна проблема, как хранить информацию о компоненте в реестре. Преобразовывать с помощью потоков в строку - слишком много информации, не все же свойства хранить надо

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

10-08-2008 10:45 | Комментарий к предыдущим ответам
>>>В событии OnShow переводим ValueListEditor в режим редактирования
Не понял, как переводим? Тоже SetFocus-ом? Вроде бы всё надо было перенести в OnPaint из OnShow. Или нет?
>>>в событии OnPaint пробегаем SetFocus-ом по всем ValueListEditor
сделал
>>>После этого подгружаем из файла настройки.
и тут, если в "файле настройки" записан и InplaceEditList, выскакивает исключение. Пробовал во всех последовательностях, не получилось.

Бросьте плз кусочек кода как Вы сохраняете/восстанавливаете, может я чё не так делаю.

10-08-2008 05:53 | Комментарий к предыдущим ответам
InplaceEditList - объект который создается при первом редактировании ValueListEditor-а как описано в вопросе »вопрос КС №64375«. Ошибка при загрузке возникает потому что нет этого самого объекта InplaceEditList. В событии OnShow переводим ValueListEditor в режим редактирования (по умолчанию он в этом режиме), в событии OnPaint пробегаем SetFocus-ом по всем ValueListEditor тем самым создав все InplaceEditList-ы (моё упущение что я в предыдущем посте забыл обратить внимание на то что надо пробегать фокусом по всем ValueListEditor). После этого подгружаем из файла настройки.
У меня такая комбинация работает без ошибок.

10-08-2008 04:04 | Комментарий к предыдущим ответам
По смыслу я пытался загружать форму один раз в onCreate, и сохранять в onDestroy, не используя никаких переменных.

>>>помогло следующее шаманство
Не помогает. Попробовал Ваш вариант, хотя не понял в какой момент Вы сохраняете форму в файл. Чтение формы в onPaint выдает какую же ошибку.

Сохраненная после редактирования грида форма читается с ошибкой т.к. содержит "лишний" обьект. Как этому может помочь перенос чтения в onPaint или куда-то ещё, а главное зачем, я не понял. ИМХО прочитать форму надо при создании, зачем её перечитывать при каждом показе?

09-08-2008 09:20
действительно, проверил, это так.
помогло следующее шаманство:
перенес из обработчика OnShow в обработчик OnPait и завел отдельную переменную о том была ли загрузка или нет. Т.е. чтобы не на каждый OnPaint грузить форму.

09-08-2008 02:31 | Комментарий к предыдущим ответам
2 Shoor

Пример очень интересный, но если на форму кинуть ValueListEditor то работать он не будет. Вернее будет, если значения в гриде не менять, а если поменять - то не сможет правильно прочитать записанное в файл 'options.set'. Подробнее в »вопрос КС №64375«.

Не могли бы Вы подсказать как решить/обойти эту проблему не убирая ValueListEditor с сохраняемой формы.

03-02-2007 04:58
Я последнее время часто использую один интересный метод. Создаю форму с опциями. Все опции при использовании в программе беруться прямо с этой формы. Настраиваю форму, как она должна быть по умолчанию. Потом в обработчик onShow формы вставляю такой кусок кода:

CONST FN='options.set';
var i:integer;
begin
  if FileExists(FN) then
    begin
      datafile:=TFileStream.Create(dir+'\'+FN,fmOpenReadWrite);
      for i:=0 to self.ComponentCount-1 do
        begin
          datafile.ReadComponent(self.Components[i]);
          if datafile.position=datafile.size then exit; //эта строка
                    //добавлена для того, чтобы если вы что то
                    //добавили на форму - код не выдал ошибку при
                    //первой загрузке файла
        end;
    end
  else
    datafile:=TFileStream.Create(FN,fmCreate);
end;



здесь datafile как поле формы.
и на закрытие такой кусок кода:

var i:integer;
begin
  datafile.Position:=0;
  datafile.Size:=0;
  for i:=0 to self.ComponentCount-1 do
    datafile.WriteComponent(self.Components[i]);
  datafile.Free;
end;



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

02-02-2007 05:59
При написании программ я разделяю настройки на три группы:
1. Локальные настройки. Например, ширина столбцов грида - так как в первую очередь ширина столбцов зависит от разрешения монитора локального компьютера. Например, параметры коннекта к БД. Все это можно хранить в ini-файле, либо в реестре.
2. Общие настройки. Например, какие-либо глобальные параметры приложения. Можно хранить только в базе данных в отдельной таблице.
3. Личные настройки пользователя. Например, параметры формирования отчетов, параметры сортировки данных и т.п. Их можно хранить в БД в учетных записях пользователей.

02-02-2007 05:18
Да вроде только что волдан статью на эту тему делал. Смотрите http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1298

02-02-2007 04:54
Во-первых TOptions должен быть наследником TComponent. Во-вторых см. »вопрос КС №48140«
Т.е. создаете свойство TGridOptions property Grid: TCustomGrid и работаете с ним.
Основная задача — это необходимость при разрушении Grid, обнулять соответствующее свойство.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Какой месяц идет после марта?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования