"EhLib.Com" https://forum.ehlib.com/ru/ |
|
TMemTableEh: Check access to nil value https://forum.ehlib.com/ru/viewtopic.php?f=4&t=2879 |
Страница 1 из 1 |
Автор: | Konctantin [ 15 ноя 2019, 08:24 ] |
Заголовок сообщения: | TMemTableEh: Check access to nil value |
В файле MemTableDataEh.pas есть место, где происходит ошибка, если добавить новую запись, потом удалить ее и вызвать TMemTableEh.ApplyUpdates. В методе TRecordsListEh.MergeChangeLog, есть проверка TMemoryRecordEh(DeltaList[i]), но аналогичной проверки при доступе к DeltaList[0] при DeltaList.Count = 1 нет. Вполне возможно, что ошибка кроется глубже, так как мы имеет запись в DeltaList со значением nil, что само по себе несет потенциальную ошибку в разных местах. Код: procedure TRecordsListEh.MergeChangeLog;
var i: Integer; ViaUpdate: Boolean; begin if DeltaList.Count = 0 then Exit; if DeltaList.Count > 1 then begin BeginUpdate; ViaUpdate := True; end else ViaUpdate := False; try if DeltaList.Count = 1 then // отсутствует проверка на nil TMemoryRecordEh(DeltaList[0]).MergeChanges else begin for i := 0 to DeltaList.Count-1 do begin if (TMemoryRecordEh(DeltaList[i]) <> nil) then TMemoryRecordEh(DeltaList[i]).InernalMergeChanges(False); end; end; FreeDeletedRecords; PackRecList; DeltaList.Clear; finally if ViaUpdate then EndUpdate; end; end; |
Автор: | EhLibSupport [ 27 ноя 2019, 13:50 ] | |||
Заголовок сообщения: | Re: TMemTableEh: Check access to nil value | |||
Добрый день. На тестовом проекте ошибка не воспроизводиться. Вы можете изменить проект так, чтобы ошибка стала воспроизводиться?
|
Автор: | Konctantin [ 27 ноя 2019, 15:24 ] |
Заголовок сообщения: | Re: TMemTableEh: Check access to nil value |
Прошу прощения, что заранее не уточнил детали, чтобы получть ошибку, достаточно выполнить такой код: Код: with TMemTableEh.Create(nil) do begin CachedUpdates := true; FieldDefs.Add('Name', ftString, 10, false); CreateDataSet(); AppendRecord(['123']); Delete(); ApplyUpdates(-1); Free(); end; Либо же если брать ваш пример, то нужно просто удалить ссылку на драйвер у мемтейбла, потому что при его наличии мы не попадаем в процедуру MergeChangeLog. Код: function TCustomMemTableEh.InternalApplyUpdates(AMemTableData: TMemTableDataEh; MaxErrors: Integer): Integer;
begin Result := 0; if DataDriver <> nil then begin Result := DataDriver.ApplyUpdates(AMemTableData); end else FRecordsView.MergeChangeLog; end; |
Автор: | Konctantin [ 27 ноя 2019, 17:23 ] |
Заголовок сообщения: | Re: TMemTableEh: Check access to nil value |
Мне кажется, что ошибка кроется в процедуре Код: procedure TRecordsListEh.DeleteRecord(Index: Integer);
... if ARec.FUpdateStatus = usInserted then begin if ARec.FUpdateIndex >= 0 then // тут мы убиваем ссылку на объект, но не убираем с коллекции FDeltaList.Items[Rec[Index].FUpdateIndex] := nil; Rec[Index].FUpdateIndex := -1; PersistDeleteRecord(Index); end else ... end; |
Автор: | EhLibSupport [ 28 ноя 2019, 10:00 ] |
Заголовок сообщения: | Re: TMemTableEh: Check access to nil value |
Добрый день. Ошибку исправим в следующей сборке. Спасибо за информацию. А можете написать, как вы используете режим CachedUpdates = true без DataDriver в реальных задачах? |
Автор: | Konctantin [ 28 ноя 2019, 12:42 ] |
Заголовок сообщения: | Re: TMemTableEh: Check access to nil value |
Мы это используем для того чтобы отправить скопом измененные строки, либо через формат XML, либо массив объектов скормить через SOAP. В основном это их-за того, что АдоДрайвер обрабатывает изменения по одной строке. |
Страница 1 из 1 | Часовой пояс: UTC |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |