написание и чтение файлов заказано - PullRequest
0 голосов
/ 11 марта 2011

Я хочу знать, как я могу написать Inifile, чтобы я мог читать из него по порядку.

Прежде всего, пишу это: допустим, у меня есть 2 строки, которые я хочу сохранить (имя и фамилия).

Это кнопка.Таким образом, на него будут нажимать каждый раз:

Ini.WriteString(person1, 'Name', Name.text);
Ini.WriteString(person1, 'Lastname', Lastname.text);

Как я могу сделать этого человека1, изменять каждый раз, когда добавляется новый человек.так в следующий раз person2, person3 и т. д. Как это возможно?Должен ли я смотреть на то, что сказал предыдущий?или это можно вспомнить?Может быть, если я это понимаю, чтение из файла пойдет в том же духе.

С уважением и благодарностью

Ответы [ 3 ]

5 голосов
/ 11 марта 2011

Полагаю, вы хотите хранить n элементов данных в INI-файле. Я делаю это все время - это легко. Во-первых, сохранение тривиально, но, конечно, точная процедура зависит от того, откуда вы получаете данные. Например, если у вас есть два массива строк (назовем их FirstNames и LastNames), вы просто делаете

for i := 0 to high(FirstNames) do
begin
  IniFile.WriteString('Names', 'FirstName' + IntToStr(i), FirstNames[i]);
  IniFile.WriteString('Names', 'LastName' + IntToStr(i), LastNames[i]);
end;

Чтобы прочитать (неизвестное количество элементов), сделайте что-то вроде

for i := 0 to MaxInt do
  if ValueExists('Names', 'FirstName' + IntToStr(i)) then
    // Do something with ReadString('Names', 'FirstName' + IntToStr(i))
    // and ReadString('Names', 'LastName' + IntToStr(i))
  else
    break;

Обратите внимание, что 'Names' - произвольное имя раздела в файле INI, в котором вы храните данные.

Обновление

Если вы просто хотите сохранить элементы при нажатии кнопки, почему бы не сделать

private
  { Private declarations }
  n: integer;

и

procedure TForm1.FormCreate(Sender: TObject);
begin
  n := 0;
end;

, а затем

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TIniFile.Create('myfile.ini') do
    try
      WriteString('Names', 'FirstName' + IntToStr(n), Edit1.Text);
      WriteString('Names', 'LastName' + IntToStr(n), Edit2.Text);
      inc(n);
    finally
      Free;
    end;
end;

Если вместо этого вы предпочитаете иметь раздел для элемента, выполните

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TIniFile.Create('myfile.ini') do
    try
      WriteString('Name' + IntToStr(n), 'FirstName', Edit1.Text);
      WriteString('Name' + IntToStr(n), 'LastName', Edit2.Text);
      inc(n);
    finally
      Free;
    end;
end;

вместо.

3 голосов
/ 11 марта 2011

Чтобы получать последовательную нумерацию разделов каждый раз, когда вы сохраняете человека, вам нужно прочитать все имена разделов, определить наибольшее число, увеличить его, а затем использовать его для записи нового раздела с этим именем и значениями нового человека..

Что-то вроде:

var
  IniFile: TIniFile;
  SL: TStringList;
  i: Integer;
  Highest: Integer;
begin
  IniFile := TIniFile.Create('MyIni.ini');
  try
    SL := TStringList.Create;
    try
      IniFile.ReadSections(SL);
      Highest := 0;
      for i := 0 to SL.Count - 1 do begin
        Highest := Max(Highest, StrToIntDef(Copy(SL[i], Length('Person'), MAXINT), 0));
      end;

      IniFile.WriteString('Person' + IntToStr(Highest), 'Name', Name.Text);
      IniFile.WriteString('Person' + IntToStr(Highest), 'LastName', LastName.Text);

    finally
      SL.Free;
    end;

  finally
    IniFile.Free;
  end;

end;
0 голосов
/ 12 марта 2011

Я подозреваю, что использование INI-файла для этого - неправильный путь. Ини файлы не предназначены для хранения вещей в порядке. Самый простой способ добиться этого - использовать TStringList, сохранить и загрузить его на диск.

...