Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1285705757
Юрий
2010-09-29 00:29
2011.01.16
С днем рождения ! 29 сентября 2010 среда


2-1287509394
SIV5000
2010-10-19 21:29
2011.01.16
TThread + Image + Bug


15-1286051355
Юрий
2010-10-03 00:29
2011.01.16
С днем рождения ! 3 октября 2010 воскресенье


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


2-1287984611
vegarulez
2010-10-25 09:30
2011.01.16
TWebBrowser, открыть ссылку в том же окне?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский