如何保存到INI文件delphi

时间:2017-03-17 09:51:41

标签: file delphi save ini

我有按钮,点击时将其标题存储在TStringList

ChairList : TStringList;

procedure TForm1.FormCreate(Sender: TObject);
begin
ChairList := TStringList.Create;
end;

一个按钮的示例是:

procedure TForm1.Table17Click(Sender: TObject);
begin
Label1.Visible := false;
if (BottomPanel.Visible = false) then
begin
  Label1.Visible := true;

  LastClicked := 'Table 17';
  ChairList.Add(LastClicked);

但是当我读到文件时,我得不到任何结果。我使用ShowMessage测试了它,看看是否有任何内容会被读取,我只是得到一个空白ShowMessage

以下代码是保存程序:

Procedure TForm1.SaveToFile(Const Filename : String);
Var
INI : TMemIniFile;

Procedure SaveReserve();
var
section : String;

Begin
  Section := 'Table';
  ini.writeString(Section, 'LastClickedID', LastClicked);
End;

begin
Ini := Tmeminifile.Create(filename);
ini.Clear;
try
SaveReserve();
Ini.UpdateFile;
finally
Ini.Free;
end;
end;

然后下一个过程是加载文件:

Procedure TForm1.LoadFile(const Filename : String);
var
INI : TMemInifile;
Sections : TStringList;
i : Integer;
LastClickedID : String;
Procedure LoadChair(Const Section: String);
Begin
  LastClickedID := INI.ReadString(Section, 'LastClickedID', LastClicked)
End;

Begin
ChairList.Clear;

INI := TMEMINIFILE.Create(Filename);
 Try
 Sections := TStringList.Create;
 Try
   Ini.ReadSections(Sections);
   for i := 0 to (Sections.Count - 1) do
   Begin
     if startstext('LastClickedID', Sections[I]) then
      begin
        LastClickedID := (copy(Sections[I], 12, MaxInt));

      end;
   End;
 Finally
  Sections.Free;
 End;
 Finally
 INI.Free;
end;
ShowTable(LastClickedID);
end;

ShowTable(LastClickedID); is just the part where i test it

如何制作它以便保存标题然后当我加载它时会显示保存的任何表格标题? 我只需要它来保存所选对象的标题。当用户选择一个按钮时,它会将字幕添加到stringlist中,然后将其读入ini文件

4 个答案:

答案 0 :(得分:2)

试试这段代码! 写入ini的程序:

procedure write_ini;
var
  ini:TIniFile;
begin
  ini:=TIniFile.Create('MainForm.ini');
  ini.WriteInteger('FORM', 'Top', MainForm.Top);
  ini.WriteInteger('FORM', 'Left', MainForm.Left);
  ini.WriteInteger('FORM', 'Width', MainForm.Width);
  ini.WriteInteger('FORM', 'Height', MainForm.Height);
  ini.WriteString('USER', 'Name', MainForm.userName.Text);
  ini.WriteInteger('USER','Pol', MainForm.Combo.ItemIndex);
  ini.Free;
end;

阅读ini的程序:

 procedure read_ini;
    var
     ini:TIniFile;
    begin
      ini:=TiniFile.Create('MainForm.ini');
      MainForm.Top:=ini.ReadInteger('FORM', 'Top', 0);
      MainForm.Left:=ini.ReadInteger('FORM', 'Left', 0);
      MainForm.Width:=ini.ReadInteger('FORM', 'Width', 226);
      MainForm.Height:=ini.ReadInteger('FORM', 'Height', 123);
      MainForm.userName.Text:=ini.ReadString('USER', 'Name', 'Anonim');
      MainForm.Combo.ItemIndex:=ini.ReadInteger('USER', 'Pol', 1);
      ini.Free;
    end;

答案 1 :(得分:1)

您的代码无法加载该值,因为您试图从INI文件的错误区域读取它。

您正在将值写入'LastClickedID'部分的'Table'条目,该条目会生成此INI数据:

[Table]
LastClickedID=Value

但是,您尝试读取以'LastClickedID'前缀开头的任何部分的'LastClickedID'条目中的值,而不是您之前写入的'Table'部分。只有当INI数据看起来更像是这样时,这才有效:

[LastClickedID]
LastClickedID=Value

由于INI中不存在该部分,因此您的LastClickedID变量始终为空(如果LastClicked开头也是空白的话)。

在此示例中,您不需要使用Ini.ReadSections()。只需使用Ini.ReadString()本身使用正确的'Table'部分名称,例如:

procedure TForm1.LoadFile(const Filename : String);
var
  Ini : TMemIniFile;
  LastClickedID: string;

  procedure LoadReserve;
  var
    section : String;
  begin
    Section := 'Table';
    LastClickedID := Ini.ReadString(Section, 'LastClickedID', LastClicked);
  end;

begin
  Ini := TMemIniFile.Create(Filename);
  try
    LoadReserve;
  finally
    Ini.Free;
  end;

  ShowTable(LastClickedID);
end;

一般情况下,您应该反映出SaveToFile()代码正在执行的操作。

答案 2 :(得分:0)

我建议您阅读本文档和示例to use TMemIniFile and TIniFile。它应该有用......

这是我的代码:

Procedure TForm1.SaveToFile(Const Filename : String);
Var
  Ini : TIniFile;    
begin
  Ini := TIniFile.Create(filename);      
  try
    Ini.WriteString('Table', 'LastClickedID', LastClicked);
  finally
    Ini.Free;
  end;
end;

Procedure TForm1.LoadFile(const Filename : String);
var
  Ini : TInifile;
  LastClickedID : String;    
begin    
  Ini := TIniFile.Create(Filename);
  try
    LastClickedID := Ini.ReadString('Table', 'LastClickedID', '');
  finally
    Ini.Free;
  end;
  ShowTable(LastClickedID);
end;

答案 3 :(得分:0)

您可以创建一个通用的ini文件实用程序对象,它可以在预定义的键下读取/写入由字典对象收集的属性。这是一种灵活,可重复使用的解决方案。 您可以将单击的控件标题收集到字典中,并在过程结束时保存列表。您应该使用字典,因为ini文件操作需要键/值对。

uses
    Generics.Collections
  , System.IniFiles
  ;

TIniFileUtility = class
  public
    class read( ini_ : TIniFile; keyName_ : string; props_ : TDictionary<string,string> );
    class write( ini_ : TIniFile; keyName_ : string; props_ : TDictionary<string,string> );
end;



class procedure TIniFileUtility.write( ini_ : TIniFile; keyName_ : string; props_ : TDictionary<string,string>);
var
  i : integer;
  key, value : string;
begin
  //... some input parameter checking
    for key in props_.keys do
    begin
      value := props_.Items[key];
      ini_.writeString( keyName_, key, value );
    end;
end;

procedure caller(Sender: TObject);
var
  ini : TIniFile;
  props : TDictionary<string,string>;
begin
  ini := TIniFile.create( 'c:\temp\defaults.ini' );
  try
    props := TDictionary<string,string>.Create;
    try
      props.Add( 'key1', 'stringValue' );
      props.Add( 'key2', intToStr( 2 ) );
      TIniFileUtility.write( ini, '\x\y\z\', props );
    finally
      props.Free;
      props := NIL;
    end;
  finally
    ini.Free;
    ini := NIL;
  end;
end;