Как назначить раздел INI для записи в Delphi 7 - PullRequest
3 голосов
/ 22 июня 2011

Извините, я не ясно ... давайте попробуем еще раз

У меня есть тип записи:

MyRecord = Record
   Name: string;
   Age: integer;
   Height: integer;
   several more fields....

и файл INI с:

[PEOPLE]
Name=Maxine
Age=30
maybe one or two other key/value pairs

Все, что я хочу сделать, это загрузить запись с данными из файла INI.

У меня есть данные из INI в TStringList. Я хочу иметь возможность перебирать TStringList и назначать/ обновить только поля записи с парами ключ-значение в TStringList.

Чарльз

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

Итак, у вас есть INI-файл с содержимым

[PEOPLE]
Name=Maxine
Age=30

и вы хотите загрузить его в запись, определенную как

type
  TMyRecord = record
    Name: string;
    Age: integer;
  end;

?Это очень легко.Просто добавьте IniFiles к предложению uses вашего устройства и затем выполните

var
  MyRecord: TMyRecord;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TIniFile.Create(FileName) do
    try
      MyRecord.Name := ReadString('PEOPLE', 'Name', '');
      MyRecord.Age := ReadInteger('PEOPLE', 'Age', 0);
    finally
      Free;
    end;
end;

. Конечно, переменная MyRecord не обязательно должна быть глобальной переменной.Это также может быть локальная переменная или поле в классе.Но все зависит, конечно, от вашей конкретной ситуации.

Простое обобщение

Несколько более интересная ситуация, если ваши INI-файлы содержат несколько человек, например

[PERSON1]
Name=Andreas
Age=23

[PERSON2]
Name=David
Age=40

[PERSON3]
Name=Marjan
Age=49

...

и вы хотите загрузить его в массив TMyRecord записей, тогда вы можете сделать

var
  Records: array of TMyRecord;

procedure TForm4.FormCreate(Sender: TObject);
var
  Sections: TStringList;
  i: TIniFile;
begin
  with TIniFile.Create(FileName) do
    try
      Sections := TStringList.Create;
      try
        ReadSections(Sections);
        SetLength(Records, Sections.Count);
        for i := 0 to Sections.Count - 1 do
        begin
          Records[i].Name := ReadString(Sections[i], 'Name', '');
          Records[i].Age := ReadInteger(Sections[i], 'Age', 0);
        end;
      finally
        Sections.Free;
      end;

    finally
      Free;
    end;
end;
2 голосов
/ 22 июня 2011

Если у вас есть раздел INI в списке строк, вы можете просто использовать свойство Values[]:

Содержимое списка строк

Name=Maxine
Age=30

Код для чтения в записи

MyRecord.Name := StringList.Values['Name']
MyRecord.Age = StrToInt(StringList.Values['Age'])

Естественно, вы бы хотели обрабатывать ошибки так или иначе, но это основная идея.

...