Delphi установка AdoConnection во время выполнения дает нарушение доступа - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь закодировать функцию, которая динамически создает TADOQuery. С помощью этой функции я могу изменить ее свойство SQL.Text в параметре функции. Как должен работать мой вызов функции:

procedure TDlgMain.FormCreate(Sender: TObject);
var
  Q: TADOQuery;
begin
  Q := NewQuery('select * from Utenti');
  Q.Open;
end;

Вот код функции и снимок экрана с ошибкой нарушения прав доступа, есть ли способ решить эту проблему?

function NewQuery(Conn: TADOConnection; SQL: String): TADOQuery; overload;
function NewQuery(SQL: String): TADOQuery; overload;


function TDMDB.NewQuery(Conn: TADOConnection; SQL: String): TADOQuery;
begin
  Result := TADOQuery.Create(nil);
  Result.Connection := Conn;
  Result.SQL.Text := SQL;
end;

function TDMDB.NewQuery(SQL: String): TADOQuery;
begin
  Result := NewQuery(DBConn, SQL);
end;

образ

1 Ответ

1 голос
/ 05 августа 2020

Ошибка означает, что TDataModule еще не создан, когда вы пытаетесь использовать его для создания запроса через DMDB.NewQuery().

Причина ошибки складывается вдвое.

Во-первых, при использовании IDE сначала для создания формы (DlgMain: TDlgMain в вашем случае), а затем модуля данных (TDMDB: TDataModule). Это помещает создание модуля после создания формы в файл проекта (.dpr) следующим образом: (чтобы увидеть файл .dpr, выберите меню Project - View source)

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TDlgMain, DlgMain);
  Application.CreateForm(TDMDB, DMDB);
  Application.Run;
end.

Во-вторых, при попытке для создания соединения уже в основных формах OnCreate() событие, когда модуль данных еще не создан, результатом будет AV, который вы видите.

Вы можете исправить ошибку, переместив создание вашего модуля данных перед созданием вашей основной формы:

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TDMDB, DMDB);    // Create this before the form
  Application.CreateForm(TDlgMain, DlgMain);
  Application.Run;
end.

Примечание, на случай, если вам интересно:

Возможно, вы знаете, что первая форма, созданная с помощью Application.CreateForm() становится основной формой, и это все еще действует. Модуль данных не является формой, и поэтому ваша DlgMain по-прежнему остается первой созданной формой и становится основной формой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...