![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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, скобАчки не забывай ![]() Последний раз редактировалось 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 = ...) Последний раз редактировалось 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; |