Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Непонятие с Ini файлом / 11 сообщений из 11, страница 1 из 1
19.03.2017, 12:38
    #39422431
Irmantas Simaitis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
Здравствуйте. И так, проблема такая. После закрытия программы, все что было изменено и сохранено во время работы - исчезает. Остается то, что было до открытия программы. Во время работы, данные записывается в INI-файле.
...
Рейтинг: 0 / 0
19.03.2017, 12:57
    #39422445
Irmantas Simaitis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
И еще один вопрос ... Как лучше работать с ini-файлом: или каждый раз когда необходимо сохранить данные инициализировать переменную и после сохранение ее уничтожить, или инициализировать Ini переменную при создании формы и только в конце работы, ее уничтожить?
...
Рейтинг: 0 / 0
19.03.2017, 13:39
    #39422466
Irmantas Simaitis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
Первую проблему решил. В основной форме без выгоды лежал компонент RzRegIniFile1 в котором и была проблема. Но остается открытым вопрос, как лучше работать с INI-переменной?
...
Рейтинг: 0 / 0
19.03.2017, 14:26
    #39422485
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
Irmantas SimaitisНо остается открытым вопрос, как лучше работать с INI-переменной?Если часто, регулярно дергать надо, то чтоб не перезоздавать объект постоянно - лучше создать один раз.
Если редко - то можно создал/использовал/удалил.

Вообще разницы особой нет - там тупые обертки над апи-фциями Read/WritePrivateProfile*.
Неужели самому сложно исходники посмотреть.
...
Рейтинг: 0 / 0
19.03.2017, 19:48
    #39422653
Irmantas Simaitis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
YuRockIrmantas SimaitisНо остается открытым вопрос, как лучше работать с INI-переменной?Если часто, регулярно дергать надо, то чтоб не перезоздавать объект постоянно - лучше создать один раз.
Если редко - то можно создал/использовал/удалил.

Вообще разницы особой нет - там тупые обертки над апи-фциями Read/WritePrivateProfile*.
Неужели самому сложно исходники посмотреть.

Спасибо YuRock. Самому несложно, но иногда полезно услышать и другие мнения ...
...
Рейтинг: 0 / 0
19.03.2017, 19:55
    #39422655
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
var
  IniFile: TIniFile;
..................

implementation

procedure TForm.FormCreate(Sender: TObject);
begin
.......
  IniFile:=TIniFile.Create(AppPath+'My.ini');
  ChBoxMakeRAR.Checked:=IniFile.ReadBool('Настройки','Создавать RARархив',true);
  ChBoxMakeZIP.Checked:=IniFile.ReadBool('Настройки','Создавать ZIPархив',false);
........
end


Записать в INI состояние, обычно при закрытии приложения:
  IniFile.WriteBool('Настройки','Создавать RARархив',ChBoxMakeRAR.Checked);
  IniFile.WriteBool('Настройки','Создавать ZIPархив',ChBoxMakeZIP.Checked);



Как-то так. Не забудь, когда время придёт - надо разрушить IniFile
...
Рейтинг: 0 / 0
20.03.2017, 05:11
    #39422767
DetSimen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
кусок рабочего кода из рабочего проекта. Ini файл создается как синглтон, всегда в единственном экземпляре

Код: pascal
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
interface
......................

  type TAppIniFile = class (TMemIniFile)
  ............
  end;

  function AppIniFile:  TAppIniFile;

implementation
uses Dialogs, Types, StrUtils, uStrings, uCommon;


const SingleIniFile:  TAppIniFile = nil;

function AppIniFile:  TAppIniFile;
begin
  try
    if SingleIniFile=nil then SingleIniFile:=TAppIniFile.Create(GetAppIniFileName());
  except
    SingleIniFile:=nil;
..........
    ShowError
  end;

  Result:=SingleIniFile;
end;



{ TAppIniFile }

constructor TAppIniFile.Create(const AIniFileName: string);
begin
   inherited Create(AIniFileName);
   FModified:=FALSE;
end;

.........................

destructor TAppIniFile.Destroy;
begin
  try
   if Self.FModified then UpdateFile;
  except
    ShowMessage(rs_IniWriteError);
  end;

  inherited;
end;
..............................

initialization

finalization

 if Assigned(SingleIniFile) then SingleIniFile.Free;
...
Рейтинг: 0 / 0
20.03.2017, 16:43
    #39423381
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
DetSimen
Код: pascal
1.
const SingleIniFile:  TAppIniFile = nil;

Зачем константа? Чем переменная не угодила?
DetSimen
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function AppIniFile:  TAppIniFile;
begin
  try
    if SingleIniFile=nil then SingleIniFile:=TAppIniFile.Create(GetAppIniFileName());
  except
    SingleIniFile:=nil;
..........
    ShowError
  end;

  Result:=SingleIniFile;
end;

Зачем присваивать обратно в nil? Оно и так nil. Отлов исключения, отображение не текста исключения, а абстрактной ошибки и возвращение nil при ошибке это верх гениальности
DetSimen
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
destructor TAppIniFile.Destroy;
begin
  try
   if Self.FModified then UpdateFile;
  except
    ShowMessage(rs_IniWriteError);
  end;

  inherited;
end;

И опять - кого интересует реальная ошибка? Просто сделаем rs_IniWriteError
DetSimen
Код: pascal
1.
 if Assigned(SingleIniFile) then SingleIniFile.Free;

Ну и какой великий смысл в if Assigned()? Вы код метода Free видели?
...
Рейтинг: 0 / 0
12.12.2017, 04:29
    #39568051
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
Как я использую Ini-файл.

В Ini я храню множество настроек программы, сейчас размер файла составляет порядка 57кб.
От использования TIniFile отказался в пользу TMemIniFile - он намного быстрее работает т.к не лазит за каждым параметром в файл заново.

В главной форме (которая создается первой) объявляю глобальную переменную
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  FrmMain: TFrmMain;
  Ini: TMemIniFile;

implementation

const
  IniSectionName = 'FrmMain';



И ее видно из всего приложения.

Создается и разрушается Ini в событиях главной формы.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TFrmMain.FormCreate(Sender: TObject);
begin
  Ini := TMemIniFile.Create( ChangeFileExt(Application.ExeName, '.ini') );
  // размер и положение окна
  Top    := Ini.ReadInteger(IniSectionName, 'Top'   ,   10);
  Left   := Ini.ReadInteger(IniSectionName, 'Left'  ,   10);
  Width  := Ini.ReadInteger(IniSectionName, 'Width' , 1000);
  Height := Ini.ReadInteger(IniSectionName, 'Height',  540);
end;

procedure TFrmMain.FormDestroy(Sender: TObject);
begin
  Ini.WriteInteger(IniSectionName, 'Top'        , Top       );
  Ini.WriteInteger(IniSectionName, 'Left'       , Left      );
  Ini.WriteInteger(IniSectionName, 'Width'      , Width     );
  Ini.WriteInteger(IniSectionName, 'Height'     , Height    );
  Ini.UpdateFile;
  Ini.Free;
end;



Для каждого окна своя секция - примерно по имени класса окна.
Для некоторых случаев имя секции создается динамически, в частности для использования с отчетами FastReport - используется префикс и ID отчета. Получается что у каждой формы своя секция в Ini-файле.

Что бы не писать в каждом Read/Write имя конкретной секции, завожу в форме локальную константу IniSectionName.
Это дает возможность копипастить чтение и запись обычных параметров которые есть в большинстве форм.


Еще может быть удобным использование специального класса для хранения настроек, когда параметры глобальные а не по формам, и часто использутся. Можно городить свой класс и прочее, но оказалось удобно использовать для этого DataModule.
Обзываем его например CFG: TDataModule и элементарно объявляем у него поля.
Обращаться потом удобно, например

Код: pascal
1.
id := CFG.base_id;


При создании CFG зачитываем его параметры из того же Ini а при Destroy выгружаем обратно. Ну или в базе и т.п.
Лично мне удобно когда в списке модулей есть эта сущность CFG.
...
Рейтинг: 0 / 0
12.12.2017, 09:51
    #39568117
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
fraksКак я использую Ini-файл.

Для каждого окна своя секция - примерно по имени класса окна.
...
Что бы не писать в каждом Read/Write имя конкретной секции, завожу в форме локальную константу IniSectionName.
Это дает возможность копипастить чтение и запись обычных параметров которые есть в большинстве форм.
...

Можно было вообще Form.ClassName использовать в таком случае :)
...
Рейтинг: 0 / 0
12.12.2017, 12:52
    #39568259
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятие с Ini файлом
alekcvpfraksКак я использую Ini-файл.

Для каждого окна своя секция - примерно по имени класса окна.
...
Что бы не писать в каждом Read/Write имя конкретной секции, завожу в форме локальную константу IniSectionName.
Это дает возможность копипастить чтение и запись обычных параметров которые есть в большинстве форм.
...

Можно было вообще Form.ClassName использовать в таком случае :)
Давным давно когда я это делал, то пытался использовать Form.Name но она автонумеруется и каждый последующий экземпляр класса имеет собственное имя.
А до Form.ClassName я чего-то не догадался :)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Непонятие с Ini файлом / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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