![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Цитата:
|
|
#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)
| ||