【问题标题】:Delphi 7 - Save to a Specific .INI Files NameDelphi 7 - 保存到特定的 .INI 文件名
【发布时间】:2015-09-14 13:15:35
【问题描述】:

我修改了MasterMan82's TIniFile code 以从 & 到 TEdit/TComboBox 和 TMemo 读取和写入多个值。

请原谅我的模糊问题,我的英语不好。

所以,我的意思是:

我有几个 .INI 文件,A.ini、B.ini、C.ini ....等等。我只是将 A.ini 作为变量存储在代码中。无法将所有文件名都放在代码中。

当我打开 A.ini 时,进行一些更改,单击 SAVE 保存所做的任何更改,并且成功!。当然,因为代码中已经定义了A.ini。

但是,当我打开文件 B.ini 或 C.ini 或 D.ini...进行更改并保存时,重新打开文件,但文件中的所有更改都消失或未保存,当然,因为代码中只定义了 A.ini。

那么,我的目标是如何保存或记录所有文件修订?

下面是代码。

......

uses
  Windows, Messages, SysUtils, Variants, Classes, 
  Graphics, Controls, Forms, IniFiles, Dialogs;

......

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
   I, LinesCount: Integer;
   Read         : TIniFile;
begin
   Read  := TINIFile.Create(ExtractFilePath(Application.EXEName)+ 'A.ini');
// Read  := TIniFile.Create(ChangeFileExt(Application.Exename,'A.ini'));
  Try
   Proxy.Text   := Read.ReadString('SETTING','Proxy','');
   Port.Text    := Read.ReadString('SETTING','Port','');
   Route.Checked:= Read.ReadBool('SETTING','Route',False);
   // TO READ MEMO LINES
   LinesCount := Read.ReadInteger('MEMO', 'Lines Count', 0);
   for I := 0 to LinesCount-1 do
   Memo1.Lines.Insert(I, Read.ReadString('MEMO', 'Item'+IntToStr(I), ''));
  Finally
   Read.Free;
  end;
end;

procedure TForm1.SaveClick(Sender: TObject);
var
   I, LinesCount: Integer;
   ToSave       : TIniFile;
begin
  ToSave := TINIFile.Create(ExtractFilePath(Application.EXEName)+ 'A.ini');
  Try
   ToSave.WriteString('SETTING','Proxy',Proxy.Text);
   ToSave.WriteString('SETTING','Port',Port.Text);
   ToSave.WriteBool('SETTING','Route',Route.Checked);
   // TO SAVE MEMO LINES
   LinesCount := Memo1.Lines.Count;
   ToSave.WriteInteger('MEMO', 'Lines Count', LinesCount);
   for I := 0 to LinesCount-1 do
   ToSave.WriteString('MEMO', 'Item'+IntToStr(I), Memo1.Lines[I]);
  Finally
   ToSave.Free;
 end;
end;

procedure TForm1.OpenClick(Sender: TObject);
var
   I, LinesCount: Integer;
   OpenFile     : TIniFile;
begin    
   OpenDialog.Filter:='Ini File (.ini)|*.ini';
  if OpenDialog.Execute then begin
   Memo1.Clear;
   OpenFile := TINIFile.Create(OpenDialog.FileName);
  Try
   Proxy.Text   := OpenFile.ReadString('SETTING','Proxy','');
   Port.Text    := OpenFile.ReadString('SETTING','Port','');
   Route.Checked:= OpenFile.ReadBool('SETTING','Route',False);
   // TO READ MEMO LINES
   LinesCount   := OpenFile.ReadInteger('MEMO', 'Lines Count', 0);
   for I := 0 to LinesCount-1 do
   Memo1.Lines.Insert(I, OpenFile.ReadString('MEMO', 'Item'+IntToStr(I), ''));
  Finally
   OpenFile.Free;
  end;
 end;
end;

【问题讨论】:

  • 你真正要问的甚至与 INI 文件没有任何关系。它与加载先前保存的文件有关。您应该退后一步,忽略整个 INI 文件(因为它与您的问题无关),并考虑让您的应用记住文件所在的位置。
  • 我已经读了三遍了,对我来说,不清楚要问什么。
  • 我必须立即指出的一件事是冗余代码的使用。您在构造函数和按钮单击处理程序中使用了相同的代码块。你应该学会使用过程和函数来处理这类事情——封装这个逻辑一次并重新使用它。像这样封装和自包含的东西对于实现您正在寻找的目标很重要。
  • 我不知道问题是什么。我想如果你能找到一种方法来清楚地提出问题,那么你就会得到答案。
  • OpenClick 中,您对变量Open 进行了签名,但之后您再也没有使用它。相反,您使用Read,然后将其销毁。是否有可能是该错误使您难以理解其余问题?

标签: delphi delphi-7


【解决方案1】:

你期望在不存在的地方有魔法。如果您想保存到您打开的同一个文件,则在打开时将所选名称存储在一个变量中,然后在保存时也使用该变量。

同样,如果您想记住从一次运行到下一次运行的名称,那么您需要将名称存储在持久存储中(如注册表或 INI 文件),然后在下次程序启动时读取该名称.

得到你所要求的并不难,但你必须为它编写一些代码。

【讨论】:

  • 为什么b.ini存储在变量中?你打开了一个.ini。使用变量来跟踪您需要的任何内容。
  • 您的解释是我上面代码的结果。而我的问题是:...假设我有 a.inib.ini。当我打开 a.ini 并单击保存按钮后,编辑它后,此文件不会更改,因为 b.ini 存储在变量中。那么如何编写正确的变量,以便仍然可以保存正在使用的任何文件名?谢谢。
  • @Fabian 我一遍又一遍地阅读您的评论,我所能理解的是您现在有 2 个使用相同变量的不同 INI 文件实例,并且当您创建 B.ini 时,它会替换代码中的 A.ini 变量在您的问题中不可见?在这种情况下,您为什么不使用两个不同的变量?正如您的评论所暗示的,您的代码甚至没有显示任何重用变量的迹象。
  • a.inib.ini 只是简单的例子,因为我有两个以上的 .ini 文件.如果我创建一个具有特定文件名的变量,例如a.ini,然后当我使用 b.ini 时,它的更改无法保存。所以我的目标是代码可以保存当前正在使用的任何 .ini 文件。
  • 当然我的解释是你上面代码的结果。你还希望我用什么?我只能看到你给我看的东西。无论如何,我知道您的磁盘上有两个文件。打开 a.ini,对表单进行一些更改,然后保存。我不明白为什么保存会影响 b.ini 。你没有打开它。打开 a.ini 时,将 'a.ini' 存储在字符串变量中。保存时,使用该变量知道要打开哪个文件。这个计划在哪里遇到了麻烦?
【解决方案2】:

当您打开一个 ini 文件时,将文件名存储在一个变量中,如许多 cmets 中所述。

例如,(FCurrentIniFilename: String; 是 TForm1 中的私有变量):

FormCreate 事件中:

FCurrentIniFilename := ExtractFilePath(Application.EXEName)+ 'A.ini';
Read  := TINIFile.Create(FCurrentIniFilename);
...

在 OpenFile 事件中:

if OpenDialog.Execute then begin
  FCurrentIniFilename := OpenDialog.Filename;
  Open := TINIFile.Create(FCurrentIniFileName);
  try
    ...
  finally
    Open.Free;
  end;
end;

当您保存信息时:

ToSave := TINIFile.Create(FCurrentIniFilename);

【讨论】:

  • 谢谢。但是点击保存按钮时出现错误,see here
  • 看起来你从来没有给FCurrentIniFilename赋值。您必须学习如何调试您的代码。在您遇到问题的代码部分设置断点并检查为什么会发生这些错误。
  • 我回滚了上次的编辑,请不要更改问题。 FCurrentIniFilename 必须是全局范围,如我的回答中所述。
  • 哦,我的错误。它现在正在工作,谢谢!顺便说一句,我已经用一个我忘了问的问题更新了我的帖子。你能教我解决方案吗?非常感谢你,LU RD!。
  • 那是另一个问题。 SO 的问答形式是一次回答一个问题。如果您有新问题,请打开一个新问题,而不是编辑这个问题。
猜你喜欢
  • 2017-08-08
  • 2016-09-13
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 2012-02-14
  • 2011-01-06
相关资源
最近更新 更多