Д6 проф.
Раньше мы использовали DBISAM и DBISAMTable. Это обрабатывает RecNo и хорошо работает с модификациями (удаление, редактирование и т. д.).
Теперь мы заменили ElevateDB, которая не обрабатывает RecNo, и часто мы используем запросы, а не таблицы.
Запрос должен быть открыт повторно, чтобы увидеть изменения.
Но если мы снова откроем запрос, нам нужно переместиться к последней записи. Найти недостаточно, потому что Grid показывает его в другом ряду. Это очень настораживает, потому что после модификации запись перемещается в другую строку, за ней тяжело следить, а пользователи это ненавидят.
Мы нашли этот код:
function TBaseDBGrid.GetActRow: integer;
begin
Result := -1 + Row;
end;
procedure TBasepDBGrid.SetActRow(aRow: integer);
var
bm : TBookMark;
begin
if IsDataSourceValid(DataSource) then with DataSource.DataSet do begin
bm := GetBookmark;
DisableControls;
try
MoveBy(-aRow);
MoveBy(aRow);
//GotoBookmark(bm);
finally
FreebookMark(bm);
EnableControls;
end;
end;
end;
В исходном примере используется moveby. Это хорошо работает с запросами, потому что мы не можем видеть, что запрос повторно открыт в фоновом режиме, визуальный элемент управления не меняет положение строки.
Но когда у нас есть EDBTable или Live/Sensitive Query, MoveBy опасно использовать, потому что, если кто-то удалит или добавит новую строку, мы можем переместиться в неправильную запись.
Затем я попытался использовать BookMark (см. примечание). Но этот метод не работает, потому что он показывает запись в другой позиции строки...
Итак, вопрос: как заставить и позицию строки, и запись в DBGrid?
Или какой тип DBGrid может перемещаться в запись/строку после обновления базового набора данных?
Я ищу удобное решение, я понимаю их, потому что я пытался использовать этот переход через DBGrid, и очень плохо использовать, потому что мои глаза вылезают, когда я пытаюсь найти исходную запись после обновления... :-(
Спасибо за вашу помощь, ссылку, информацию: dd