【问题标题】:how to create a configuration file with not involve IniFile? [closed]如何创建不涉及 IniFile 的配置文件? [关闭]
【发布时间】:2014-04-23 18:19:57
【问题描述】:

我正在寻找一种方法来创建不涉及 IniFile 的配置文件。

我在一个 Delphi 应用程序中有 2 个编辑框,第一个在 editbox1 中命名为 username1,第二个在 editbox2 中命名为密码。

我想创建一个如下图所示的配置文件作为示例配置:

superuser 是输入到editbox1 的username1

passw123 是editbox2的密码输入

这里我不想涉及IniFile,我想用txt和记事本应用程序制作一个如下所示的配置文件,只制作一个配置文件。

超级用户 密码123

【问题讨论】:

  • 尝试使用xml,非常类似于记事本应用程序。
  • @Zeina asker 想要一个不是 XML 的文件
  • 不清楚你在问什么。你真的想知道如何读写一个两行文本文件吗?使用 TStringList 很容易做到这一点。你问的是这个吗?
  • 然后尝试将其保存为txt文件而不是ini文件,我想我没有得到任务。
  • 对不起,如果我写的字少,可能会在谷歌翻译中理解这个错误。我想创建一个像图片中的配置文件,但功能与 IniFile 相同

标签: delphi delphi-7 pascal ini


【解决方案1】:

有点难以理解你到底在问什么,但如果你问如何将包含用户名和密码的配置保存并加载到一个简单的文本文件中,你可以使用以下代码:

TYPE
  TConfiguration = RECORD
                     UserName,Password : STRING
                   END;

FUNCTION ReadConfig(CONST FileName : STRING) : TConfiguration;
  VAR
    TXT : TextFile;

  BEGIN
    AssignFile(TXT,FileName); RESET(TXT);
    TRY
      READLN(TXT,Result.UserName);
      READLN(TXT,Result.Password)
    FINALLY
      CloseFile(TXT)
    END
  END;

PROCEDURE WriteConfig(CONST FileName : STRING ; CONST Config : TConfiguration);
  VAR
    TXT : TextFile;

  BEGIN
    AssignFile(TXT,FileName); REWRITE(TXT);
    TRY
      WRITELN(TXT,Config.UserName);
      WRITELN(TXT,Config.Password)
    FINALLY
      CloseFile(TXT)
    END
  END;

保存时就这样使用:

VAR Config : TConfiguration;
...
Config.UserName:=editbox1.Text;
Config.Password:=editbox2.Text;
WriteConfig(FileName,Config);

然后像这样重新加载:

VAR Config : TConfiguraion;
...
Config:=ReadConfiguration(FileName);
editbox1.Text:=Config.UserName;
editbox2.Text:=Config.Password;

如果这不是您想要的,您将不得不详细说明...

【讨论】:

  • 我认为这就是他所追求的,但是哇,老式的格式和语言功能!您应该使用 TFileStream,而不是旧式文件 IO……而且大写的关键字会伤害 :)
  • 使用 TFileStream 对于简单的 TextFile 读取来说太过分了,IMO。
  • 不过,这是(嗯,一种)典型的现代 Delphi 方式。据我所知,主要原因是旧式文件 IO 不处理 Unicode。
  • @David TFileStream 实际上在顶部,如果您知道我的意思的话。你如何解析成行?至少传统 I/O 可以做到这一点。所以 TFileStream 在这里很烂。它几乎不比 ReadFile 好。现代方式是使用 TStreamReader。
  • 出色的 HeartWare,这就是我的意思.... 谢谢大家
【解决方案2】:

当你有一个包含配置信息的文件时:

superuser
password123

您可以使用 TStringList 来读取这些内容:

procedure GetConfig(const AFileName: string; out AValue1, AValue2: string);
var
  list : TStringList;
begin
  list := TStringList.Create;
  try
    list.LoadFromFile(AFileName);
    if list.Count<2 then begin
      // ERROR
    end;
    AValue1 := list[0];
    AValue2 := list[1];
  finally
    FreeAndNil(list);
  end;
end;

我假设你可以自己弄清楚写作部分。

您可以添加任何您喜欢的错误处理。

【讨论】:

    【解决方案3】:

    您正在脑海中混合这些层,因此在您的应用程序中。

    你应该想得更抽象。 UI 不需要知道信息存储在哪里以及如何存储,UI 只需要知道如何获取信息。

    TMyConfigData = class abstract
    protected
      function GetUsername : string; virtual; abstract;
      function GetPassword : string; virtual; abstract;
    public
      property Username : string read GetUsername;
      property Password : string read GetPassword;
    end;
    

    具体类(基于文本文件)如下所示

    TMyTextConfigData = class( TMyConfigData )
    private
      FFilename : string;
      FData : TStringList;
    protected
      function GetUsername : string; override;
      function GetPassword : string; override;
    public
      constructor Create( const Filename : string );
      destructor Destroy; override;
    end;
    
    constructor TMyTextConfigData.Create( const Filename : string );
    begin
      inherited Create;
      FFilename := Filename;
      FData := TStringList.Create;
      FData.ReadFromFile( FFilename );
    end;
    
    destructor Destroy;
    begin
      FData.Free;
      inherited;
    end;
    
    function TMyTextConfigFile.GetUsername : string;
    begin
      Result := FData[0]; // first line
    end;
    
    function TMyTextConfigFile.GetPassword : string;
    begin
      Result := FData[1]; // second line
    end;
    

    一旦您决定使用 INI 文件或 XML 文件或注册表,甚至是数据库,您只需为此构建一个新的具体类。您的应用程序 (UI) 将只知道 TMyConfigData 的实例,不需要更改。

    【讨论】:

      【解决方案4】:

      我看到里面有密码。可能通过 ini 文件,您的意思是可见文本。 您可以使用 TRegistry 在 Windows 注册表中的某处隐藏您的配置, 或 ClientDataSet 表,其内容使用记事本不易阅读。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多