Вверх ↑
Этот топик читают: Гость
Ответов: 2265
Рейтинг: 676
#1: 2015-10-25 01:23:02 ЛС | профиль | цитата
Почему doClearAll не очищает содержимое файла?
Владимир Кладов писал(а):
ClearAll - полная очистка файла настроек (удаляются все секции вместе со всеми ключами);

Вот тестовая схема: code_36422.txt
------------ Дoбавленo в 00.36:
Вот что нашел:
Vladimir Kladov (2005-08-24 19:39) писал(а):
То, что вызывается в ClearAll, на самом деле обновляет состояние ini-файла в кэше других приложений, которые им пользуются. В примечании не то написано. Поправлю, точнее вставлю DeleteFile перед вызовом и вызов этот вынесу в отдельный метод ReCache.

------------ Дoбавленo в 01.23:
Может заменить на это:
#pas
procedure THIini._work_doClearAll;
var iniFile: File;
begin
AssignFile(iniFile, ReadString(_Data,_data_FileName,_prop_FileName));
ReWrite(iniFile);
CloseFile(iniFile);
end;
карма: 11

0
файлы: 1code_36422.txt [1.6KB] [643]
Разработчик
Ответов: 26149
Рейтинг: 2127
#2: 2015-10-25 02:49:44 ЛС | профиль | цитата
А почему не так КМК, все действия с ini файлом должен делать функционал соответствующего класса

procedure THIini._work_doClearAll;
var StrList:PStrList;
I:integer;
begin
Ini := OpenIniFile(ReadFileName(ReadString(_Data,_data_FileName,_prop_FileName)));
Ini.Mode := ifmRead;
StrList := NewStrList;
Ini.GetSectionNames(strList);
Ini.Mode := ifmWrite;
for i := 0 to strList.Count-1 do
begin
Ini.Section := strList.Items[i];
Ini.ClearSection;
end;
strList.free;
Ini.Free;
end;

карма: 22

0
Ответов: 16884
Рейтинг: 1239
#3: 2015-10-25 08:47:06 ЛС | профиль | цитата
А почему не
#pas
procedure THIini._work_doClearAll;
begin
   DeleteFile(ReadString(_Data,_data_FileName,_prop_FileName));
end;

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26149
Рейтинг: 2127
#4: 2015-10-25 11:28:46 ЛС | профиль | цитата
Tad писал(а):
А почему не

Не, можно, конечно, но для чего его удалять? Разве он не должен остаться, но чистым?
карма: 22

0
Ответов: 2265
Рейтинг: 676
#5: 2015-10-25 11:55:21 ЛС | профиль | цитата
nesco писал(а):
А почему не так
Зачем усложнять, если всего то нужно получить пустой файл.
Tad писал(а):
А почему не
Ну совместимости ради:
Ini.ini писал(а):
doClearAll=Очистка INI файла
Всеже очистка и удаление файла разные вещи.
А вот это как проверить:
обновляет состояние ini-файла в кэше других приложений, которые им пользуются
? Можно было бы добавить doReCache, но как это протестировать, мне не понятно.
карма: 11

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#6: 2015-10-25 12:30:35 ЛС | профиль | цитата
sla8a, а вот Ini.ClearAll надо бы сделать и в твоем случае. Копии же старого файла торчят в памяти и их могут использовать другие приложения. Да и вообще -- Ini.ClearAll надо делать для всех случаев записи в ini, чтобы актуализировать его данные
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#7: 2015-10-25 12:54:57 ЛС | профиль | цитата
nesco писал(а):
Разве он не должен остаться, но чистым?
Дело вкуса. Но кому он нужен пустой ?
nesco писал(а):
Копии же старого файла торчят в памяти
Где и в каком виде ?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2265
Рейтинг: 676
#8: 2015-10-25 14:47:25 ЛС | профиль | цитата
Tad писал(а):
Дело вкуса. Но кому он нужен пустой ?
Тут вопрос нужно ставить по другому. Есть doClearAll (Очистка INI файла), которая не очищает как заявлено, а вроде как обновляет состояние (еще проверить надо). Автор компонента был введен в заблуждение.
И вот вопрос: что делать с doClearAll?
Варианты:
1. Сделать чтоб очищал (делал файл пустым).
2. Удалить doClearAll и сделать doDeleteFile - удаляющий ini файл.
По поводу
nesco писал(а):
Копии же старого файла торчят в памяти
Как это можно проверить? Вроде как в HiAsm не реализовано работа c ini файлом напрямую. Могу предположить что это нужно при редактировании ini файла сторонней программы.
карма: 11

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#9: 2015-10-25 15:22:36 ЛС | профиль | цитата
Посмотри, как реализован пример в MSDN -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms725501(v=vs.85).aspx
Если у тебя два приложения используют один и тот же ini-файл, то редакция этого файла никак не подействует на второе приложение, до перезагрузки этого приложения, тк другое приложение использует копию старого ini-файла. Для этого и существует ClearAll, чтобы очистить кэш и перечитать новый файл без перезагрузки приложения.
карма: 22

0
Ответов: 2265
Рейтинг: 676
#10: 2015-10-25 16:04:31 ЛС | профиль | цитата
nesco писал(а):
Если у тебя два приложения используют один и тот же ini-файл
На HiAsm можно такое реализовать? Или только если:
sla8a писал(а):
это нужно при редактировании ini файла сторонней программы.
Не вижу проблемы вставить ClearAll в процедуры пишущие в ini файл.
С doClearAll что делать будем?
карма: 11

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#11: 2015-10-25 16:10:24 ЛС | профиль | цитата
sla8a писал(а):
С doClearAll что делать будем?

Обнулить файл и применить ClearAll, чтобы все остальные видели, что он алес
карма: 22

0
Ответов: 2265
Рейтинг: 676
#12: 2015-10-25 16:14:11 ЛС | профиль | цитата
nesco писал(а):
Обнулить файл
Твой или мой код?
карма: 11

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#13: 2015-10-25 16:16:53 ЛС | профиль | цитата
nesco писал(а):
Твой или мой код?

Твой код требует еще добавить инициализацию класса для применения ClearAll
карма: 22

0
Ответов: 2265
Рейтинг: 676
#14: 2015-10-25 16:26:11 ЛС | профиль | цитата
Тогда вот так:
#pas
procedure THIini._work_doClearAll;
var iniFile: File;
begin
AssignFile(iniFile, ReadString(_Data,_data_FileName,_prop_FileName));
ReWrite(iniFile);
CloseFile(iniFile);
Open(_Data,ifmWrite);
Ini.ClearAll;
Ini.Free;
end;
и Ini.ClearAll;
в процедуры: doDeleteKey, doEraseSection, doWrite перед строкой Ini.Free;
карма: 11

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#15: 2015-10-25 18:39:00 ЛС | профиль | цитата
Зачем делать Open, котрый еще читает Section, не проще ли вытащить из Open только то, что нужно?

   Ini := OpenIniFile(ReadFileName(ReadString(_Data,_data_FileName,_prop_FileName)));
Ini.Mode := ifmWrite;
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)