Проблема с PropertyStorage

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Проблема с PropertyStorage

Сообщение Odyssey »

В Lazarus есть замечательная фича -- с помощью TForm.SessionProperties для компонентов формы можно указать набор сохраняемых свойств. Тогда достаточно бросить на форму компонент TIniPropStorage/TXmlPropStorage и указанные свойства будут автоматически сохраняться/загружаться в/из соответствующего файла.

Но есть одна проблема: если ini/xml файл только для чтения (на CD/DVD, или так настроены права доступа) то при попытке сохранения возникает exception, и отловить его, кроме как в Application.OnException, больше негде. Всё бы ничего, но при таком способе
* возникают утечки памяти на уровне LCL, и
* чтобы проигнорировать только этот exception и не проглядеть остальные, приходится опознавать его не только по классу, но и по вхождению подстроки в сообщение. Примерно так:

Код: Выделить всё

procedure TfmMain.AppExceptionHandler(Sender: TObject; E: Exception);
begin
  if (E is EFCreateError) and (Pos('.ini', E.Message) > 0) then
    Abort
  else
    Application.ShowException(E);
end;

Встречался ли кто-нибудь с этой проблемой, и если да, то как её решили?
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Попробуй, что-нибудь вроде:

Код: Выделить всё

procedure TForm1.XMLPropStorage1RestoreProperties(Sender: TObject);
begin
  if FileIsReadOnlyUTF8(XMLPropStorage1.FileName) then  //не уверен - нужно ли UTF8
    XMLPropStorage1.Active:=False;
end;
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Пробовал, свойство Active к сожалению не влияет на сохранение свойств, только на их загрузку и применение к компонентам. Т.е. при завершении работы PropertyStorage все равно пытается сохраниться и вызывает исключение.
Что хуже всего -- непонятно на что вешать багу - на свойство Active, на PropertyStorage, который не ловит исключение при освобождении IniFile или на код сохранения формы, который не предоставляет механизма нормальной обработки этого исключения :(
Аватара пользователя
Inferno
новенький
Сообщения: 78
Зарегистрирован: 20.03.2009 13:40:20
Откуда: Тюмень

Сообщение Inferno »

мх...проблем то:
Создать свой компонент наследник от TXMLPropStorage. зарегистрировать его в лазаре.

Код: Выделить всё

uses Classes, SysUtils,XMLPropStorage;
  Type
  { TXMLPropStorageCHK }

  TXMLPropStorageCHK=class(TXMLPropStorage)
  public
    procedure Save;override;
  End;

procedure Register;


implementation
               

{ TXMLPropStorageCHK }

Procedure TXMLPropStorageCHK.Save;
Begin
  if not FileIsReadOnlyUTF8(Self.FileName) then
     Inherited Save;
End;         

procedure Register;
begin
  RegisterComponents('Misc',[TXMLPropStorageCHK]);
end;

               
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

О, а вот это мысль. Странно, что я сразу не догадался :) Правда придется создавать в рантайме или пересобирать Лазарус, но это мелочи. Спасибо!
Аватара пользователя
McLion
постоялец
Сообщения: 332
Зарегистрирован: 06.02.2015 17:41:00

Сообщение McLion »

Пост был создан в 2009 году. Кто знает существует ли эта проблема еще или нет?
Ответить