powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Что лучше Реестр или ini-файлы
12 сообщений из 12, страница 1 из 1
Что лучше Реестр или ini-файлы
    #32191762
AndreyS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть приложение на Delphi. В нем около 200 форм. Каждая форма сохраняет свои настройки в ini-файл. Соответсвенно приложение плодит во время работы где-то столько же файлов. Дисковые операции правда не очень нагружают, но все равно не дает спать мысль об оптимизации.
С давних лет помню, Microsoft с выходом Win32 (год где-то в 1995), окрестила технологию ini-файлов пережитком трипервой винды, и оставила ее всего лишь для сохранения совместимости, а системный реестр был рекомендован как продвинутая технология, с моторчиком БД.
Ну соответсвенно при написании нового приложения решил, переделать сохранение настроек - все в реестр. Решил почитать что пишут в прессе. Марко Кэнту в своем творении "Delphi 6 для профессионалов" пишет: "Идея централизованного места хранения конфигурациоонных параметров для всех приложений оказалась архитектурной ошибкой. Даже MS признает это, указывая в требованиях совместимости с Win 2000, рекомендует использовать старые добрые ini-файлы, а реестр не засорять конфигурационными параметрами программ".

Вопрос: Что же лучше 200 файлов на 200К, один файл на 200К, или 200К в реестре?
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32191797
Алексей_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не знаю кому как лучше (или как правильно).
Но я бы выбрал однозначно не 200 файлов, а один если так вопрос ставить.
В одном файле сделал бы разделы по именам форм, а внутри них параметры.
Что касается реестра, то его переносить с машины на машину менее удобно. Так же вероятность его порчи чуть выше вероятности порчи ini файла, меньше проблем при перестановке OS и др.
Как альтернативный вариант попробуй посмотреть в сторону dbf.
Мы у себя параметры для динамических форм в больших проектах держим в обычном dbf-е, вполне удобно.
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32191867
alexia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы одно время настройки пользователя держали даже на SQL-сервере. В результате получалось, что не было привязки к конкретной машине, т.е. юзер мог сесть за любую машину и работать со своими настройками...
Если выбирать между реестром или ini-файлом, то лучше один ini-файл с разделами, как говорит Алексей_S.
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32193909
Дмитрий Мыльников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше один ini файл с разделами. Ещё лучше, если он хранится в том же каталоге, где и .exe файл программы, а не в системном каталоге. В этом случае можно иметь несколько копий программы с разными натсройками в разных каталогах на одной машине.

В своё время я себе сделал вот такой класс

TFileCfg = class
protected
CfgFile:TIniFile;
function GetFileName:string; virtual;
public
FileName:string;
StartPath:string;
constructor Create(Path:string);
procedure LoadData;
procedure SaveData;
procedure LoadCfg; virtual; abstract;
procedure SaveCfg; virtual; abstract;
procedure LoadFromFile(const FileName:string);
procedure SaveToFile(const FileName:string);
end;

constructor TFileCfg.Create(Path:string);
begin
Inherited Create;
StartPath:=ExtractFilePath(Application.ExeName);
if StartPath='' then GetDir(0,StartPath);
if copy(StartPath,Length(StartPath),1)<>'\' then StartPath:=StartPath+'\';
if Path='' then Path:=StartPath;
if copy(Path,Length(Path),1)<>'\' then Path:=Path+'\';
FileName:=Path+GetFileName;
LoadData;
end;

function TFileCfg.GetFileName:string;
begin
Result:=ChangeFileExt(ExtractFileName(Application.ExeName),'.ini');
end;

procedure TFileCfg.LoadData;
begin
CfgFile:=TIniFile.Create(FileName);
try LoadCfg;
finally CfgFile.Free; end;
end;

procedure TFileCfg.SaveData;
begin
CfgFile:=TIniFile.Create(FileName);
try SaveCfg;
finally CfgFile.Free; end;
end;

procedure TFileCfg.LoadFromFile(const FileName:string);
begin
Self.FileName:=FileName;
LoadData;
end;

procedure TFileCfg.SaveToFile(const FileName:string);
begin
Self.FileName:=FileName;
SaveData;
end;

в программах потом создаётся класс-наследник, в котором прописываются необходимые поля-параметры и перекрываются две процедуры LoadCfg и SaveCfg

В обработчике события OnCreate главной формы создаёте экземпляр этого класса. Если передать в Create пустую строку Path, то, как видно из текста процедуры, он возмёт путь от Exe файла. Если не перекрывать функцию GetFileName, то имя ini файла будет точно такое же, как и у exe файла.

В программе, когда нужно сохранить параметры, просто вызываете SaveData (но не SaveCfg!!!).

Небольшой пример использования

TCourierConfig = class (TFileCfg)
public
ServerName:string;
BaseName:string;
UserName:string;
Password:string;
AutoLogin:boolean;
FullConnectString:boolean;
ConnectString:string;
PacketSize:integer;
DocStartDate:TDateTime;
CodePeriod:integer;
fFullScreen:boolean;


OrderTemp:string;
OtvodTemp:string;
PathListText:string;

procedure LoadCfg; override;
procedure SaveCfg; override;
end;

procedure TCourierConfig.LoadCfg;
begin
with CfgFile do begin
ServerName:=ReadString('Courier30','ServerName','localhost');
BaseName:=ReadString('Courier30','BaseName','Courier30');
UserName:=ReadString('Courier30','UserName','CoureirOper');
Password:=ReadString('Courier30','Password','courier');
AutoLogin:=ReadBool('Courier30','AutoLogin',false);
FullConnectString:=ReadBool('Courier30','FullConnectString',false);
ConnectString:=ReadString('Courier30','ConnectString',
'Provider=SQLOLEDB.1;Password=Courier;Persist Security Info=True;User ID=CourierOper;Initial Catalog=Courier30;Data Source=DIMKA;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=8192;Workstation ID=DIMKA');
PacketSize:=ReadInteger('Courier30','PacketSize',8192);
DocStartDate:=StrToDate(ReadString('Courier30','DocStartDate','1.01.2003'));
CodePeriod:=ReadInteger('Courier30','CodePeriod',prEtotGod);
fFullScreen:=ReadBool('Courier30','FullScreen',false);

OrderTemp:=ReadString('Templates','OrderTemp','');
OtvodTemp:=ReadString('Templates','OtvodTemp','');
PathListText:=ReadString('Templates','PathListText','');

end;
end;

procedure TCourierConfig.SaveCfg;
begin
with CfgFile do begin
WriteString('Courier30','ServerName',ServerName);
WriteString('Courier30','BaseName',BaseName);
WriteString('Courier30','UserName',UserName);
WriteString('Courier30','Password',Password);
WriteBool('Courier30','AutoLogin',AutoLogin);
WriteBool('Courier30','FullConnectString',FullConnectString);
WriteString('Courier30','ConnectString',ConnectString);
WriteInteger('Courier30','PacketSize',PacketSize);
WriteString('Courier30','DocStartDate',DateToStr(DocStartDate));
WriteInteger('Courier30','CodePeriod',CodePeriod);
WriteBool('Courier30','FullScreen',fFullScreen);

WriteString('Templates','OrderTemp',OrderTemp);
WriteString('Templates','OtvodTemp',OtvodTemp);
WriteString('Templates','PathListText',PathListText);
end;
end;
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32194114
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мой взгляд, INI лучше. Меньше маразма с установкой. Но для прог баз данных я предпочитаю иметь две таблы - users и hosts. В Users я пишу индивидуальные настройки для юзера,а в Hosts - компа.
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32194213
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для обычных прог лучше реестр (HKEY_CURRENT_USER). Там как раз можно для каждого пользователя хранить индивидуальные настройки. А вот для многопользовательских приложений баз данных настройки лучше хранить на сервере СУБД, чтоб при переносе юзером задницы с одного компа на другой он имел одинаковые настройки. Но это IMHO.
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32194383
Twinp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут ещё есть ньюансы, инсталяцию можно сделать для текущего пользователя или для всех пользователей данного компа что определяется разными разделами реестра. Это + реестру. У ini такого конечно нет.
А вот мжду XML или INI ябы выбрал XML так как в нём боле структурно это получается.
У меня тоже есть формы и их описание храниться в XML.
И ещё + для проверки есть XSL, которые отображает схематично форму, и как бы имулирует её в HTMLе.
Но если тебе XML неподходит то выбор между реестром и ini.
Для ini есть ещё недостаток, с которым я столкнулся.
При иснталяции в новую директорию, конфиг старый теряется, а мне надо было старые настройки, и поэтому пришлось перенести в реестр, где даже после переустановки я могу просто взят старые настройки, а не искать по всему диску старую инсталацию.

Ну тут наверно самый оптимальный выход в реестре хранить такую инфу которая нужна при переустановки и для определения пользователя на компе, если установка для конкретного пользователя. А всё остальное в XML
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32195582
Фотография Skleroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Twinp. Извини за глупый вопрос - ты с XML через TXMLDataSet работал? Я в Help заглянул, там муть несусветная. Ни одного примера :(. Есть примерчик?
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32195611
Twinp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет через TXMLDocument, с помощью XML Mapper
либо через import type library, добавляю MSXML

//---------------------------------------------------------------------------


#pragma hdrstop

#include "UDict.h"

//TDict* DICT = new TDict();

Msxml2_tlb::IXMLDOMDocument2* xmldict;
TCOMIXMLDOMDocument2 tempdoc;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
// ---------------------------------------------------------------------------
 
__fastcall TDict::TDict() {
   Lang = L "ru" ;
   tempdoc = CoDOMDocument30::Create();
   xmldict = tempdoc;
   xmldict->load( "Dictionary.xml" );
}

AnsiString __fastcall TDict::getStr(WideString id) {
   WideString query = L "/Dictionary/str[@name='";
   query += id;
   query += L"']/" ;
   query += Lang;
   Msxml2_tlb::IXMLDOMNodePtr nodep = xmldict->selectSingleNode(query);
   Msxml2_tlb::IXMLDOMNode* node = nodep;
   AnsiString resStr =  "";
   if(node != NULL) {
     resStr = node->text;
   } else {
     resStr = " NOT RES "+id;
      ShowMessage(resStr);
   }
   return resStr;
}


#pragma package(smart_init)
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32195613
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да пихай все в бд, че парится? самый верный способ. тут тебе и переносимость и масштабируемость и надежность(если уж база слетит, то про ини файлы никто и не вспомнит).
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32195639
Фотография Andrew Campball
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INI-Файл (в каталоге SYSTEM32) - проблема под NT-2000. У простого пользователя отсутствуют права на писание в файлы этого каталога. Как следствие нужно дать право читать/писать на конкретный файл.
Реестр - HKCU - никаких проблем, кроме если пользователь заходит под другим аккаунтом, настроики приходится повторять. HKLM - таже проблема с доступом простого пользователя.

Нет надобности для каждого окна иметь свой INI файл это дико как-то. Лучше как уже говорилось использовать один с разделами по именам форм.

По возможность лучше использовать Реестр.
...
Рейтинг: 0 / 0
Что лучше Реестр или ini-файлы
    #32195667
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
AndreyS писал:... 200К в реестре ...
Andrew Campball писал:... По возможность лучше использовать Реестр ...

Ну-ну Хотелось бы посмотреть на поведение винды при таком реестре.
Для справки: размер реестра ограничивается ЯВНО! И автоматически не увеличивается.

2 AndreyS: храни настройки проги в реестре, в HKLM, а вот настройки конкретного юзверя - в %Home%\Applications\AppName (или как там она называется - где Documents & Settings - влом искать), в INI-файле.

Или в БД.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Что лучше Реестр или ini-файлы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]