【问题标题】:Saving a value even after program is closed and reopened即使在程序关闭并重新打开后也保存一个值
【发布时间】:2020-06-03 17:13:26
【问题描述】:

我想知道在程序关闭并重新打开后如何保存“变量”的内容。

例如: iCount:=0; inc(iCount)=1;

当我关闭程序并重新打开时,我希望 iCount 包含 1。 谢谢。

【问题讨论】:

    标签: delphi delphi-xe2 delphi-2010


    【解决方案1】:

    有很多方法可以做到这一点。您需要将值保存在某处:文件中、Windows 注册表中、云中……

    文件

    也许最简单的方法是使用 INI 文件。试试这个:

    1. 创建一个新的 VCL 应用程序。

    2. 在主窗体中添加一个字段FMyNumber: Integer

    3. 在主窗体中,添加以下方法(并确保在实现部分的uses 列表中包含IniFilesIOUtils):

      function TForm1.GetSettingsFileName: TFileName;
      begin
        Result := TPath.GetHomePath + '\Fuzail\TestApp';
        ForceDirectories(Result);
        Result := Result + '\settings.ini';
      end;
      
      procedure TForm1.LoadSettings;
      var
        Ini: TMemIniFile;
      begin
        Ini := TMemIniFile.Create(GetSettingsFileName);
        try
          FMyNumber := Ini.ReadInteger('Settings', 'MyNumber', 0);
        finally
          Ini.Free;
        end;
      end;
      
      procedure TForm1.SaveSettings;
      var
        Ini: TMemIniFile;
      begin
        Ini := TMemIniFile.Create(GetSettingsFileName);
        try
          Ini.WriteInteger('Settings', 'MyNumber', FMyNumber);
          Ini.UpdateFile;
        finally
          Ini.Free;
        end;
      end;
      
    4. 现在请确保在您的应用程序启动和关闭时调用这些:

      procedure TForm1.FormCreate(Sender: TObject);
      begin
        LoadSettings;
      end;
      
      procedure TForm1.FormDestroy(Sender: TObject);
      begin
        SaveSettings;
      end;
      

      现在FMyNumber 的值在会话之间保存!

    注册表

    另一种常见的方法可能是使用注册表。试试这个:

    1. 创建一个新的 VCL 应用程序。

    2. 在主窗体中添加一个字段FMyNumber: Integer

    3. 在主窗体中,添加以下方法(并确保在实现部分的uses 列表中包含Registry):

      procedure TForm1.LoadSettings;
      var
        Reg: TRegistry;
      begin
        Reg := TRegistry.Create;
        try
          Reg.RootKey := HKEY_CURRENT_USER;
          if Reg.OpenKey('\Software\Fuzail\TestApp', False) then
            try
              if Reg.ValueExists('MyNumber') then
                FMyNumber := Reg.ReadInteger('MyNumber')
            finally
              Reg.CloseKey;
            end;
        finally
          Reg.Free;
        end;
      end;
      
      procedure TForm1.SaveSettings;
      var
        Reg: TRegistry;
      begin
        Reg := TRegistry.Create;
        try
          Reg.RootKey := HKEY_CURRENT_USER;
          if Reg.OpenKey('\Software\Fuzail\TestApp', True) then
            try
              Reg.WriteInteger('MyNumber', FMyNumber);
            finally
              Reg.CloseKey;
            end;
        finally
          Reg.Free;
        end;
      end;
      
    4. 现在请确保在您的应用程序启动和关闭时调用这些:

      procedure TForm1.FormCreate(Sender: TObject);
      begin
        LoadSettings;
      end;
      
      procedure TForm1.FormDestroy(Sender: TObject);
      begin
        SaveSettings;
      end;
      

      FMyNumber 的值再次在会话之间保存!

    【讨论】:

    • 嗯,有什么理由建议使用注册表而不是 IniFile(我认为即使是 MS 现在也不鼓励使用注册表(imo 是有史以来最大的架构愚蠢))?
    • @MartynA:我有点喜欢注册表,因为它方便但不是超级重要的每个用户设置,如 GUI 状态,但最终决定哪种存储方法最合适的是特定场景,并且 Q 不包含任何此类详细信息。
    • 同意@MartynA,我会避免在新应用程序中使用注册表(除了需要注册表交互的东西)。对于用户设置、配置文件等,存储这些文件的正确位置是相应的 AppData 文件夹。
    • 为添加而喝彩。 +1
    • 国际海事组织;当您想要部署一个配置可能会被错误删除的程序(如 INI 文件)时,注册表很有用。大多数最终用户可以错误地删除此文件,但无法进入注册表,查找并删除它:我通常将它用于我不希望用户如此使用的参数
    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多