AnyDAC - атрибут TADConnection FCommands содержит освобожденные объекты - PullRequest
0 голосов
/ 07 июня 2018

В настоящее время мы переносим компонент базы данных нашего Delphi7 компонента из BDE компонентов в AnyDAC версии 8.0.5 компонентов (в настоящее время известнокак FireDAC).

Мы используем следующие элементы управления в нашей дочерней форме MDI:

  • TADTable
  • TDataSource
  • TDBNavigator
  • TDBEdit (TStringField назначено свойству DataField)
  • TDBMemo (TMemoField назначено свойству DataField [DB Field Type = Blob])

все элементы управления базой данных связаны друг с другом

Когда мы изменим две или три записи, мы получим EAccessViolation во время отключения TADCustomConnection.EAccessViolation появляется в следующем методе TCustomConnection (внутри блока DB):

procedure TCustomConnection.SendConnectEvent(Connecting: Boolean);
var
  I: Integer;
  ConnectEvent: TConnectChangeEvent;
begin
  for I := 0 to FClients.Count - 1 do
  begin
    if FConnectEvents[I] <> nil then
    begin
      TMethod(ConnectEvent).Code := FConnectEvents[I];
      TMethod(ConnectEvent).Data := FClients[I];
      ConnectEvent(Self, Connecting);
    end;
    if TObject(FClients[I]) is TDataset then  // <-- raises the EAccessViolation
      TDataSet(FClients[I]).DataEvent(deConnectChange, Integer(Connecting));
  end;
end;

Причиной этого EAccessViolation является тот факт, что атрибут TADCustomConnection.FCommands содержит освобожденный TADCommands.Обычно все работает как талисман, но если мы исключим fiBlobs в TADTable.FetchOption.Items или если мы просто выполним метод RefreshRecord в случае TADTable.BeforeEdit, мы получим EAccessViolation.

Любая помощьс благодарностью.

...