|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Считывание и проверка строки
Имеем:
Текстовый файла, в нем данные в формате Петров Петр группа: 111 1 ФИО-Группа№ Пароль Данный фал хранит в себе данные для авторизации и сохраняет новые при регистрации. Задача: Проверить, имеются ли в файле введенные данные. Это успешно реализовано так: Код:
LogAndGruppa_Regis:=Register_Familiya.Text+' группа: '+Register_Gruppa.Text+' '+Register_Password.Text; for iterIntCount:=0 to SaveTxt1.Count -1 do begin if LogAndGruppa_Regis = SaveTxt1[iterIntCount] then begin Application.MessageBox('Вы уже зарегистрированы!'+#13#10+'Вы можете авторизоваться!', 'Внимание!',+ MB_ICONWARNING); Exit; end end; if (Register_Familiya.Text = '') or (Register_Gruppa.Text = '') or (Register_Password.Text = '') then begin Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING); end else begin Registr_Familiya_P:=Trim(Register_Familiya.Text); Registr_Gruppa_P:=Trim(Register_Gruppa.Text); Registr_Password_P:=Trim(Register_Password.Text); SaveTxt1.Add(Register_Familiya.Text+' группа: '+Register_Gruppa.Text+' '+Register_Password.Text); SaveTxt1.Add('______________________________________________________'); SaveTxt1.Add(' '); SaveTxt1.SaveToFile(ExtractFilePath(Application.ExeName)+'lgn.tnt'); Register_Familiya.clear; Register_Gruppa.clear; Register_Password.clear; Application.MessageBox('Регистрация успешно завершена!'+#13#10+'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK); end; end; Нужно реализовать проверку по Фамилии Имени и группе, отсекая пароль. Т.е. Если в какой то строке подряд идут данные ФИО Группа и они совпадают с введенным в ЕДИТы - сказать, что юзер уже есть. Битые сутки над этим бьюсь, сил уже нет! Как можно реализовать такое в рамках данного кода? |
#2
|
||||
|
||||
Проще через TStringList разбить строку по пробелам и сравнить элементы.
Код:
sl.Delimiter := ' '; sl.DelimitedText := S; if (Register_Familiya.Text = sl[0]) and (Register_Gruppa.Text = sl[3]) then { зарегистрирован }; lmikle: Bargest, скобАчки не забывай jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 08.05.2017 в 19:59. |
#3
|
|||
|
|||
Можно еще примерно так:
Код:
if Pos(AnsiUpperCase(Register_Familiya.Text + ' группа: ' + Register_Gruppa.Text),AnsiUpperCase(S)) > 0 Then {зарегистрирован} ЗЫ. А вообще, хранить такие данные в текстовом файле как-то не айс. Либо нужно делать бинарный файл, либо БД, либо текстовый, но немного другого формата. Ну и пароль хранить в открытом виде - явный моветон |
#4
|
|||
|
|||
lmikle, я не могу сообразить, как это воткнуть в текущую конструкцию кода?
Я так понимаю, что S -это строка с данными, но ведь ее номер заранее неизвестен.. |
#5
|
|||
|
|||
S - это строка из файла. Тебе надо проверить все строки в файле.
Смысл кода - просто формируется частитчная строка тем же способом, что и для записи в файл (кроме пароля) и просто в каждой строке из файла ищется - не входит ли эта строка как подстрока. Если да, то такой пользователь уже есть. Ну и сделано, что бы искала без учета регистра, но это так, на всякий случай. |
#6
|
|||
|
|||
lmikle, я совсем новичок в этом деле..
Код:
procedure TFORM_LOGIN.Register_ButtonClick(Sender: TObject); var S:string; begin Load_From_File_Passw:=TStringList.Create; Load_From_File_Passw.LoadFromFile(ExtractFilePath(Application.ExeName)+'lgn.tnt'); LogAndGruppa_Regis:=Register_Familiya.Text+' группа: '+Register_Gruppa.Text+' '+Register_Password.Text; for iterIntCount:=0 to Load_From_File_Passw.Count -1 do begin if Pos(AnsiUpperCase(Register_Familiya.Text + ' группа: ' + Register_Gruppa.Text),AnsiUpperCase(S)) > 0 Then begin Application.MessageBox('Вы уже зарегистрированы!'+#13#10+'Вы можете авторизоваться!', 'Внимание!',+ MB_ICONWARNING); Login_Familiya.Text:= Register_Familiya.text; Login_Gruppa.Text:= Register_Gruppa.text; Register_Familiya.clear; Register_Gruppa.clear; Register_Password.clear; Exit; end end; if (Register_Familiya.Text = '') or (Register_Gruppa.Text = '') or (Register_Password.Text = '') then begin Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING); end else begin Registr_Familiya_P:=Trim(Register_Familiya.Text); Registr_Gruppa_P:=Trim(Register_Gruppa.Text); Registr_Password_P:=Trim(Register_Password.Text); Load_From_File_Passw.Add(Register_Familiya.Text+' группа: '+Register_Gruppa.Text+' '+Register_Password.Text); Load_From_File_Passw.Add('______________________________________________________'); Load_From_File_Passw.Add(' '); Load_From_File_Passw.SaveToFile(ExtractFilePath(Application.ExeName)+'lgn.tnt'); Login_Familiya.Text:= Register_Familiya.text; Login_Gruppa.Text:= Register_Gruppa.text; Register_Familiya.clear; Register_Gruppa.clear; Register_Password.clear; Application.MessageBox('Регистрация успешно завершена!'+#13#10+'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK); end; end; |
#7
|
|||
|
|||
ну а S-то где инициализируется???
либо Код:
if Pos(AnsiUpperCase(Register_Familiya.Text + ' группа: ' + Register_Gruppa.Text),AnsiUpperCase(Load_From_File_Passw[iterIntCount])) > 0 Then Код:
S := Load_From_File_Passw[iterIntCount]; |
#8
|
|||
|
|||
lmikle, разобрался, спасибо
НО теперь он не проверяет поля (если поля пустые - должен говорить, что их необходимо заполнить, а он говорит, что уже зарегистрирован) |
#9
|
|||
|
|||
ну да. Если поля пустые, то, как ты думаешь, есть ли в файле где-то строка с подстрокой ' группа: '? Вот что-то мне подсказывает, что точно есть, если только файл не пустой.
Просто проверку пустых полей надо делать первой. |
#10
|
|||
|
|||
lmikle, если я делаю проверку первой - он проверяет нормально, но если ввожу данные, которые уже есть в документе - List index out bounds (55) - такая ошибка.
Код:
begin Load_From_File_Passw:=TStringList.Create; Load_From_File_Passw.LoadFromFile(ExtractFilePath(Application.ExeName)+'lgn.tnt'); for iterIntCount:=0 to Load_From_File_Passw.Count -1 do begin if (Register_Familiya.Text = '') or (Register_Gruppa.Text = '') or (Register_Password.Text = '') then begin Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING); Exit; end end; if Pos(AnsiUpperCase(Register_Familiya.Text + ' группа: ' + Register_Gruppa.Text),AnsiUpperCase(Load_From_File_Passw[iterIntCount])) > 0 Then begin Application.MessageBox('Вы уже зарегистрированы!'+#13#10+'Вы можете авторизоваться!', 'Внимание!',+ MB_ICONWARNING); Login_Familiya.Text:= Register_Familiya.text; Login_Gruppa.Text:= Register_Gruppa.text; Register_Familiya.clear; Register_Gruppa.clear; Register_Password.clear; end else begin Registr_Familiya_P:=Trim(Register_Familiya.Text); Registr_Gruppa_P:=Trim(Register_Gruppa.Text); Registr_Password_P:=Trim(Register_Password.Text); Load_From_File_Passw.Add(Register_Familiya.Text+' группа: '+Register_Gruppa.Text+' '+Register_Password.Text); Load_From_File_Passw.Add('______________________________________________________'); Load_From_File_Passw.Add(' '); Load_From_File_Passw.SaveToFile(ExtractFilePath(Application.ExeName)+'lgn.tnt'); Login_Familiya.Text:= Register_Familiya.text; Login_Gruppa.Text:= Register_Gruppa.text; Register_Familiya.clear; Register_Gruppa.clear; Register_Password.clear; Application.MessageBox('Регистрация успешно завершена!'+#13#10+'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK); end; end; |
#11
|
||||
|
||||
Код:
var iterIntCount: integer; Load_From_File_Passw: TStrings; flg: boolean; begin if (Register_Familiya.Text = '') or (Register_Gruppa.Text = '') or (Register_Password.Text = '') then begin Application.MessageBox('Вход невозможен!' + #13#10 + 'Заполните все поля', 'Внимание!', + MB_ICONWARNING); Exit; end; Load_From_File_Passw:= TStringList.Create; try Load_From_File_Passw.LoadFromFile( ExtractFilePath(Application.ExeName)+'lgn.tnt'); flg:= false; for iterIntCount:= 0 to Load_From_File_Passw.Count-1 do if Pos(AnsiUpperCase(Register_Familiya.Text + ' группа: ' + Register_Gruppa.Text), AnsiUpperCase(Load_From_File_Passw[iterIntCount])) > 0 then flg:= true; if flg then begin Application.MessageBox('Вы уже зарегистрированы!' + #13#10 + 'Вы можете авторизоваться!', 'Внимание!',+ MB_ICONWARNING); end else begin Registr_Familiya_P:=Trim(Register_Familiya.Text); Registr_Gruppa_P:=Trim(Register_Gruppa.Text); Registr_Password_P:=Trim(Register_Password.Text); Load_From_File_Passw.Add(Register_Familiya.Text+' группа: '+ Register_Gruppa.Text+' '+Register_Password.Text); Load_From_File_Passw.Add( '______________________________________________________'); Load_From_File_Passw.Add(' '); Load_From_File_Passw.SaveToFile( ExtractFilePath(Application.ExeName)+'lgn.tnt'); Application.MessageBox('Регистрация успешно завершена!'+#13#10+ 'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK); end; end; Login_Familiya.Text:= Register_Familiya.text; Login_Gruppa.Text:= Register_Gruppa.text; Register_Familiya.clear; Register_Gruppa.clear; Register_Password.clear; finally Load_From_File_Passw.Free; end; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#12
|
|||
|
|||
Alegun, безмерно благодарен!
Но... я реальный дурак Как и говорилось раньше - нужно все это дело прятать от лишних глаз. Люди знающие, как думаете, возможно ли в рамках кода Код:
begin Registr_Familiya_P:=Trim(Register_Familiya.Text); Registr_Gruppa_P:=Trim(Register_Gruppa.Text); Registr_Password_P:=Trim(Register_Password.Text); Load_From_File_Passw.Add(Register_Familiya.Text+' группа: '+Register_Gruppa.Text+' '+Register_Password.Text); Load_From_File_Passw.Add('______________________________________________________'); Load_From_File_Passw.Add(' '); Load_From_File_Passw.SaveToFile(ExtractFilePath(Application.ExeName)+'lgn.tnt'); Login_Familiya.Text:= Register_Familiya.text; Login_Gruppa.Text:= Register_Gruppa.text; Register_Familiya.clear; Register_Gruppa.clear; Register_Password.clear; Application.MessageBox('Регистрация успешно завершена!'+#13#10+'Вы можете авторизоваться', 'Внимание!',+ MB_ICONASTERISK); end; Зашифровать Register_Gruppa.Text и только после этого внести его в файл. Ну и соответственно в рамках кода Код:
Load_From_File_Login:=TStringList.Create; Load_From_File_Login.LoadFromFile(ExtractFilePath(Application.ExeName)+'lgn.tnt'); LogAndGruppa_Login:=Login_Familiya.Text+' группа: '+Login_Gruppa.Text+' '+Login_Password.Text; for iterIntCount:=0 to Load_From_File_Login.Count -1 do begin if LogAndGruppa_Login = Load_From_File_Login[iterIntCount] then begin FORM_LOGIN.hide; FORM_TEST.Show; Exit; end end; if (Login_Familiya.Text = '') or (Login_Gruppa.Text = '') or (Login_Password.Text = '') then begin Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING); end else begin Application.MessageBox('Неверные данные!'+#13#10+'Проверьте корректность ввода данных и повторите попытку', 'Внимание!',+ MB_ICONWARNING); end; Я думаю в сторону EncodeXXE и DecoderXXE, но это ненадежно... А что, если заставить пользователя создавать пароль только из цифр и при сохранении умножать на 2 и прибавлять 16, при обратной процедуре - делить на 2 и вычитать 16... Глупо наверное, но в мою голову ничего больше не идет. Буду рад помощи |
#13
|
||||
|
||||
Обычно это делается совсем по-другому.
Самый простой, и при этом более-менее надежный вариант - создать базу данных (например, легковесную SQLite), с таблицей вида Код:
Имя;Фамилия;Группа;ХешПароля Поиск/проверка будет проходить не конструированием сложных строк, а обычным SQL запросом (... where name = 'Вася' and surname = 'Пупкин' and group = 5 and password_hash = ...) jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 14.05.2017 в 15:15. |
#14
|
|||
|
|||
Шел девятый час работы...
Я написал авторизацию: Код:
if (Login_Familiya.Text = '') or (Login_Gruppa.Text = '') or (Login_Password.Text = '') then begin Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING); exit end else DataModule5.ADOQuery1.Sql.Clear; DataModule5.ADOQuery1.Sql.Add('SELECT Password From Users Where NameAndSurname='+#39+Login_Familiya.Text+#39); DataModule5.ADOQuery1.Open; if DataModule5.ADOQuery1.IsEmpty then ShowMessage('Пользователь '+Login_Familiya.Text+' не найден!') else if DataModule5.ADOQuery1.FieldByName('Password').Value<>Login_Password.Text then ShowMessage('Учетная запись найдена, но введен неверный пароль!') else FORM_TEST.Show; Но что делать с регистрацией - не знаю.. Я не разбираюсь в БД Я знаю, что везде туплю с этим кодом, но что в этом не так? Код:
if (Registration_Familiya.Text = '') or (Registration_Gruppa.Text = '') or (Registration_Password.Text = '') then begin Application.MessageBox('Вход невозможен!'+#13#10+'Заполните все поля', 'Внимание!',+ MB_ICONWARNING); exit end else DataModule5.ADOQuery1.Sql.Clear; DataModule5.ADOQuery1.Sql.Add('SELECT Password From Users Where NameAndSurname='+#39+Login_Familiya.Text+#39); DataModule5.ADOQuery1.Open; if DataModule5.ADOQuery1.IsEmpty then begin ShowMessage('Пользователь '+Login_Familiya.Text+' не найден!'); begin With DataModule5.ADOQuery1 do begin Connection:=DataModule5.ADOConnection1; Insert; FieldByName('1').Value:=Registration_Familiya.Text; FieldByName('edit2').Value:=Registration_Gruppa.Text; FieldByName('edit3').Value:=Registration_Password.Text; Post; end; end; end else if DataModule5.ADOQuery1.FieldByName('Password').Value<>Registration_Password.Text then ShowMessage('Учетная запись найдена, но введен неверный пароль!') else FORM_TEST.Show; |