чтение 2 строк из IniFile - PullRequest
       27

чтение 2 строк из IniFile

4 голосов
/ 24 февраля 2011

Попытка еще раз.По совету, добавив кусок кода, который я понимаю.Я согласен с тем фактом, что мне нужно сохранить 4 бита информации в две строки, например:

IniFile.WriteString('TestSection','Name','Country');
IniFile.WriteString('TestSection','City','Street');

Мой вопрос больше касается загрузки этой информации обратно в форму.Если в моем IniFile я сохранил, например, следующий код

[TestSection]
John=Uk
London=barlystreet
Mike=Spain
Madrid=eduardostrata
Emma=USA
New York=1st Avenue

Составленная информация в IniFile.Добавлено через код выше.Теперь мой вопрос: как я могу загрузить, например, когда я набираю в поле для редактирования Майка, остальная информация о принадлежности (Испания, Мадрид, eduardostrata).

Ответы [ 3 ]

15 голосов
/ 24 февраля 2011

Это не то, как работает файл INI.Вы сохраняете name=value пар и должны иметь способ связать их.

Может быть, это поможет вам начать:

Ini := TIniFile.Create(YourIniFileName);
try
  Ini.WriteString('Mike', 'Country', 'Spain');
  Ini.WriteString('Mike', 'City', 'Madrid');
  Ini.WriteString('Mike', 'Street', 'EduardoStrata');
finally
  Ini.Free;
end;

Результаты в вашем INI-файле содержат:

[Mike]
Country=Spain
City=Madrid
Street=EduardoStrata

Чтобы загрузить обратно:

var
  Country, City, Street: string;
  Ini: TIniFile;
begin
  Ini := TIniFile.Create(YourIniFilename);
  try
    Country := Ini.ReadString('Mike', 'Country', '<None>');
    City := Ini.ReadString('Mike', 'City', '<None>');
    Street := Ini.ReadString('Mike', 'Street', '<None>');
  finally
    Ini.Free;
  end;
  // Country, City, and Street now equal the values for 'Mike',
  // or they contain '<None>' if the section 'Mike' doesn't
  // exist or has no values for the variable.
end;

Так что вы, вероятно, сможете выяснить, как это работает.Раздел (часть в []) - это имя человека, а пары имя / значение - это местоположение и соответствующее ему значение (например, «Страна = Испания»).

3 голосов
/ 24 февраля 2011

Вы явно не поняли, как работают файлы INI.Что если Джон и Дейв живут в Нью-Йорке?В файле INI не может быть двух ключей с одинаковым именем.(Кроме того, вы не должны полагаться на порядок строк в каждом разделе.)

Таким образом, вам необходимо переосмыслить способ сохранения ваших данных.Очень простое решение - использовать простой текстовый файл, в котором каждая строка является элементом в вашей базе данных, а поля разделены, например, вертикальной линией (|):

John|Uk|London|barlystreet
Mike|Spain|Madrid|eduardostrata
Emma|USA|New York|1st Avenue.

Какчитать этот файл?Ну, это тривиально, и вы должны знать, как это сделать.Если у вас есть очень специфический вопрос, то не стесняйтесь спрашивать.

Для чего нужны INI-файлы

Но для чего тогда INI-файлы?Что ж, типичное применение INI-файла - сохранение настроек программы.Например, когда вы выходите из текстового редактора, он может сохранить настройки в settings.ini:

[Font]
Name=Consolas
Size=10

[Behaviour]
AutoIndent=1
AutoReplace=1
AutoBrackets=1
BracketHighlight=1
SyntaxHighlight=1

[Window]
Width=800
Height=600
Maximized=0

и т. Д.Это делается

WriteString('Font', 'Name', Editor.Font.Name);
WriteInteger('Font', 'Size', Editor.Font.Size);

и т. Д.И при следующем запуске приложения оно прочитает файл для восстановления настроек:

Editor.Font.Name := ReadString('Font', 'Name', 'Consolas');
Editor.Font.Size := ReadInteger('Font', 'Size', 10);

и т. Д., Где последние параметры являются значениями по умолчанию (в случае, если поле отсутствует в INIфайл).Обратите внимание, что в каждом разделе ключи уникальны (и должны быть), и что нас не волнует относительный порядок ключей внутри каждого раздела.

2 голосов
/ 24 февраля 2011

Самый простой способ создать желаемую связь - разместить все данные пользователя в одной строке текста. Это не работа для файлов INI. Ваша проблема в том, как разобрать строки.

Прежде всего, зачем вам нужно сохранять «повторный пароль»? это не имеет смысла для меня. Обычно пользовательский интерфейс запрашивает у пользователя повторение пароля в качестве формы проверки, но это все, для чего это хорошо. Там нет никакого смысла хранить его для последующего поиска там.

Я думаю, вам нужно сохранить имя пользователя, фамилию и пароль пользователя (3 строки). Посмотрите на следующий фрагмент кода.

procedure SaveUserDetails(sFileName: string);
var
  sFirstName, sLastName, sPassword: string;
  slUsers: TStringList;
begin
  sFirstName := txtFirstName.Text;  // these could be from TEdit controls for example
  sLastName := txtLastName.Text;
  sPassword := txtPassword.Text;
  slUsers := TStringList.Create;
  slUsers.Add(sFirstName + ',' + sLastName + ',' + sPassword);
  slUsers.SaveToFile(sFileName);  // that has saved your stringlist to a file
  slUsers.Free;
end;

Файл будет выглядеть так

Shane,Warne,cricket

Теперь, как его загрузить ...

procedure LoadUserDetails(sFileName: string);
var
  sFirstName, sLastName, sPassword: string;
  sTemp: string;
  slUsers: TStringList;
  iPos: integer;  // string position marker we'll use to split the string in 3
begin
  slUsers := TStringList.Create;
  slUsers.LoadFromFile(sFileName); // this loads the file's contents into stringlist
  sTemp := slUsers[0];
  if (Length(sTemp) > 0) then // just to check that there is data there
  begin
    iPos := pos(',', sTemp); // get position of first comma (our "delimiter")
    sFirstName := Copy(sTemp, 0, iPos-1);  // firstName everything upto 1st comma
    sTemp := Copy(sTemp, iPos + 1, Length(sTemp)); // chop off bit we just read
    iPos := pos(',', sTemp); // get position of second comma
    sLastName := Copy(sTemp, 0, iPos-1);  // LastName everything upto 2nd comma
    sTemp := Copy(sTemp, iPos + 1, Length(sTemp)); // chop off bit we just read
    sPassword := sTemp; // that's it
  end;
  slUsers.Free;
end;

Сейчас ... это далеко не "хороший код", но теперь вы знаете, по крайней мере, 1 способ сделать свое дело. Надеюсь, это поможет.

...