PropStorageEh не сохраняет в скрытые файлы *.ini с атрибутом FILE_ATTRIBUTE_HIDDEN. Даёт Access violation.
В версии 5.6 и ранее сохраняло.
Ой как это плохо.
Для чего делаю скрытые файлы? - Для того что бы пользователи не удалили.
НЕ ПРЕДЛАГАТЬ перейти на сохранение
не WriteAsText и прочее...
Как побороть проблему без ломки кода программы. Что бы всё осталось как прежде. В том числе и настройки всех таблиц в программе. Если перейду на
WriteAsText =false - думаю полетят все настройки таблиц. А этого допустить нельзя.
Похоже (возможно) проблема в процедуре:
procedure TIniPropStorageManEh.WritePropertiesText(PropStorage: TPropStorageEh; const Text: String);
var
sl: TStrings;
ini: TCustomIniFile;
i: Integer;
s : String;
begin
sl := nil;
ini := nil;
try
sl := TStringList.Create;
sl.Text := Text;
ini := TMemIniFile.Create(IniFileName);
ini.EraseSection(PropStorage.Section);
if TrimRight(sl.Text) = '' then
Exit;
s := '''' + sl[0] + '''' + #13#10;
for i := 1 to sl.Count - 1 do
s := s + 'Line' + IntToStr(i) + '=''' + sl[i] + '''' + #13#10;
ini.WriteString(PropStorage.Section, 'Line0', s);
finally
ini.UpdateFile; sl.Free;
ini.Free;
end;
Раньше была процедура:
procedure TIniPropStorageManEh.WritePropertiesText(PropStorage: TPropStorageEh; Text: String);
var
sl: TStrings;
ini: TCustomIniFile;
i: Integer;
begin
sl := nil;
ini := nil;
try
sl := TStringList.Create;
sl.Text := Text;
ini := TIniFile.Create(IniFileName);
for i := 0 to sl.Count - 1 do
ini.WriteString(PropStorage.Section, 'Line' + IntToStr(i), '''' + sl[i] + '''');
i := sl.Count;
while ini.ValueExists(PropStorage.Section, 'Line' + IntToStr(i)) do
begin
ini.DeleteKey(PropStorage.Section, 'Line' + IntToStr(i));
Inc(i);
end;
finally
sl.Free;
ini.Free;
end;
end;
Кто ни будь сталкивался?
Дополнительно провел эксперимент. Можете к себе скопировать и попробовать.
procedure TForm1.Button7Click(Sender: TObject);
var
Ini: TCustomIniFile;
begin
Ini := TMemIniFile.Create(extractfilepath(paramstr(0)) + '\Test.ini');
SetFileAttributes(PAnsiChar(extractfilepath(paramstr(0)) + '\Test.ini'), FILE_ATTRIBUTE_NORMAL);
Ini.WriteString('TEST', 'Item', 'Vasya2');
Ini.UpdateFile;
Ini.Free;
SetFileAttributes(PAnsiChar(extractfilepath(paramstr(0)) + '\Test.ini'), FILE_ATTRIBUTE_HIDDEN);
end;
Т.е., что бы сохранение работало, нужно вначале установить атрибут файла в НОРМАЛЬНЫЙ, сохранить, а затем снова перевести атрибут файла в FILE_ATTRIBUTE_HIDDEN.
Но это же опасно и не правильно. Рано или поздно не сработает и разрушит файл настроек.