Форум: "Начинающим";
Текущий архив: 2011.01.16;
Скачать: [xml.tar.bz2];
ВнизМерцание TStringGrid при отрисовке Найти похожие ветки
← →
Иван (2010-10-23 20:05) [0]Здравствуйте. Помогите с TStringGrid. Заполняю грид данными. В onDrawCell идет проверка данных в ячейках и при определенных условиях ячейка закрашивается. Хочу сохранить значение цвета в Objects
(Sender as TStringGrid).Objects[acol,arow]:=tobject(color);
так как он нужен в дальнейшем,
похоже при этом принудительно вызывается перерисовка ячейки и грид начиает мерцать. Как избавиться от этой проблемы? Карту ячеек делать не очень хочется....
← →
Сергей М. © (2010-10-23 21:20) [1]
> похоже при этом принудительно вызывается перерисовка ячейки
> и грид начиает мерцать
Не похоже.
ПРичем абсолютно.
← →
Иван (2010-10-23 21:44) [2]
> Не похоже.
> ПРичем абсолютно.
Пример для ознакомления с проблемой
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;
← →
Anatoly Podgoretsky © (2010-10-23 21:51) [3]> Иван (23.10.10 20:05)
> onDrawCell
Переводится как перерисовать ячейку.
← →
Иван (2010-10-23 21:57) [4]
> > onDrawCell
>
> Переводится как перерисовать ячейку.
Я это знаю. Что Вы хотели этим сказать?
← →
Anatoly Podgoretsky © (2010-10-23 22:10) [5]Имел в виду "похоже при этом принудительно вызывается перерисовка ячейки" - так оно и есть, раз ты вошел в данный обработчик, то значит, что принудительно вызвана перерисовка ячейки, можешь даже и не сомневаться.
← →
Anatoly Podgoretsky © (2010-10-23 22:10) [6]
> Как избавиться от этой проблемы?
Убрать обработчик перерисовки ячейки.
← →
Иван (2010-10-23 22:18) [7]
> Убрать обработчик перерисовки ячейки.
Если его убрать, то как закрашивать ячейку? Согласен, раз я зашел в обработчик, значит он вызван. Проблема в том, что похоже строчка
(Sender as TStringGrid).Objects[acol,arow]:=tobject(color);
вызывает обновление грида и следовательно перерисовку ячейки.
← →
Anatoly Podgoretsky © (2010-10-23 22:23) [8]> Иван (23.10.2010 22:18:07) [7]
Ты не путай стратегию с тактикой.
Вопрос у тебя какой - вот ответ убрать, ничего мерчать не будет.
← →
Иван (2010-10-23 22:31) [9]
> Anatoly Podgoretsky
А по существу рекомендации будут? Нужно победить мерцание не убирая обработчик. Возможно порекомендуешь более хитрый способ привязать координату ячейки и ее цвет без использования Objects и не создавая карту ячеек?
← →
Anatoly Podgoretsky © (2010-10-23 22:32) [10]> Иван (23.10.2010 22:31:09) [9]
Тактика: Ты определи строку которая это вызывает и работай над ней. Код у
тебя есть, клавиатура надеюсь тоже.
← →
Иван (2010-10-23 22:46) [11]
> Anatoly Podgoretsky
Преклоняюсь пред Вашей мудростью и не смею больше занимать Ваше время. Последую Вашему Совету. Клаву бы только найти...
← →
sniknik © (2010-10-23 23:05) [12]не ехидствуй. тебе дали раально ХОРОШИЙ совет, не путать стратегию с тактикой.
ну вот какого хрена ты сохраняешь с данные в в отрисовке? не для того она предназначена, тебе бы там только читать цвет, а не назначать его. а назначать заранее, и только один раз, и только, судя по примеру, у колонок (чего вот лезть в циклы для сохранения единственного (для колонки) значения?).
← →
Иван (2010-10-23 23:45) [13]Пример для того и есть пример, что бы показывает проблему,в реальной проге закрашивается определенная ячейка а не вся колонка. Я понимаю, что отрисовка для того и нужна, чтобы рисовать а не запоминать. Просто есть работающая прога, в которой вычисления идут в обработчике отрисовки. проще было бы добавить одну строчку в процедуру отрисовки, чем переписывать кучу кода(что похоже и придется сделать). Вопрос был задан в надежде, что кто-то уже сталкивался с подобным и решал эту проблему. Нет так нет...
← →
sniknik © (2010-10-24 00:11) [14]> что кто-то уже сталкивался с подобным и решал эту проблему.
не сталкивался, и не решал, но решение довольно таки очевидно... даже если оставить этот изврат с сохранением данных в отрисовке.
вот подумай, а как часто тебе нужно туда значения запихивать? и что сделать чтобы не ... тысячу раз в секунду?
← →
Иван (2010-10-24 00:27) [15]
> sniknik
Блин... Спасибо... Действительно решение очевидное. Чето я протупил...
← →
Юрий Зотов © (2010-10-24 00:30) [16]Блокировка дишних перерисовок:
...
private
FDrawing: boolean;
...
end;
Отрисовка:
begin
if FDrawing then
Exit;
FDrawing := True;
try
....
finally
FDrawing := False
end
end;
Еще, возможно, будет полезным выставить DoubleBuffered в True.
← →
Leonid Troyanovsky © (2010-10-24 13:07) [17]
> Сергей М. © (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.
← →
Leonid Troyanovsky © (2010-10-24 13:17) [18]
> Иван (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:23) [19]
> Leonid Troyanovsky © (24.10.10 13:17) [18]
Хотя, если цвета хранить в Obects, то, с учетом [17],
достаточно назначения нового цвета.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.01.16;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c