Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 27 апр 2024, 06:45

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 15 мар 2018, 15:47 
Не в сети

Зарегистрирован: 15 мар 2018, 15:31
Сообщений: 48
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.
Но это же опасно и не правильно. Рано или поздно не сработает и разрушит файл настроек.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 23 мар 2018, 17:53 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Возможно TMemIniFile не поддерживает сохранение в скрытых файлах.
Раньше использовался класс TIniFile.
Вы можете заменить в исходниках библиотеки TMemIniFile на TIniFile.
Вы также можете написать в тех. поддержку Embarcadero чтобы они исправили ошибку в классе TMemIniFile.
Возвращать обратно на TIniFile для всей библиотеки не имеет смысла т.к. TIniFile работает слишком медленно.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB