Благодарю за ответ.
EhLibSupport писал(а):
Вообще грид сам посебе даже все записи перерисовывает довольно быстро.
Ну не скажите ). Грид 3000 записей, с GetCellParams, ColumnsGetCellParams, вычисляемыми полями и тп. Видимых записей 28-29.
Вот схематичный код:
Код:
grid.SelectedRows.SelectAll;
var
startTickCount: UInt64 := GetTickCount64;
for I := grid.Selection.Rows.Count - 1 downto 0 do begin
CurRec := TMemTableEh(grid.DataSource.DataSet).BookmarkToRec(grid.SelectedRows[I]);
pbProgress.Position := I + 1;
pbProgress.Repaint;
grid.Selection.Rows.DeleteItem(I);
grid.Repaint;
end;
var
repaintTime: Double := (GetTickCount64 - startTickCount) / 1000;
grid.SelectedRows.SelectAll;
startTickCount := GetTickCount64;
for I := grid.Selection.Rows.Count - 1 downto 0 do begin
CurRec := TMemTableEh(grid.DataSource.DataSet).BookmarkToRec(grid.SelectedRows[I]);
pbProgress.Position := I + 1;
pbProgress.Repaint;
grid.Selection.Rows.DeleteItem(I);
grid.InvalidateRow(I + 1);
// до grid.InvalidateRow я и сам дошёл, а вот что нужно grid.Update, не догадался :)
grid.Update;
end;
var
updateRowTime: Double := (GetTickCount64 - startTickCount) / 1000;
grid.SelectedRows.SelectAll;
startTickCount := GetTickCount64;
for I := grid.Selection.Rows.Count - 1 downto 0 do begin
CurRec := TMemTableEh(grid.DataSource.DataSet).BookmarkToRec(grid.SelectedRows[I]);
pbProgress.Position := I + 1;
pbProgress.Repaint;
grid.Selection.Rows.DeleteItem(I);
end;
var
woUpdateTime: Double := (GetTickCount64 - startTickCount) / 1000;
И такие в среднем времена:
Код:
repaintTime: 111,27 сек.
updateRowTime: 10,42 сек.
woUpdateTime: 7,34 сек.
Разница между grid.Repaint и grid.RepaintRow на порядок, визуально поведение не отличается - пометки со строк снимаются, счётчик в навигатор панели изменяется. И, что важно, разница между перерисовкой отдельной строки и вообще без перерисовки довольно приемлемая.
EhLibSupport писал(а):
Возможно вы имеете в виду номер записи ДатаСета.
Возможно. Если RecNo в DataSet всегда совпадает с отображаемой в данный момент строкой в гриде, то есть мне казалось, что грид только представление данных из DataSet и порядок может отличаться из-за сортировки, например, или фильтрации.
Грид без dghClearSelection. Пометили все записи, что-то поискали (Ctrl+F), отфильтровали, часть записей не видна, но помечена. То есть Rec из SelectedRows есть, но Bookmark не валидный.
Вот такой примерно код
Код:
for I := grid.Selection.Rows.Count - 1 downto 0 do begin
CurRec := TMemTableEh(grid.DataSource.DataSet).BookmarkToRec(grid.SelectedRows[I]);
var
bm: TBookmark := grid.Selection.Rows[I];
if grid.DataSource.DataSet.BookmarkValid(bm) then begin
grid.DataSource.DataSet.GotoBookmark(bm);
var
RecNo := grid.DataSource.DataSet.RecNo;
end;
end;
Возможно ли узнать номер записи без перемещения на текущую позицию, хотя бы для частного случая, когда DataSet это TMemTableEh?