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

Проблема:
Есть 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
Самодельный WordWrap в StringGrid - тормоза и лаги
    #39734385
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если видит ступенчатое растягивание, то видимо вот это виновато:
DataGrid.RowHeights[ARow] := H;

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

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


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