Проблема с PropertyStorage

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

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

Проблема с PropertyStorage

Сообщение Odyssey » 27.10.2009 23:43:48

В 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;

Встречался ли кто-нибудь с этой проблемой, и если да, то как её решили?
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Проблема с PropertyStorage

Сообщение v-t-l » 28.10.2009 12:14:36

Попробуй, что-нибудь вроде:
Код: Выделить всё
procedure TForm1.XMLPropStorage1RestoreProperties(Sender: TObject);
begin
  if FileIsReadOnlyUTF8(XMLPropStorage1.FileName) then  //не уверен - нужно ли UTF8
    XMLPropStorage1.Active:=False;
end;
v-t-l
энтузиаст
 
Сообщения: 741
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Проблема с PropertyStorage

Сообщение Odyssey » 28.10.2009 21:23:32

Пробовал, свойство Active к сожалению не влияет на сохранение свойств, только на их загрузку и применение к компонентам. Т.е. при завершении работы PropertyStorage все равно пытается сохраниться и вызывает исключение.
Что хуже всего -- непонятно на что вешать багу - на свойство Active, на PropertyStorage, который не ловит исключение при освобождении IniFile или на код сохранения формы, который не предоставляет механизма нормальной обработки этого исключения :(
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Проблема с PropertyStorage

Сообщение Inferno » 29.10.2009 12:44:02

мх...проблем то:
Создать свой компонент наследник от 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;

               
Аватара пользователя
Inferno
новенький
 
Сообщения: 78
Зарегистрирован: 20.03.2009 14:40:20
Откуда: Тюмень

Re: Проблема с PropertyStorage

Сообщение Odyssey » 29.10.2009 23:01:25

О, а вот это мысль. Странно, что я сразу не догадался :) Правда придется создавать в рантайме или пересобирать Лазарус, но это мелочи. Спасибо!
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Проблема с PropertyStorage

Сообщение McLion » 13.04.2015 13:54:52

Пост был создан в 2009 году. Кто знает существует ли эта проблема еще или нет?
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 241

Рейтинг@Mail.ru