Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 27 апр 2024, 17:25

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Bookmark и строка в гриде
СообщениеДобавлено: 27 апр 2022, 07:40 
Не в сети

Зарегистрирован: 15 авг 2018, 07:39
Сообщений: 106
Добрый
Подскажите как по отмеченной записи из grid.Selection.Rows найти номер отображаемой строки в гриде с учётом возможной фильтрации отображаемых записей?
И ещё вопрос - как перерисовать только одну строку в гриде (не обязательно текущую, что-то вроде grid.RepaintRow?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Bookmark и строка в гриде
СообщениеДобавлено: 28 апр 2022, 22:35 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Цитата:
Подскажите как по отмеченной записи из grid.Selection.Rows найти номер отображаемой строки в гриде с учётом возможной фильтрации отображаемых записей?

Возможно вы имеете в виду номер записи ДатаСета.
Список grid.Selection.Rows содержит список букмарков - указателей на записи.
Через GotoBookmark переходите на нужную запись ДатаСета делая ее текущей.
Затем получаете номер записи RecNo.

Код:
procedure TForm12.Button3Click(Sender: TObject);
var
  bm: TBookmark;
  RecNo: Integer;
begin
  bm := DBGridEh1.Selection.Rows[0];
  DBGridEh1.DataSource.DataSet.GotoBookmark(bm);
  RecNo := DBGridEh1.DataSource.DataSet.RecNo;
end;



Цитата:
И ещё вопрос - как перерисовать только одну строку в гриде (не обязательно текущую, что-то вроде grid.RepaintRow?


Код:
type
  TDBGridEhCrack = class(TDBGridEh);

procedure TForm12.Button4Click(Sender: TObject);
var
  RowIndex, TitleOffset: Integer;
begin
  TitleOffset := 1; //Если есть заголовок
  RowIndex := 5; //Номер строки данных в гриде
  TDBGridEhCrack(DBGridEh1).InvalidateRow(RowIndex + TitleOffset);
  DBGridEh1.Update;
end;


Вообще грид сам посебе даже все записи перерисовывает довольно быстро.
Код:
  DBGridEh1.Repaint;

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Bookmark и строка в гриде
СообщениеДобавлено: 29 апр 2022, 09:05 
Не в сети

Зарегистрирован: 15 авг 2018, 07:39
Сообщений: 106
Благодарю за ответ.

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?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Bookmark и строка в гриде
СообщениеДобавлено: 29 апр 2022, 13:07 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Можете описать исходную задачу?
Не очень понятно, зачем так часто необходимо перерисовывать грид.
И зачем может понадобиться исходный номер записи.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Bookmark и строка в гриде
СообщениеДобавлено: 29 апр 2022, 14:36 
Не в сети

Зарегистрирован: 15 авг 2018, 07:39
Сообщений: 106
EhLibSupport писал(а):
Не очень понятно, зачем так часто необходимо перерисовывать грид.
И зачем может понадобиться исходный номер записи.

Обрабатываем в цикле отмеченные записи в гриде (примерный код выше). По мере обработки удаляем пометку из grid.SelectedRows, отображаем изменение состояния сразу.
Нужен не исходный номер записи, а именно отображённый в данный момент времени по выбранной записи из grid.SelectedRows, то есть:
Выбрали текущую обрабатываемую запись CurRec := TMemTableEh(grid.DataSource.DataSet).BookmarkToRec(grid.SelectedRows[I]);
По ней нашли в какой строке в гриде запись сейчас отображается (после отметки записи отображение могло измениться, как в примере выше, применили фильтрацию по поиску. Подход с GotoBookmark и последующим DataSet.RecNo работает, но явно лишнее перемещение к текущей записи);
Выполнили grid.RepaintRow.
Как-то так.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Bookmark и строка в гриде
СообщениеДобавлено: 29 апр 2022, 21:40 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Как решение, перерисовывайте грид не после каждой операции изменения в выбранных записях, а например каждые 0,1 доли секунды.

Как-то так

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  startTickCount: UInt64;
  CurTick: UInt64;
  CurRec: TMemoryRecordEh;
  RepaintTime: Double;
  NextRepaintTime: UInt64;
begin
  DBGridEh1.SelectedRows.SelectAll;
  startTickCount := GetTickCount64;
  NextRepaintTime := startTickCount + 100;
  for I := DBGridEh1.Selection.Rows.Count - 1 downto 0 do
  begin
    CurRec := TMemTableEh(DBGridEh1.DataSource.DataSet).BookmarkToRec(DBGridEh1.SelectedRows[I]);
//    pbProgress.Position := I + 1;
//    pbProgress.Repaint;
    DBGridEh1.Selection.Rows.DeleteItem(I);
    CurTick := GetTickCount64;
    if (CurTick > NextRepaintTime) then
    begin
      DBGridEh1.Repaint;
      NextRepaintTime := CurTick + 100;
    end;
  end;
  repaintTime := (GetTickCount64 - startTickCount) / 1000;
  DBEditEh1.Text := repaintTime.ToString;
end;

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Bookmark и строка в гриде
СообщениеДобавлено: 16 май 2022, 12:13 
Не в сети

Зарегистрирован: 15 авг 2018, 07:39
Сообщений: 106
Добрый
EhLibSupport писал(а):
Как решение, перерисовывайте грид не после каждой операции изменения в выбранных записях, а например каждые 0,1 доли секунды.

Спасибо. Как вариант.

То есть получается, кроме как позиционированием через GotoBookmark, нет способа узнать номер строки?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Bookmark и строка в гриде
СообщениеДобавлено: 16 май 2022, 13:24 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Цитата:
То есть получается, кроме как позиционированием через GotoBookmark, нет способа узнать номер строки?


Номер позиции в списке "видимых" записей можно получить с помощью метода TMemTableEh.RecordsView.IndexOfRec

Код:
    CurRec := TMemTableEh(DBGridEh1.DataSource.DataSet).BookmarkToRec(DBGridEh1.SelectedRows[I]);
    VisibleIndex := TMemTableEh(DBGridEh1.DataSource.DataSet).RecordsView.IndexOfRec(CurRec);

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Bookmark и строка в гриде
СообщениеДобавлено: 16 май 2022, 14:21 
Не в сети

Зарегистрирован: 15 авг 2018, 07:39
Сообщений: 106
EhLibSupport писал(а):
Номер позиции в списке "видимых" записей можно получить с помощью метода TMemTableEh.RecordsView.IndexOfRec

О, спасибо. Вроде, наконец, это то, что нужно )


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB