Delphi 7 - 保存到特定的 .INI 文件名

2024-01-05

我修改了MasterMan82的TIniFile代码 https://stackoverflow.com/a/17631509从 & 读取多个值并将其写入 TEdit/TComboBox 和 TMemo。

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

所以,我的意思是:

我有几个 .INI 文件,A.ini、B.ini、C.ini ....等等。我只是将 A.ini 存储为代码中的变量。不可能将所有文件名放入代码中。

当我打开 A.ini 进行一些更改时,单击“保存”保存所做的任何更改,然后成功!当然,因为代码中已经定义了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 文件时,将文件名存储在变量中,如许多注释中所述。

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

In the FormCreate event:

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

在打开文件事件中:

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

当您保存信息时:

ToSave := TINIFile.Create(FCurrentIniFilename);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi 7 - 保存到特定的 .INI 文件名 的相关文章

  • 递归遍历树视图中的节点?

    我有一个树视图 其中已经填充了另一个过程中的文件 文件夹 我想按照从上到下的确切顺序逐项迭代树视图中的项目 但是 与普通列表不同 我不能仅使用简单的for对此的声明 我必须进入每个节点等 我该怎么做呢 我希望有一种方法可以在不运行递归过程的
  • Delphi (Indy) TIdTCPClient 在线程中

    在互联网上 我看到通常将 TIdTCPClient 放置在自定义 TThread 后代中 为什么要这样做 有时我也在这样的线程中看到服务器 为什么 干杯 阿德里安 Indy 使用阻塞 I O 最好在线程中处理 这是 Indy 整体设计的核心
  • 错误:使用 Microsoft WebService.dll 通过 Delphi7 规范化 XML

    我正在使用 Delphi7 修改旧项目以添加使用证书和签名 经过一番搜索后我发现XML 规范化函数 https learn microsoft com en us previous versions dd815358 v vs 85 但我无
  • 使用普通画布/文本输出更新LayeredWindow

    有没有一种方法可以使用画布在表单上绘图 然后使用 updatelayeredwindow 这样表单就不可见 但文本可见 就像只显示文本的半透明表单一样 如果没有 那么有没有办法只用画布 opengl directx 制作某种半透明形式 我想
  • 如何以编程方式安排任务

    如何使用 delphi 7 像 Google updater 一样安排任务 我没有使用注册表 因为它被卡巴斯基防病毒软件检测为误报 我在注册表中作为启动项添加的任何内容都会被检测为特洛伊木马 因此我决定使用任务计划 下面的代码展示了如何删除
  • 如何在 Vista 上安装 Delphi 7

    我多次尝试在 Vista 上安装 Delphi 7 但 Vista 告诉我此应用程序 Delphi 7 存在已知问题 从而阻止了我这样做 我公司的其他几个人在 Vista 上安装 D7 时遇到了问题 由此得出的结论是 我们的 D7 应用程序
  • 如何在Delphi XE中通过名称获取类类型引用?

    我实际上正在尝试使用 Rtti 来实现通用方法调用程序 它应该像这样工作 我将提供类名 方法名和参数 调用者将通过调用此类的指定方法来完成其工作 因此 我需要类引用才能获取其 Rtti 信息并寻找我想要调用的方法 有没有办法在不实现我想要使
  • 如何仅在调试模式下激活 ReportMemoryLeaksOnShutdown?

    我需要激活ReportMemoryLeaksOnShutdown报告应用程序内存泄漏的功能 但仅限于调试模式 当 Delphi IDE 运行时 我怎样才能做到这一点 如果您的意思是使用调试构建配置 D2007 编译的 调试模式 则您将定义
  • Delphi线程死锁

    我有时会在销毁某些线程时遇到死锁问题 我尝试过调试该问题 但在 IDE 中调试时似乎从未存在死锁 可能是因为 IDE 中的事件速度较低 问题 当应用程序启动时 主线程会创建多个线程 线程始终处于活动状态并与主线程同步 完全没有问题 当应用程
  • 如何在滚动框上创建缓慢的滚动效果?

    我喜欢在滚动框中平移图像后创建平滑的减慢滚动效果 就像平移地图一样谷歌地图 http maps google com 我不确定它是什么类型 但行为完全相同 当快速移动地图时 当您释放鼠标时它不会立即停止 而是开始减慢速度 有什么想法 组件
  • Delphi - 在修复 VCL 错误时,单元 x 是用不同版本的 x 编译的

    我正在使用 Delphi XE6 并在我的项目中使用 Datasnap 和 JSON 我想纠正 VCL 单元 System JSON pas 在 TJSONString ToString 函数中 中的一个错误 它应该转义反斜杠字符和引号 为
  • 如何将 REST API 与 FireMonkey 结合使用?

    我需要在 FireMonkey 中实现 REST API 来获取一些信息 但我不确定如何做到这一点 REST API使用OAuth2 我可以访问两个代码 Consumer Key和Consumer Secret 之后 我需要获得一个临时的
  • Delphi 返回 TList 时出错

    我做了一个非常简单的应用程序 但我有一个我真的无法理解的问题 看一下这个基本代码 unit Unit1 interface uses Winapi Windows Winapi Messages System SysUtils System
  • 以编程方式重新启动 Delphi 应用程序

    应该不可能运行我的应用程序的多个实例 因此项目源码包含 CreateMutex nil False PChar ID if GetLastError ERROR ALREADY EXISTS then Halt 现在我想以编程方式重新启动我
  • 为什么未初始化的指针会导致内存访问冲突接近 0?

    据说often 但并非总是如此 当你在接近于零的内存位置 比如 89 美元 获得 AV 时 你就有了一个未初始化的指针 但我也在 Delphi 书籍中看到了这一点 嗯 或者它们都是由同一作者写的 Update 引自 Bob Swart 等人
  • 当responseText包含有效的Xml时,IXMLHttpRequest.responseXml为空,没有解析错误

    我正在从中获取一些 XML政府网站 http www bankofcanada ca stats assets rates rss noon en all xml http www bankofcanada ca stats assets
  • 在 Delphi 中使用 XML(将特定数据返回到变量)

    过去几天我一直在尝试使用 Delphi 2010 和 MSXML 我是一个极端的新手 需要一点指导 var MemoryStream TMemoryStream XMLPath String sName String XMLDoc vari
  • 每次 TDbGrid 的选定位置更改时都会触发什么事件?

    我的项目中有一个 TDbGrid 每次更改所选行时我都试图触发一个事件 行中的任何更改都已经更新了链接到同一数据源的所有数据感知控件 但还需要进行其他更改 我需要一个事件处理程序 我认为 OnColEnter 会起作用 根据帮助文件 它在以
  • 将数据从一个数据集结构移动到另一个数据集结构的更快方法(在 TDatasetProvider 中)

    我有一个自定义的 TDatasetProvider 它允许为其提供的任何数据创建新字段 因此 假设您在原始数据集上获得了以下字段 客户ID Name Age 您需要使用显示位图在 DBGrid 上选择它 好吧 你可以 因为我的 DSP 可以
  • TObjectList.Contains 导致 Delphi 2009 中的访问冲突

    在 Delphi 2009 中 到目前为止 我在泛型方面没有遇到大问题 使用 Generics Collections 列表 没有特殊的泛型功能 现在我发现这段代码会在访问的行中导致AVMyList Contains 如果我声明 TMyLi

随机推荐