Как добавить запрос внутри функции - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь создать класс, содержащий полный запрос (CRUD) для других модулей / форм, чтобы вызывать и использовать его. Но тогда я сталкиваюсь с некоторыми ошибками. Я использую Firebird в качестве базы данных.

Я понятия не имею, как добавить запрос для выполнения внутри функции. Я получаю сообщение об ошибке при попытке ввести код запроса в функцию.

unit AllClass;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
FireDAC.Stan.Intf, FireDAC.Stan.Option,FireDAC.Stan.Error,FireDAC.UI.Intf, 
FireDAC.Phys.Intf, FireDAC.Stan.Def,FireDAC.Stan.Pool, FireDAC.Stan.Async, 
FireDAC.Phys, FireDAC.Phys.FB,FireDAC.Phys.FBDef, FireDAC.VCLUI.Wait, 
FireDAC.Stan.Param, FireDAC.DatS,FireDAC.DApt.Intf, FireDAC.DApt, Data.DB, 
FireDAC.Comp.DataSet,FireDAC.Comp.Client, Vcl.StdCtrls;

type
 TForm6 = class(TForm)
 FDConnection1: TFDConnection;
 EveryQuery: TFDQuery;
 procedure login(username,password:String);
 private
  { Private declarations }
 public
  { Public declarations }
end;

var
 Form6: TForm6;

implementation

procedure login(username,password:String);
begin
 EveryQuery.SQL.Clear;  //here error
end;
end.

Но не будет ошибки, если я введу код запроса внутри процедуры триггера кнопки.

procedure TForm1.LogInClick(Sender: TObject);
begin
if (Username.Text <> '') And (Password.Text <> '') then
begin
loginQuery.SQL.Clear;

//use parameter method
loginQuery.SQL.Text := 'Select Password from MYGUESTS where FIRSTNAME = :theID';
loginQuery.ParamByName('theID').AsString := Username.Text;
loginQuery.Open();
passwords := loginQuery.FieldByName('Password').AsString;
if(passwords = Password.Text) then
begin
  with form3 do
  begin
    Show;
    Username.Clear;
    Password.Clear;

    Form1.Hide;
  end;
end
else
begin
  ShowMessage('Wrong username or password. please re-enter');
end;
end
else
begin
  ShowMessage('Please enter something');
end;
end;

Пожалуйста, помогите мне, если у вас есть какие-либо решения или идеи по этой проблеме.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Ваша login() процедура объявлена ​​ как член вашего TForm6 класса, но вы не реализуете ее как члена класса.Вам необходимо добавить TForm6. перед login именем процедуры в разделе implementation, например:

unit AllClass;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, 
  FireDAC.Stan.Intf, FireDAC.Stan.Option,FireDAC.Stan.Error,FireDAC.UI.Intf, 
  FireDAC.Phys.Intf, FireDAC.Stan.Def,FireDAC.Stan.Pool, FireDAC.Stan.Async, 
  FireDAC.Phys, FireDAC.Phys.FB,FireDAC.Phys.FBDef, FireDAC.VCLUI.Wait, 
  FireDAC.Stan.Param, FireDAC.DatS,FireDAC.DApt.Intf, FireDAC.DApt, Data.DB, 
  FireDAC.Comp.DataSet,FireDAC.Comp.Client, Vcl.StdCtrls;

type
  TForm6 = class(TForm)
    FDConnection1: TFDConnection;
    EveryQuery: TFDQuery;
  private
    { Private declarations }
  public
    { Public declarations }
    function login(username, password: String): boolean;
  end;

var
  Form6: TForm6;

implementation

{$R *.dfm}

function TForm6.login(username, password: String): boolean;
begin
  Result := False;
  if (username <> '') and (password <> '') then
  begin
    //use parameter method
    EveryQuery.Close;
    EveryQuery.SQL.Text := 'Select 1 from MYGUESTS where FIRSTNAME = :theID and Password = :thePsw';
    EveryQuery.ParamByName('theID').AsString := username;
    EveryQuery.ParamByName('thePsw').AsString := password;
    EveryQuery.Open;
    Result := not EveryQuery.Eof;
    EveryQuery.Close;
    if not Result then
      ShowMessage('Wrong username or password. Please re-enter');
  end else
  begin
    ShowMessage('Please enter something');
  end;
end;

end.

Затем вы можете вызвать его так:

procedure TForm1.LogInClick(Sender: TObject);
begin
  if Form6.login(Username.Text, Password.Text) then
  begin
    Username.Clear;
    Password.Clear;
    Form3.Show;
    Hide;
  end;
end;
2 голосов
/ 25 апреля 2019

Ваш function login должен быть function TForm6.Login, потому что он объявлен как метод самой формы. Вы можете избежать этой проблемы, написав объявление в классе формы (в частном или публичном разделе, а не там, где оно у вас есть) и нажав Ctrl + Shift + C , и IDE сгенерирует правильный код в разделе implementation.

Ваш текущий код:

procedure login(username,password:String);
begin
 EveryQuery.SQL.Clear;  //here error
end;

Исправленный код:

procedure TForm6.login(username,password:String);
begin
 EveryQuery.SQL.Clear;  //here error
end;
...