Начиная с версии
Delphi 11.2, сохранилось и на
Delphi 11.3 при сборке проекта под платформой
Windows 64-bit начала появлятся AV.
Код:
First chance exception at $00000000003D1910. Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
Суть проблемы вот в этой строке:DataEvent(deFieldChange,
Longint(Field));
так как сигнатура
Data.DB.TDataSet.DataEvent не
Longint а
NativeInt - мы получаем
AV, хотя в версии
Delphi 11.1 было так же, но
AV не было.
Проблема решается заменой
Longint на
NativeInt.
По сути эти 2 типа равнозначны, но видать что-то переделали ну и как водится все сломали.
Дополнительная информация.
[spoiler]
Колстек:
Код:
Data.DB.TDataSet.DataEvent(deFieldChange,2058754320)
MemTableEh.TCustomMemTableEh.DataEvent(deFieldChange,2058754320)
MemTableEh.TCustomMemTableEh.SetFieldData($26C7AB61910, ...
Data.DB.TField.SetData((49...
Data.DB.TStringField.SetAsAnsiString(???)
Data.DB.TStringField.SetAsString('1')
Пример:
Код:
program TestMt;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, DB, MemTableEh;
begin
try
var mt := TMemTableEh.Create(nil);
try
mt.FieldDefs.Add('name', ftString, 100, false);
mt.CreateDataSet();
//mt.AppendRecord(['hello!']);
mt.Append();
mt.Edit();
mt.FieldByName('name').AsString := '1';
mt.Post();
mt.ApplyUpdates(0); // just another code line
finally
mt.Free();
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
[/spoiler]