|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Здравствуйте!
Скажу сразу, я только начинаю разбираться в Delphi. Загвоздка в том, что не могу придумать как загрузить данные из БД в массив. Видел на форуме такую же тему с решением, но она мне не совсем подходит (или я просто не понимаю еще как его реализовать). У меня есть простая форма авторизации в приложении. Необходимо реализовать ее функционал с помощью класса и БД. Ниже листинг класса и формы авторизации Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2, Unit4, Unit5, DB, ADODB, Grids, DBGrids; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Button1: TButton; ADOConnection1: TADOConnection; ADOTable1: TADOTable; DataSource1: TDataSource; DBGrid1: TDBGrid; ADOQuery1: TADOQuery; DataSource2: TDataSource; DBGrid2: TDBGrid; Button2: TButton; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Edit2Change(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; log:string; pas:string; Login:string; Password:string; LoP:TlistLogPas; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var j:integer; begin LoP.Create; form1.ADOQuery1.SQL.Clear; form1.ADOQuery1.SQL.Text:='SELECT * FROM UserName ;'; // БД с двумя полями Login и Password form1.ADOQuery1.Active:=True; form1.ADOQuery1.Open; log:='admin'; pas:='12345'; SetLength(LoP.List,Form1.AdoQuery1.RecordCount); while not Form1.AdoQuery1.Eof do begin Lop.List[j] := lop.AddUser(TUser.Create(Form1.AdoQuery1.Fields[0].AsString,Form1.AdoQuery1.Fields[1].AsString)); // как-то очень криво попытался заполнить массив Form1.AdoQuery1.Next; end; end; {procedure TForm1.Button1Click(Sender: TObject); begin Login:=AnsiLowerCase(edit1.Text); Password:=edit2.Text; If (Login = log) and (Password = pas) then begin form2.Show; form1.hide; end else ShowMessage('Íåâåðíûé ëîãèí èëè ïàðîëü') end;} procedure TForm1.Edit2Change(Sender: TObject); begin edit2.PasswordChar:='*'; end; end. ----------------------------------------------------------------------------- Юнит с классом unit Unit5; interface Uses Unit4, Dialogs; type TlistLogPas = class List:array of TUser; size: integer; ListCount: Integer; Constructor Create(); Procedure AddUser(Aur:TUser); Function FindUser(Fur1,Fur2:String):string; end; implementation constructor TlistLogPas.Create(); begin size := 1; setLength(List, size); ListCount := 0; end; procedure TListLogPas.AddUser(Aur:TUser); begin if ListCount >= size-1 then begin size := 2*size; setLength(List, size); end; List[ListCount] := Aur; ListCount := ListCount + 1; end; Function TlistLogPas.FindUser(Fur1,Fur2:String):string; var i: integer; begin result:=''; for i := 0 to ListCount - 1 do begin if (List[i].Login = Fur1) and (List[i].Password = Fur2) then begin Result:='1'; break; end else ShowMessage('Ëîãèí èëè ïàðîëü ââåäåí íå âåðíî'); end; end; end. На любые вопросы по коду отвечу. Просто не знаю где еще какие комментарии дописать. Помогите пожалуйста разобраться новичку unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TUser = class Login: String; Password: String; Constructor Create(NewLogin,NewPassword:string); end; implementation constructor TUser.Create(NewLogin, NewPassword: string); begin Login:=NewLogin; Password:=NewPassword; end; end. Последний раз редактировалось M.A.D.M.A.N., 20.03.2015 в 15:55. |
#2
|
||||
|
||||
Оффтоп: пжлст, заключите ваш код в тег [СODE]код[/СODE]
Зачем такие сложности, когда можно совсем просто Код:
function aur(Login, Password: string): boolean; begin Result:= false; ADOTable1.Locate('Login', Login, [loPartialKey]); if (Login = ADOTable1.FieldValues['Login']) and (Password = ADOTable1.FieldValues['Password']) then Result:= true; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
Почти таким же образом и решил задачу пару часов назад. Все работает. Благодарю за помощь!
|
#4
|
||||
|
||||
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#5
|
|||
|
|||
Извращенцы
Что стоит выполнить запрос типа Код:
SELECT COUNT(1) FROM Users WHERE Login=:Login AND Password=:Password ЗЫ. Ну и так, к слову, хранить пароль в открытом виде - моветон. Надо хранить хеш пароля. |
#6
|
|||
|
|||
Цитата:
Воспользовался алгоритмом md5 |
#7
|
|||
|
|||
Вопрос возник еще..
как сделать так, что бы текст из dbedit шифровался (в моем случае мд5, реализован как функция " md5(n:string) " ) и только потом передавался в БД? Понимаю, что через обычный edit это получилось бы, наверно, проще.. но хотелось бы знать как это можно сделать через dbedit. |
#8
|
||||
|
||||
Может быть и так
Код:
procedure TForm1.DBEdit1Exit(Sender: TObject); begin with ADOTable1 do begin FieldValues['Password']:= md5(DBEdit1.Text); UpdateBatch; end; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
AlexAwert (27.03.2015)
|
#9
|
|||
|
|||
[quote=Alegun]Может быть и так
Код:
procedure TForm1.DBEdit1Exit(Sender: TObject); begin with ADOTable1 do begin FieldValues['Password']:= md5(DBEdit1.Text); UpdateBatch; end; end; Спасибо! Натолкнули меня на мысль У меня так сработало Обработчик кнопки для открытия формы с нужными bdedit'ми Код:
procedure TForm2.Button1Click(Sender: TObject); begin form3.show; ADOQuery2.insert; end; Обработчик кнопки уже на самой форме с дб эдитами Код:
procedure TForm3.Button3Click(Sender: TObject); begin try dbedit1.Text:=md7(dbedit1.text); dbedit2.Text:=md7(dbedit2.text); Form2.ADOQuery2.Post; close; except ShowMessage('Не заполнены обязательные поля'); end; end; Получилось даже немного попроще Последний раз редактировалось AlexAwert, 27.03.2015 в 08:14. |