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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение конфигурации, Как сохранить конфигурацию? 
:(
    Опции темы
Марат
Дата 7.5.2005, 22:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Кто подскажет, как можно восстановить положение и состояние объектов при повторном запуске программы?
  Вверх
z-END
Дата 7.5.2005, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


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

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



Вобще существуют специализированные компоненты, которые сохраняют состояние формы в реестр, в JEDI помоему есть, но я честно говоря никогда ими не пользовался, если надо было вручную в реестр (или Ини-файл) записывал


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Poseidon
Дата 9.5.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Вот, держи универсальный алгоритм сохранения настроек:
Код
uses Registry;
...

function SaveSettings(Form: TForm): boolean;
var
settings: TMemoryStream;
R: TRegistry;
j: byte;
S: PChar;
b: boolean;
l: word;
begin
settings := TMemoryStream.Create;

with Form do
  begin
  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;
  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;



function LoadSettings(Form: TForm):boolean;
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);

  With Form do
    begin
    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;
    end;
  settings.Free;
  end;
R.Free;
end;


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

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

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

PS. В параметр Form передается имя формы на каторой "лежат" компопенты, параметры каторых мы хотим сохранить. Вызываются функции:
Код
SaveSettings(Form1)
и
Код
LoadSettings(Form1)



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


Unregistered











Цитата(Poseidon @ 9.5.2005, 15:10)
Вот, держи универсальный алгоритм сохранения настроек:

Огромное спасибо, попробуем применить на практике.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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