Ini Files - Read Multi Lines?

后端 未结 8 2193
旧巷少年郎
旧巷少年郎 2020-12-16 03:40

I am aware that Ini Files are meant for single lines of information, needless to say I am trying to read/write multi lines to and from the Ini - without much success (I alwa

相关标签:
8条回答
  • 2020-12-16 04:21

    You're not using a valid .ini format, so it's not going to be easy. It's much easier if you use a properly formed .ini file.

    A valid ini file is of the format

    [section]
    akey=value
    bkey=value
    ckey=value
    

    Here's a sample of reading multiple lines from an ini file. While it uses a TListBox instead of a TEdit, it should be enough to get you started.

    The code below will work with an improperly formatted file as well, but you'll probably have to change the code in the ListBox1Click event to use ReadSectionValues instead and do some manual parsing for each item before displaying them; in that case, create another TStringList in the event handler and pass it instead of Memo1.Lines.

    With a properly formatted ini file, you can use TIniFile.ReadSection or TMemIniFile.ReadSections to load all of the sections into a TStrings descendant, and then use ReadSection(SectionName) to get each section's values.

    Here's an example - save this ini file somewhere (I've used d:\temp\sample.ini:

    [A Section]
    Item1=Item A1
    Item2=Item A2
    Item3=Item A3
    Item4=Item A4
    
    [B Section]
    Item1=Item B1
    Item2=Item B2
    Item3=Item B3
    Item4=Item B4
    
    [C Section]
    Item1=Item C1
    Item2=Item C2
    Item3=Item C3
    Item4=Item C4
    

    Here's a sample of the form's code:

    unit Unit2;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IniFiles;
    
    type
      TForm2 = class(TForm)
        ListBox1: TListBox;
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure ListBox1Click(Sender: TObject);
      private
        { Private declarations }
        FIni: TMemIniFile;
      public
        { Public declarations }
      end;
    
    var
      Form2: TForm2;
    
    implementation
    
    {$R *.dfm}
    
    const
      IniName = 'd:\Temp\Sample.ini';
    
    
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      FIni.Free;
    end;
    
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      FIni := TMemIniFile.Create(IniName);
      Memo1.Lines.Clear;
      FIni.ReadSections(ListBox1.Items);
    end;
    
    procedure TForm2.ListBox1Click(Sender: TObject);
    var
      Section: string;
    begin
      if ListBox1.ItemIndex > -1 then
      begin
        Section := ListBox1.Items[ListBox1.ItemIndex];
        FIni.ReadSection(Section, Memo1.Lines);
      end;
    end;
    
    end.
    

    Clicking on each section name in the ListBox displays the items that are in that section, as seen below:

    Application Screen Capture

    EDIT: OK. I got curious to see how it would work with the ini file content you posted in your question.

    So I made the following change:

    • Copied and pasted your sample ini content verbatim as a new section to the end of the Sample.ini I created above.

    Ran the code, and clicked the new richardmarx item. Here's what I got:

    Sample image 2

    Obviously, that wouldn't work. So I made the following additional changes:

    • Changed the ListBox1Click event to use FIni.ReadSectionValues instead of ReadSection.
    • Ran the modified application, and clicked on the C Section item to see how it displayed, and then the new richardmarx item to see how it displayed. The results are as follows:

    Image with C Section selectedImage with richardmarx selected

    0 讨论(0)
  • 2020-12-16 04:22

    I wanted something similar, to include the body of an automated email in the ini file.
    But I also wanted blank lines in the body. Here is part of the ini file

    [EmailBody]
    This is the weekly Survey Status notification email.
    .
    It lists Survey Reports that may need some attention.
    .
    The purpose of this information is to improve conduct-of-operations in our tracking, 
    recordkeeping, and maintenance of Survey Reports.  This report will also enable 
    us to identify any changes made to electronic Surveys following the normal QA review.
    .
    Please review your information weekly and determine if you need to take corrective action.
    

    Here is what I ended up doing

    var
      Config: TMemIniFile;
      sl: TStringList;
    ...
      sl := TStringList.Create;
      Config.ReadSectionValues('EmailBody', sl);
      for i := 0 to sl.Count - 1 do
        if sl[i] = '.' then
          sl[i] := '';
    
    0 讨论(0)
提交回复
热议问题