Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2021, 22:00   #1
missfortune
Новичок
Джуниор
 
Регистрация: 29.01.2021
Сообщений: 2
По умолчанию Работа с ini файлами

Delphi
Как сделать,чтобы в ини файл записывалась каждая регистрация?
Моя ошибка в том,что я записываю все в одну строку. Как это исправить?
С изменением регистрации скорее всего сломается авторизация. Помогите написать код,чтобы все работало. Уже 3 день мучаюсь
Код:
procedure TForm2.Button1Click(Sender: TObject); //рег
begin
Ini:=TIniFile.Create('F:\лабы прога\prak\logpa\MyIni.ini');
if (Edit1.Text='') or (edit2.Text='') then Showmessage('Введите значения')
else
Ini.WriteString('Регистрация1','Логин', Edit1.Text);
Ini.WriteString('Регистрация1','Пароль', Edit2.Text);
Button2.Enabled:=true;
end;

procedure TForm2.Button2Click(Sender: TObject);  //вход
begin
if (Edit1.Text=Ini.ReadString('Регистрация','Логин', Edit1.Text)) and (edit2.Text=Ini.ReadString('Регистрация','Пароль', Edit2.Text)) then
ShowMessage('Вход выполнен!')
else ShowMessage('Логин или пароль введен неверно!');
end;

Последний раз редактировалось missfortune; 30.01.2021 в 09:02.
missfortune вне форума Ответить с цитированием
Старый 29.01.2021, 22:27   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Добавить поле, в котором хранится количество регистраций. Сначала его считывать, а потом уже записывать новую регистрацию в секцию "Регистрация" + IntToStr(count) и новое количество регистраций. В процедуру проверки добавить цикл, который будет проверять введенные данные по всем регистрациям.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.01.2021, 23:39   #3
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Уточните, пож-та, ТЗ
Цитата:
... сделать,чтобы в ини файл записывалась каждая регистрация?
Можно понять так: где-то просто фиксировать всех зарегистрированных, при регистрации нового Логина-Пароля старый затирается этим новым. Естественно, "старый" Логин-пароль исчезает и осуществить вход со "старыми" данными становится невозможно. Тогда - просто копирование данных в какой-нибудь файл. По порядку...

Можно понять так: Логин-пароль добавляется, старый сохраняется. При вводе "старого" логина-пароля он проверяется на корректность, если корректен - пользователь со "старым" Логином-паролем допускается к работе. Тогда, для работы с *ini-файлом его вначале надо подготовить: дополнить секциями [Регистрация1], [Регистрация2], [Регистрация3], и т.д. сколько нужно. Добавить секцию [количество регистраций]. И воспользоваться советом ув. BDA.

Что Вы хотите в вашей программе?

Последний раз редактировалось Viktor61; 29.01.2021 в 23:43. Причина: Слетела кодировка
Viktor61 вне форума Ответить с цитированием
Старый 30.01.2021, 09:07   #4
missfortune
Новичок
Джуниор
 
Регистрация: 29.01.2021
Сообщений: 2
По умолчанию

2 вариант.
При регистрации сохранялись в ини файл данные
[Регистрация 1]
Логин=..
Пароль=..
[Регистрация 2]
Логин =..
Пароль=..
и тд.
И не затирались.
А проверка могла осуществляться по этим регистрациям
missfortune вне форума Ответить с цитированием
Старый 31.01.2021, 23:15   #5
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

1). Строка в коде, мне представляется возможным источником ошибок:
Цитата:
Сообщение от missfortune Посмотреть сообщение
if (Edit1.Text=Ini.ReadString('Регистр ация','Логин', Edit1.Text)) and (edit2.Text=Ini.ReadString('Регистр ация','Пароль', Edit2.Text)) then
Edit1.Text (как и Edit2.Text)- в Ini.ReadString('Регистрация','Логин ', Edit1.Text) значения по умолчанию и, если в секции [Регистрация] не найдется ничего, то будет edit1.Text =Edit1.Text (edit2.Text =Edit2.Text) и, соответственно вход разрешен. Также надо при сравнении удалить пробелы слева и справа (Трим(Edit1.Text) и т.п.).

2) По сути 2-го варианта (Для проверки Логина-Пароля):
В *.ini добавить секцию [количество] и параметр Count, в программу var Count: integer.
Считать из *.ini Count := Ini.ReadInteger('количество', Count, 0);
В цикле
Код:
var  sTmp: string;  
 i, k: integer;
 for i := 1 to Count do begin
 sTmp :=  Ini.ReadString('Регистрация'+IntToStr(count),'Логин', Edit1.Text);
  //считывать из *.ini Логин и сравнивать с введенным пользователем.
 k := i;
 if TRIM(Edit1.Text) =  sTmp then break;
 end;
//если не найден пользователь с введенным в edit1.Text Логином, то его не надо допускать к работе.
Если же пользователь с таким Логином имеется, то, зная секцию этого пользователя, равную 'Регистрация'+IntToStr(k ), можно сразу считать Пароль и сравнить c введенным пользователем edit2.Text.
Код не проверял, но надеюсь, что он сработает. Успехов!

Последний раз редактировалось Viktor61; 31.01.2021 в 23:32. Причина: Слетела кодировка
Viktor61 вне форума Ответить с цитированием
Старый 01.02.2021, 03:54   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Небольшие дополнения: если считать, что ни логин, ни пароль не могут быть пустыми строками, то значение по умолчанию лучше взять ''; делать trim, мне кажется, не следует - пусть пользователь сам верно вводит свои логин-пароль, но надо иметь ввиду, что в ini-файл данные добавятся без пробелов в начале и конце (точнее, в файле пробелы в конце есть, но при считывании отбрасываются); нужно подумать, как обрабатывать одинаковые логины при сохранении данных регистрации и их проверке.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 01.02.2021, 10:22   #7
Viktor61
Пользователь
 
Регистрация: 05.05.2018
Сообщений: 92
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
одинаковые логины при сохранении данных регистрации и их проверке.
Однозначно - при вводе нового Логина надо организовать проверку на наличие Логина с Логином, который пытается ввести пользователь. Это - общепринятая практика: например, при регистрации на каком-либо сайте в такой ситуации вываливается окошко, что такой-то Логин уже занят и предлагается ввести другой.
По сути всей затеи хранить Логины-Пароли в *.ini: так себе идея. Файл *.ini хранится в незашифрованном виде, возможен для редактирования любым текстовым редактором... Лучше для таких целей подойдет какая-нибудь таблица БД, поддерживающая шифрование. Впрочем, предполагаю, что у задавшего вопрос missfortune цель больше учебно-тренировочная, чем практическая.
Viktor61 вне форума Ответить с цитированием
Старый 02.02.2021, 12:26   #8
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Может подобные операции лучше хранить в зашифрованном XML? INI для подобных целей крайне плохо подходит. Все это шифрование так себе защите, но по крайней мере данные не хранятся открыто.
Вот так закодируйте:
Код:
function EncodeText(AKey, AText: string): string;
var
  i,pl,AInc: Integer;
  AVl: Integer;
begin
  Result := '';
  pl := Length(AKey);
  if pl = 0 then Exit;
  if Length(AText) = 0 then
  Exit;
  AInc := 1;
  for i := 1 to Length(AText) do
  begin
    AVl := ord(AText[i]) - Ord(AKey[AInc]);
    Inc(AInc);
    if AInc > pl then
    AInc := 1;
    Result := Result + IntToStr(AVl) + ';';
  end;
  for I := 1 to Length(Result) do
  Result[i] := Chr(ord(Result[i]) + pl);
end;
Вот так декодируйте:
Код:
function DecodeText(AKey, AText: string): string;
var
  i,pl,AInc: Integer;
  APos: Integer;
  ATh: string;
begin
  Result := '';
  pl := Length(AKey);
  if pl = 0 then Exit;
  if Length(AText) = 0 then
  Exit;
  for I := 1 to Length(AText) do
  AText[i] := Chr(ord(AText[i]) - pl);
  ATh := '';
  APos := Pos(';',AText);
  AInc := 1;
  try
    while APos <> 0 do
    begin
      ATh := Copy(AText,1,APos - 1);
      Delete(AText,1,Length(ATh) + 1);
      APos := Pos(';',AText);
      Result := Result + Chr(ord(StrToInt(ATh)) + Ord(AKey[AInc]));
      Inc(AInc);
      if AInc > pl then
      AInc := 1;
    end;
  except
    Result := '';
  end;
end;
Метод кодирования по ключу.
Пишу много и развернуто

Последний раз редактировалось Heneken87; 02.02.2021 в 12:33.
Heneken87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами *.ini C# trish145 C# (си шарп) 1 05.05.2015 17:32
Работа с ini файлами avd Общие вопросы Delphi 8 04.02.2011 14:36
Работа с ini файлами jocry Общие вопросы Delphi 4 14.01.2009 16:51
работа с INI файлами Titan123 Общие вопросы Delphi 1 30.08.2008 16:31
работа с .ini файлами PAVEL315 Общие вопросы Delphi 3 22.11.2006 22:28