![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мерцание TStringGrid при отрисовке [D7, WinXP]
Иван © (2010-10-23 20:05:00)Здравствуйте. Помогите с TStringGrid. Заполняю грид данными. В onDrawCell идет проверка данных в ячейках и при определенных условиях ячейка закрашивается. Хочу сохранить значение цвета в Objects
(Sender as TStringGrid).Objects[acol,arow]:=tobject(color);
так как он нужен в дальнейшем,
похоже при этом принудительно вызывается перерисовка ячейки и грид начиает мерцать. Как избавиться от этой проблемы? Карту ячеек делать не очень хочется....
Leonid Troyanovsky (2010-10-24 13:23:00) [1]
> Leonid Troyanovsky © (24.10.10 13:17) [18]
Хотя, если цвета хранить в Obects, то, с учетом [17],
достаточно назначения нового цвета.
--
Regards, LVT.
Leonid Troyanovsky (2010-10-24 13:17:00) [2]
> Иван (23.10.10 23:45) [13]
> в реальной проге закрашивается определенная ячейка а не
Для перерисовки отдельной ячейки полезен InvalidateCell.
Чтобы добраться до protected методов/свойств можно использовать
приведение к классу type TGridCracker = class(TStringgrid).
Т.е., TGridCracker(StringGrid).InvalidateCell(ACol, ARow).
--
Regards, LVT.
Leonid Troyanovsky (2010-10-24 13:07:00) [3]
> Сергей М. © (23.10.10 21:20) [1]
> > похоже при этом принудительно вызывается перерисовка
> ячейки
> Не похоже.
Grids.pas
procedure TStringGrid.SetObjects(ACol, ARow: Integer; Value: TObject);
begin
TStringGridStrings(EnsureDataRow(ARow)).Objects[ACol] := Value;
EnsureColRow(ACol, True);
EnsureColRow(ARow, False);
Update(ACol, ARow);
end;
--
Regards, LVT.
Юрий Зотов (2010-10-24 00:30:00) [4]Блокировка дишних перерисовок:
...
private
FDrawing: boolean;
...
end;
Отрисовка:
begin
if FDrawing then
Exit;
FDrawing := True;
try
....
finally
FDrawing := False
end
end;
Еще, возможно, будет полезным выставить DoubleBuffered в True.
Иван (2010-10-24 00:27:00) [5]
> sniknik
Блин... Спасибо... Действительно решение очевидное. Чето я протупил...
sniknik (2010-10-24 00:11:00) [6]> что кто-то уже сталкивался с подобным и решал эту проблему.
не сталкивался, и не решал, но решение довольно таки очевидно... даже если оставить этот изврат с сохранением данных в отрисовке.
вот подумай, а как часто тебе нужно туда значения запихивать? и что сделать чтобы не ... тысячу раз в секунду?
Иван (2010-10-23 23:45:00) [7]Пример для того и есть пример, что бы показывает проблему,в реальной проге закрашивается определенная ячейка а не вся колонка. Я понимаю, что отрисовка для того и нужна, чтобы рисовать а не запоминать. Просто есть работающая прога, в которой вычисления идут в обработчике отрисовки. проще было бы добавить одну строчку в процедуру отрисовки, чем переписывать кучу кода(что похоже и придется сделать). Вопрос был задан в надежде, что кто-то уже сталкивался с подобным и решал эту проблему. Нет так нет...
sniknik (2010-10-23 23:05:00) [8]не ехидствуй. тебе дали раально ХОРОШИЙ совет, не путать стратегию с тактикой.
ну вот какого хрена ты сохраняешь с данные в в отрисовке? не для того она предназначена, тебе бы там только читать цвет, а не назначать его. а назначать заранее, и только один раз, и только, судя по примеру, у колонок (чего вот лезть в циклы для сохранения единственного (для колонки) значения?).
Иван (2010-10-23 22:46:00) [9]
> Anatoly Podgoretsky
Преклоняюсь пред Вашей мудростью и не смею больше занимать Ваше время. Последую Вашему Совету. Клаву бы только найти...
Anatoly Podgoretsky (2010-10-23 22:32:00) [10]> Иван (23.10.2010 22:31:09) [9]
Тактика: Ты определи строку которая это вызывает и работай над ней. Код у
тебя есть, клавиатура надеюсь тоже.
Иван (2010-10-23 22:31:00) [11]
> Anatoly Podgoretsky
А по существу рекомендации будут? Нужно победить мерцание не убирая обработчик. Возможно порекомендуешь более хитрый способ привязать координату ячейки и ее цвет без использования Objects и не создавая карту ячеек?
Anatoly Podgoretsky (2010-10-23 22:23:00) [12]> Иван (23.10.2010 22:18:07) [7]
Ты не путай стратегию с тактикой.
Вопрос у тебя какой - вот ответ убрать, ничего мерчать не будет.
Иван (2010-10-23 22:18:00) [13]
> Убрать обработчик перерисовки ячейки.
Если его убрать, то как закрашивать ячейку? Согласен, раз я зашел в обработчик, значит он вызван. Проблема в том, что похоже строчка
(Sender as TStringGrid).Objects[acol,arow]:=tobject(color);
вызывает обновление грида и следовательно перерисовку ячейки.
Anatoly Podgoretsky (2010-10-23 22:10:00) [14]
> Как избавиться от этой проблемы?
Убрать обработчик перерисовки ячейки.
Anatoly Podgoretsky (2010-10-23 22:10:00) [15]Имел в виду "похоже при этом принудительно вызывается перерисовка ячейки" - так оно и есть, раз ты вошел в данный обработчик, то значит, что принудительно вызвана перерисовка ячейки, можешь даже и не сомневаться.
Иван (2010-10-23 21:57:00) [16]
> > onDrawCell
>
> Переводится как перерисовать ячейку.
Я это знаю. Что Вы хотели этим сказать?
Anatoly Podgoretsky (2010-10-23 21:51:00) [17]> Иван (23.10.10 20:05)
> onDrawCell
Переводится как перерисовать ячейку.
Иван (2010-10-23 21:44:00) [18]
> Не похоже.
> ПРичем абсолютно.
Пример для ознакомления с проблемой
procedure TForm1.FormCreate(Sender: TObject);
var
i,j:integer;
begin
StringGrid1.OnDrawCell:=DrawCell; //подменяем обработчик отрисовки
for I := 0 to StringGrid1.ColCount - 1 do
for j := 0 to StringGrid1.RowCount - 1 do
StringGrid1.Cells[i,j] := inttostr(i)+' ' +inttostr(j);
end;
//процедура отрисовки грида
procedure TForm1.DrawCell (Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
color:TColor;
x,y:integer;
txtSize : TSize;
proc :procedure (Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
case acol of
0:color:=clred;
1:color:=clAqua;
2:color:=clYellow;
3:color:=clGreen;
4:color:=clBlue;
end;
(Sender as TStringGrid).Canvas.Brush.Color := Color;
(Sender as TStringGrid).Canvas.FillRect(Rect);
txtSize := (Sender as TStringGrid).Canvas.TextExtent((Sender as TStringGrid).Cells[ACol,ARow]);
x:= Rect.Left + trunc((Rect.Right-Rect.Left)/2)-trunc(txtSize.cx/2);
y := trunc(((Rect.Bottom - Rect.Top) - txtSize.cy)/3 + Rect.Top);
(Sender as TStringGrid).Objects[acol,arow]:=tobject(color); // если эту строку //закоментить то проблем нет
end;
Сергей М. (2010-10-23 21:20:00) [19]
> похоже при этом принудительно вызывается перерисовка ячейки
> и грид начиает мерцать
Не похоже.
ПРичем абсолютно.