Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Способы сохранения настроек. 
:(
    Опции темы
Ak47t
  Дата 21.8.2005, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



Подскажите как лучше сохранять настройки программы(тоесть расположение форм обьектов на на форме).
Хочю узнать как легче всего это сделать. (У меня много объектов). smile
PM MAIL ICQ   Вверх
Quadr0
Дата 21.8.2005, 11:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 01:13
  Вверх
Poseidon
Дата 21.8.2005, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Не помню уже где нарыл, поэтому вылаживаю без ссылки. Думаю автор не обидется.



Универсальный алгоритм сохранения настроек
Во время своего опыта в роли программиста частенько приходилось создавать программы, где имелось большое количество различных параметров, опций и настроек... Думаю я не один, кто сталкивался с этим. Так вот сохранение всех этих настроек и последующее их считывание, например с реестра или .ini файла всегда было ужасом. Вот недавно опять натолкнулся на эту проблему... Но в этот раз было так скучно и лениво было писать что-то вроде:

Код

R := TRegIniFile.Create;
R.RootKey := HKEY_CURRENT_USER;
R.OpenKey('Software\XXX', True);
R.WriteInteger(Section, 'Left', Left);
R.WriteInteger(Section, 'Top', Top);
R.WriteBool(Section, 'StayOnTop', chStay.Checked);
R.WriteInteger(Section, 'Refresh', Track.Position);
R.WriteInteger(Section, 'Alpha', TrackBarAlpha.Position);
R.WriteBool(Section, 'Snap', chScreenSnap.Checked);
R.WriteBool(Section, 'Baloon', chBaloonHint.Checked);
R.WriteBool(Section, 'vis', boolean(tag));
R.WriteString(Section, 'File', FileName.Hint);
R.WriteInteger(Section, 'Old', Old);
R.WriteInteger(Section, 'First', First);
R.CloseKey;
R.Free

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

Procedure TfrmSettings.SaveSettings;
var settings: TMemoryStream;
R: TRegistry;
j: byte;
S: PChar;
b: boolean;
l: word;
begin
settings := TMemoryStream.Create;

for j := 0 to ControlCount - 1 do
if Controls[j] is TCheckBox then begin
b := TCheckBox(Controls[j]).Checked;
settings.WriteBuffer(b, 1);
end else
if Controls[j] is TEdit then begin
S := PChar(TEdit(Controls[j]).Text);
l := length(S);
settings.WriteBuffer(l, 2);
if l > 0 then settings.WriteBuffer(S^, l);
end;

R := TRegistry.Create;
R.RootKey := HKEY_CURRENT_USER;
R.OpenKey(‘Software\XXX’, true);
settings.Seek(0, soFromBeginning);
R.WriteBinaryData(‘settings’, settings.Memory^, settings.Size);
R.Free;

settings.free;
end;

первое, что делает процедура, это создает поток данных в памяти, он как раз и будет тем буфером, в котором и будут храниться все настройки. Далее процедура начинает перебор всех компонентов на форме. Если очередной компонент является TCheckBox или TEdit, то в буфер записываются их основные свойства, т.е. Checked и Text соответственно. Далее мы записываем буфер как двоичные данные в реестр.
Процедура загрузки будет выглядеть следующим образом:

Код

procedure TfrmSettings.LoadSettings;
var settings: TMemoryStream;
R: TRegistry;
buf: PChar;
size: integer;
j: byte;
b: boolean;
l: word;
begin
R := TRegistry.Create;
R.RootKey := HKEY_CURRENT_USER;
R.OpenKey(‘Software\XXX’, true);

if R.ValueExists(‘settings’) then begin
size := R.GetDataSize(‘settings’);
buf := GetMemory(size);
R.ReadBinaryData(‘settings’, buf^, size);

settings := TMemoryStream.Create;
settings.Write(buf^, size);
FreeMemory(buf);
settings.Seek(0, soFromBeginning);
for j := 0 to ControlCount - 1 do
if Controls[j] is TCheckBox then begin
settings.ReadBuffer(b, 1);
TCheckBox(Controls[j]).Checked := b
end else
if Controls[j] is TEdit then begin
settings.ReadBuffer(l, 2);
if l > 0 then begin
buf := GetMemory(l);
settings.ReadBuffer(buf^, l);
TEdit(Controls[j]).Text := copy(buf, 1, l);
FreeMemory(buf)
end;
end;

settings.Free;
end;
R.Free;

end;

Т.е. сначала получаем размер записанных настроек, выделяем под них память, считываем, переносим для удобства в TMemoryStream и считываем. Порядок не нарушается, т.к. пробег по контролам всегда идет по строго определенной последовательности указанной TabOrder. Все! Теперь можно добавлять новые настройки, удалять старые и не изменять код. В данном случае код упрошен, необходимо предусмотреть также обход контролов на панелях (TPanel), группах (TGroupBox) и т.п.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
FRAGNATIC
Дата 21.8.2005, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



Poseidon
нарыл у менея )
автор и полноя статья http://ddsoft.hoha.ru/notes/savesets/
PM MAIL   Вверх
Ak47t
  Дата 21.8.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



smile Спасиб. Хороший кусок кода.
Тема закрыта. smile
PM MAIL ICQ   Вверх
FRAGNATIC
Дата 21.8.2005, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



Ak47t
если возьникнут вопросы по обходу (TPanel), группах (TGroupBox) и т.п.
то оброщайся)
PM MAIL   Вверх
Akella
Дата 22.8.2005, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Нет, не закрыта.
Попробуй использовать компоненты от EhLib - проще некуда! smile
PM MAIL   Вверх
mvdr
Дата 22.8.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


физик
***


Профиль
Группа: Участник
Сообщений: 1349
Регистрация: 31.12.2004
Где: Волгоград, Россия

Репутация: 1
Всего: 42



а как вариант с доп. текстовым файлом?
Т.е. на OnClose в Memo заносится инфа о состоянии формы, объектов и пр, записывается в файл. Потом на OnCreate считываем из файла и присваиваем значения компанентам


--------------------
Появляюсь редко, но часто метко

Изображать идиота сложнее, чем изображать умного: полезнее и не каждому дано
PM ICQ   Вверх
Marriage
Дата 22.8.2005, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Цитата(Femida @ 22.8.2005, 19:21)
а как вариант с доп. текстовым файлом?

По-моему не очень. Проще всего или с INI или с Реестром.



--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.