Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.16;
Скачать: CL | DM;

Вниз

Мерцание 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
2-1287986449
Irisss
2010-10-25 10:00
2011.01.16
Компилятор игнорирует Breakpoint


2-1288068191
Делфиец
2010-10-26 08:43
2011.01.16
Как декодировать сообщения из TIdPOP3


2-1287918930
Анна
2010-10-24 15:15
2011.01.16
многопоточная организация в Делфи


2-1287916159
Первокурсница
2010-10-24 14:29
2011.01.16
INSERT INTO table поля из двух других связанных таблиц


2-1288091783
Ann007
2010-10-26 15:16
2011.01.16
PageСontrol