Похоже ли на то, что в последних версиях Delphi, например, в Rio, присутствует причуда LiveBindings? - PullRequest
0 голосов
/ 23 апреля 2020

Ниже приведен минимальный проект FMX LiveBindings, написанный и скомпилированный с Delphi Сиэтл, который (я надеюсь!) Показывает давнюю проблему с LiveBindings, которая восходит к тому времени, когда я впервые попытался использовать их в эпоху XE4.

Я включил код и выдержку .DFM ниже, чтобы избежать каких-либо сомнений относительно того, как все устроено.

В Сиэтле, когда я запускаю приложение, то, что я вижу в StringGrid - это строка с идентификатором = 1, за которой следуют две копии идентификатора строки 3 без идентификатора 2.

Мой вопрос: если ваши результаты в Сиэтле, если они у вас есть, не противоречат моим, это причуды все еще присутствуют в более свежих Delphi версиях, в частности Rio?

Пока у вас запущено приложение, есть еще одна причуда, которая кажется легко спровоцированной:

  • Double- щелкните ячейку Имя в первой строке, чтобы StringGrid перешел в режим редактирования.

  • Нажмите клавишу Вниз .

Когда я это делаю, я поднимаю окно процессора и

---------------------------
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...