Как исправить нарушение прав доступа по адресу в Delphi - PullRequest
0 голосов
/ 14 февраля 2019

Я новичок в Delphi и пытаюсь запустить ООП.Однако я получаю нарушение прав доступа при использовании открытого свойства для установки частного поля.

type
  User = class;
  TData = class
  private
    CurrUser: User;
    Connection: TFDConnection;
    Query: TFDQuery;

  procedure SetUser(newUser: User);
  procedure SetConnection(newConn: TFDConnection);
  procedure SetQuery(newQry: TFDQuery);
public
  property CUser: User read CurrUser write SetUser;
  property Conn: TFDConnection read Connection write SetConnection;
  property Qry: TFDQuery read Query write SetQuery;

  class procedure Login(uID: integer); static;
  class procedure Logout(uID: integer); static;
  class procedure ExitApp(); static;
end;
implementation

{$R *.fmx}

procedure TData.SetUser(newUser: User);
begin
  CurrUser := newUser;
end;

procedure TData.SetConnection(newConn: TFDConnection);
begin
  Connection := newConn;
end;

procedure TData.SetQuery(newQry: TFDQuery);
begin
  Query := newQry;
end;

Я ожидаю, что смогу установить Соединение, используя это свойство, однако это дает мне нарушение прав доступа с любым кодом, который используетсвойство write: TData.Conn.LoginPrompt: = False;TData.Conn.Connected: = True;

var
  TData: frmData.TData;
  LoginForm: TLoginForm;
  ErrorCount : integer;

implementation

{$R *.fmx}

procedure TLoginForm.ExitAppButtonClick(Sender: TObject);
begin
  TData.ExitApp;
end;

procedure TLoginForm.LoginButtonClick(Sender: TObject);
var
  companyPath : string;
  nurseID : integer;
begin
  if(UsernameInput.Text = '') or (PasswordInput.Text = '') or (PincodeInput.Text = '') then
  begin
    ShowMessage('Please enter your login details.');
    Exit;
  end;

  try
    TData.Conn := TFDConnection.Create(nil);
    TData.Conn.Params.DriverID := 'MSAcc';
    TData.Conn.Params.Database := 'D:\PulseDB\AlfaPersonnel\Pulse.mdb';
    TData.Conn.LoginPrompt := False;
    TData.Conn.Connected := True;
    if(TData.Conn.Connected <> True) then
    begin
      ShowMessage('Could not connect, try again');
      Exit;
    end
    else //When Connection
    begin
      TData.Qry := TFDQuery.Create(TData.Conn);
      try
        TData.Qry.Connection := TData.Conn;
        TData.Qry.SQL.Text := 'SELECT * FROM NurseLogin WHERE Username=:uname AND Password=:pword AND PinCode=:pin;';
        TData.Qry.Params.ParamByName('uname').AsString := UsernameInput.Text;
        TData.Qry.Params.ParamByName('pword').AsString := PasswordInput.Text;
        TData.Qry.Params.ParamByName('pin').AsString := PincodeInput.Text;
        TData.Qry.Active := True;

        if TData.Qry.RecordCount = 0 then ShowMessage('Details not recognised.')
        else if TData.Qry.RecordCount = 1 then
             begin
               if TData.Qry.FieldByName('IsActive').AsBoolean then //If the user is active
               begin
                 try
                   //Connect to the path
                   companyPath := TData.Qry.FieldByName('CompanyName').AsString;
                   TData.Conn.Params.Database := 'D\PulseDB\' + companyPath + '\Pulse.mdb';
                   TData.Conn.Connected := True;

                   ShowMessage('Connected to ' + companyPath);
                 finally

                 end;
               end;
             end;
      finally
      end;
    end;
  finally
  end;
end;

1 Ответ

0 голосов
/ 14 февраля 2019

Вы никогда не создаете экземпляр своего TData класса.В какой-то момент вам нужно написать:

TData := frmData.TData.Create;

Вот как вы создаете экземпляр.И вам нужно уничтожить его, когда вы закончите тоже.Например:

TData.Free;

То, что вы не создали экземпляр, является объяснением вашего нарушения доступа.

Некоторые другие проблемы:

  1. Использование T префикс для типов.Ваша переменная должна иметь имя Data, а не TData.
  2. Не использовать глобальные переменные, если это вообще возможно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...