В настоящее время мы переносим компонент базы данных нашего 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
.
Любая помощьс благодарностью.