На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
  
> Lazarus + IniFile + свой класс HELP!
    Всем привет!
    Просьба помочь в следующей проблеме:
    есть свой класс, в котором есть свойства, на свойства повешены функции считывания из файла.
    Класс создается при запуске программы и не уничтожается.
    Проблема состоит в том, что когда я запрашиваю нужное свойство в первый раз - оно считывается из файла и возвращается, но если запросить во время выполнения, тогда ничего не меняется, возвращается тоже самое что в первый раз, должно произойти считывание из ini файла, но этого не происходит, не могу никак понять почему.
    Чтобы лучше понять, можно сделать запрос по таймеру на эту функцию, и начать изменять в файле нужный ident в нужной section, будет видно, что при изменении в файле, в свойство класса не возвращается измененное значение, я в замешательстве (попробовал в delphi 7, там норм работает, в Lazarus не хочет) :(
    код ниже
    ExpandedWrap disabled
      unit SettingsHelper;
       
      interface
       
      uses Classes, SysUtils, IniFiles;
       
      type
       
      { TSettings }
       
      TSettings = class
          private
              iSettingsFile: TIniFile;
              function GetBaseCurrency: String;
              procedure SetBaseCurrency(Value: String);
              function GetSettingsFileName: String;
          public
              constructor Create();
              destructor Destroy(); override;
              property BaseCurrency: String read GetBaseCurrency write SetBaseCurrency;
      end;
       
      const
          cSettingsFileName = 'settings';
          cSettingsFileExt = '.conf';
          szSettings = 'Settings';
       
      implementation
       
      function TSettings.GetBaseCurrency: String;
      begin
          Result := iSettingsFile.ReadString(szSettings, 'BaseCurrency', '');
      end;
       
      procedure TSettings.SetBaseCurrency(Value: String);
      begin
          iSettingsFile.WriteString(szSettings, 'BaseCurrency', Value);
      end;
       
      function TSettings.GetSettingsFileName: String;
      begin
          Result := ExtractFileDir(ParamStr(0)) + '\' + cSettingsFileName + cSettingsFileExt;
      end;
       
      constructor TSettings.Create();
      begin
          inherited;
          iSettingsFile := TIniFile.Create(GetSettingsFileName);
      end;
       
      destructor TSettings.Destroy();
      begin
          iSettingsFile.Free;
          inherited;
      end;
       
      end.
    Если что-то не так, то результат всё равно будет таким, как ты захочешь;
    if not True then Result := True else Result := True;
      Возможно, что ini файл считывается в память, а потом все данные берутся из памяти.
      Я бы попробовал вместе со считыванием файла уточнять время последней модификации. Если текущее значение времени модификации не совпало со временем в переменной, то нужно организовать перечитывание ini файла с диска. Скорее всего в классе TIniFile есть такой метод.

      Или же совсем просто. Удалить поле TIniFile, а при чтении настроек всегда заново создавать переменную этого класса.
      Сообщение отредактировано: Федосеев Павел -
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,0616 ]   [ 15 queries used ]   [ Generated: 18.10.19, 03:51 GMT ]