Почему бы не tDataSet.Append автоматически вызывать сообщение - PullRequest
0 голосов
/ 23 мая 2019

Delphi tDataSet.Append, кажется, не вызывает Post.В его ссылке говорится:

Методы набора данных, которые изменяют состояние набора данных, например, «Редактировать», «Вставить» или «Добавить», или которые перемещаются из одной записи в другую, например «Первая», «Последняя», «Следующая» и «Приоритетная».автоматически вызывать Post.

Но я не вижу увеличенного RecordCount в следующем коде.

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // 0

FDMemTable1.Append;

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // still 0

Если я вставляю FDMemTable1.Post после добавления, результат показывает, что RecordCount1.

Ответы [ 2 ]

5 голосов
/ 23 мая 2019

Почему бы tDataSet.Append не вызвать автоматический вызов Post?

Потому что в первую очередь это повредит объекту вызова Append;если бы он вызывал Post автоматически, это привело бы к тому, что пустая запись была бы размещена в таблице без возможности сначала установить значения ее полей.Точно так же автоматический вызов Post после Edit или Insert также предотвратит изменение любых значений полей с помощью кода пользователя

. Выражение, которое вы цитируете из http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_Post.html, в лучшем случае плохо сформулировано, поскольку оно можетбыть неправильно прочитанным, чтобы создать впечатление, что "методы набора данных, которые изменяют состояние набора данных, такие как Редактировать, Вставить или Добавить [...], автоматически вызывают Post" в конце метода , которыйне тот случай по той причине, о которой я говорил.Что следует сказать, imo, так это то, что, как и в случае с такими методами навигации, как First, Last, Next и Prior, эти методы будут начинаться с автоматического вызова при необходимости Post для текущей записи до остальныхметода выполняется.Это потому, что эти методы всегда вызывают CheckBrowseMode в качестве первого шага и содержат код

procedure TDataSet.CheckBrowseMode;
begin
  CheckActive;
  DataEvent(deCheckBrowseMode, 0);
  case State of
    dsEdit, dsInsert:
      begin
        UpdateRecord;
        if Modified then Post else Cancel;
      end;
    dsSetKey:
      Post;
  end;
end;
3 голосов
/ 23 мая 2019

Так что он делает именно то, что говорит ...

//Dataset.State = dsBrowse
Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // 0

FDMemTable1.Append;
//now Dataset.State = dsInsert

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // still 0, previous record not yet posted.

FDMemTable1.Append; //because Dataset.State <> dsBrowse, it now post pending changes

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // Now 1, Dataset.State = dsInsert 

FDMemTable1.Post;

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // Now 2, Dataset.State = dsBrowse 

При первом вызове Append, просто нет ничего для публикации.

...