Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.03.2015, 09:28
AlexAwert AlexAwert вне форума
Прохожий
 
Регистрация: 20.03.2015
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Здравствуйте!
Скажу сразу, я только начинаю разбираться в 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.
MAD: учимся пользоваться тегами!

Последний раз редактировалось M.A.D.M.A.N., 20.03.2015 в 15:55.
Ответить с цитированием
  #2  
Старый 20.03.2015, 15:45
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтоп: пжлст, заключите ваш код в тег [С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  
Старый 20.03.2015, 16:06
AlexAwert AlexAwert вне форума
Прохожий
 
Регистрация: 20.03.2015
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
Радость

Почти таким же образом и решил задачу пару часов назад. Все работает. Благодарю за помощь!
Ответить с цитированием
  #4  
Старый 20.03.2015, 16:17
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от AlexAwert
Загвоздка в том, что не могу придумать как загрузить данные из БД в массив.
Этого делать не нужно. Delphi -- не PHP. Срочно читаем про DB-компоненты!
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #5  
Старый 20.03.2015, 22:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Извращенцы

Что стоит выполнить запрос типа
Код:
SELECT COUNT(1) FROM Users WHERE Login=:Login AND Password=:Password
И просто проверить результат на 1?

ЗЫ. Ну и так, к слову, хранить пароль в открытом виде - моветон. Надо хранить хеш пароля.
Ответить с цитированием
  #6  
Старый 22.03.2015, 22:11
AlexAwert AlexAwert вне форума
Прохожий
 
Регистрация: 20.03.2015
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Извращенцы

Что стоит выполнить запрос типа
Код:
SELECT COUNT(1) FROM Users WHERE Login=:Login AND Password=:Password
И просто проверить результат на 1?

ЗЫ. Ну и так, к слову, хранить пароль в открытом виде - моветон. Надо хранить хеш пароля.

Воспользовался алгоритмом md5
Ответить с цитированием
  #7  
Старый 27.03.2015, 00:31
AlexAwert AlexAwert вне форума
Прохожий
 
Регистрация: 20.03.2015
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вопрос возник еще..
как сделать так, что бы текст из dbedit шифровался (в моем случае мд5, реализован как функция " md5(n:string) " ) и только потом передавался в БД?
Понимаю, что через обычный edit это получилось бы, наверно, проще.. но хотелось бы знать как это можно сделать через dbedit.
Ответить с цитированием
  #8  
Старый 27.03.2015, 00:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Может быть и так
Код:
 
procedure TForm1.DBEdit1Exit(Sender: TObject);
begin
 with ADOTable1 do
  begin
   FieldValues['Password']:= md5(DBEdit1.Text);
   UpdateBatch;
  end;
end;
но через обычный едит всё же проще
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AlexAwert (27.03.2015)
  #9  
Старый 27.03.2015, 08:07
AlexAwert AlexAwert вне форума
Прохожий
 
Регистрация: 20.03.2015
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

[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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter