Ниже приведен минимальный проект FMX LiveBindings, написанный и скомпилированный с Delphi Сиэтл, который (я надеюсь!) Показывает давнюю проблему с LiveBindings, которая восходит к тому времени, когда я впервые попытался использовать их в эпоху XE4.
Я включил код и выдержку .DFM ниже, чтобы избежать каких-либо сомнений относительно того, как все устроено.
В Сиэтле, когда я запускаю приложение, то, что я вижу в StringGrid - это строка с идентификатором = 1, за которой следуют две копии идентификатора строки 3 без идентификатора 2.
Мой вопрос: если ваши результаты в Сиэтле, если они у вас есть, не противоречат моим, это причуды все еще присутствуют в более свежих Delphi версиях, в частности Rio?
Пока у вас запущено приложение, есть еще одна причуда, которая кажется легко спровоцированной:
Когда я это делаю, я поднимаю окно процессора и
---------------------------
Debugger Exception Notification
---------------------------
Project BindingsQuirk2.exe raised exception class $C0000005 with message 'access violation at 0x095b9633: write of address 0x00000001'.
---------------------------
Break Continue Help
---------------------------
код
type
TLBForm = class(TForm)
ADataSet: TSimpleDataSet;
ADataSetID: TIntegerField;
ADataSetName: TStringField;
BindSourceDB1: TBindSourceDB;
StringGrid1: TStringGrid;
BindingsList1: TBindingsList;
NavigatorBindSourceDB1: TBindNavigator;
LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;
procedure FormCreate(Sender: TObject);
procedure ADataSetNewRecord(DataSet: TDataSet);
private
NextID : Integer;
ALinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;
end;
[...]
procedure TLBForm.ADataSetNewRecord(DataSet: TDataSet);
begin
Inc(NextID);
ADataSetID.AsInteger := NextID;
ADataSetName.AsString := 'RowID' + IntToStr(NextID);
end;
procedure TLBForm.FormCreate(Sender: TObject);
var
i : Integer;
begin
ADataSet.IndexFieldNames := 'ID';
ADataSet.OnNewRecord := ADataSetNewRecord;
ADataSet.CreateDataSet;
for i := 1 to 3 do begin
ADataSet.Insert;
ADataSet.Post;
end;
ADataSet.First;
end;
DFM экстракт
object LBForm: TLBForm
object StringGrid1: TStringGrid
CanFocus = True
ClipChildren = True
Position.X = 8.000000000000000000
Position.Y = 16.000000000000000000
TabOrder = 26
Viewport.Width = 180.000000000000000000
Viewport.Height = 75.000000000000000000
end
object NavigatorBindSourceDB1: TBindNavigator
Position.X = 8.000000000000000000
Position.Y = 128.000000000000000000
Size.Width = 240.000000000000000000
Size.Height = 25.000000000000000000
Size.PlatformDefault = False
TabOrder = 31
DataSource = BindSourceDB1
xRadius = 4.000000000000000000
yRadius = 4.000000000000000000
end
object ADataSet: TSimpleDataSet
Aggregates = <>
DataSet.MaxBlobSize = -1
DataSet.Params = <>
Params = <>
OnNewRecord = ADataSetNewRecord
object ADataSetID: TIntegerField
FieldName = 'ID'
end
object ADataSetName: TStringField
FieldName = 'Name'
Size = 30
end
end
object BindSourceDB1: TBindSourceDB
DataSet = ADataSet
ScopeMappings = <>
end
object BindingsList1: TBindingsList
Methods = <>
OutputConverters = <>
object LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource
DataSource = BindSourceDB1
GridControl = StringGrid1
Columns = <>
end
end
end