Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Самодельный WordWrap в StringGrid - тормоза и лаги / 7 сообщений из 7, страница 1 из 1
16.11.2018, 21:36
    #39734384
Tim Woo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самодельный WordWrap в StringGrid - тормоза и лаги
Доброго времени суток!

Проблема:
Есть StringGrid которому в OnDrawCell прописан код для WordWrap (перенос по словам):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
procedure TUserProf.DataGridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var s:String;
 Flag: Cardinal;
 H: integer;
begin
    if (DataGrid.ColWidths[ACol] > -1) then begin
      DataGrid.Canvas.FillRect(Rect);
      s := DataGrid.Cells[ACol,ARow];
      
	  //Выравнивание для "Заголовков" 
	  if ARow = 0 then begin
        Flag := DT_CENTER;
        DataGrid.Canvas.Font.Style := [fsBold];
      end
        else Flag := DT_LEFT;
		
      Flag := Flag or DT_WORDBREAK;
	  
      //Отступы текста от края ячеек
	  if ACol > 0 then begin
        Inc(Rect.Left,3);
        Dec(Rect.Right,3);
      end;
	  
      H := DrawText(DataGrid.Canvas.Handle,PChar(s),length(s),Rect,Flag);
      if H > DataGrid.RowHeights[ARow] then
        DataGrid.RowHeights[ARow] := H;
    end;
end;


Все работает хорошо, но как всегда есть одно НО: при большом количестве строк все это дико лагает!
Этот OnDrawCell вызывается при любом изменении в таблице (прокрутка таблицы в любом направлении на 1 клик, обновление какого-либо значения в таблице и т.п.), и юзер постоянно видит, как таблица медленно, "ступенчато" растягивает строку. Данные в ячейках - строки разной длины. Где-то может быть длинее строка в 5й ячейке, где-то в 3й, к примеру.

Что я делаю не так в коде, раз возникают жуткие лаги в таблице 10 столбцов на 50+ строк?
Есть ли альтернативные методы решения проблемы WordWrap-а для StringGrid?
Или есть ли бесплатные кастомные компоненты, где WordWrap реализован адекватно?
...
Рейтинг: 0 / 0
16.11.2018, 21:42
    #39734385
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самодельный WordWrap в StringGrid - тормоза и лаги
Если видит ступенчатое растягивание, то видимо вот это виновато:
DataGrid.RowHeights[ARow] := H;

При смене высоты строки грид вынужден перерисовывать все остальные. И так как снежный ком. Возможно, стоит заранее (когда только данные загрузились) пройтись по всем строкам и выставить им нужную высоту.
...
Рейтинг: 0 / 0
16.11.2018, 22:00
    #39734390
Tim Woo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самодельный WordWrap в StringGrid - тормоза и лаги
Если убрать DataGrid.RowHeights[ARow] := H; то высота не меняется.
При отладке OnDrawCell проходит по ячейкам от 0,0 до n,n только один раз не делая тот "снежный ком" о котором вы говорите.

>>>Возможно, стоит заранее (когда только данные загрузились) пройтись по всем строкам и выставить им нужную высоту.
В том то и проблема, что юзер видит "ступеньки" сразу при первой загрузке данных, и потом каждый раз при любом визуальном обновлении таблицы.
...
Рейтинг: 0 / 0
16.11.2018, 22:02
    #39734391
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самодельный WordWrap в StringGrid - тормоза и лаги
Менять размеры надо не во время отрисовки а во время изменения содержимого ячеек.
Или вовремя ресайза столбцов, если таковой у тебя будет.
...
Рейтинг: 0 / 0
16.11.2018, 22:13
    #39734394
Tim Woo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самодельный WordWrap в StringGrid - тормоза и лаги
WordWrap пишется в событие OnDrawCell. ( http://www.delphimaster.ru/articles/stringgrid/index.html)
А OnDrawCell вызывается САМОСТОЯТЕЛЬНО при скролле таблицы и при внесении изменений в ячейки.
...
Рейтинг: 0 / 0
16.11.2018, 22:15
    #39734396
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самодельный WordWrap в StringGrid - тормоза и лаги
Да не вопрос, пусть тормозит дальше.
...
Рейтинг: 0 / 0
16.11.2018, 22:49
    #39734406
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Самодельный WordWrap в StringGrid - тормоза и лаги
Отрывать руки надо тем, кто в процедуре отрисовки изменяет объект отрисовки
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Самодельный WordWrap в StringGrid - тормоза и лаги / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]