Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Вниз

OnDrawColumnCell   Найти похожие ветки 

 
Vick   (2003-11-10 15:18) [0]

Доброго всем дня!!!!
Возник вопрос такого типа: вывожу данные в EhDBGrid, разукрашиваю его так как мне нужно в OnDrawColumnCell. Везде пишут что это так классно, красиво, наглядно. Только вот не могу понять когда происходит это событие, как часто и как это влияет на работу системы? Дело в том, что когда я не разукрашиваю грид все нормально, как только начинаю перерисовывать, с непонятной переодичностью начинаются разые глюки в системе вплоть до ошибки в библиотеках user32.dll и kernel32.dll. Что бы это могло значить??? (та же самая фигня происходит с обычным DBGrid)


 
Vlad   (2003-11-10 15:23) [1]


> Vick © (10.11.03 15:18)

Это событие срабатывает на прорисовку каждой ячейки грида. Посчитай сколько их (видимых) - столько раз и сработает.
Плюс на каждый чих отрабатывает перерисовка грида.


 
Vick   (2003-11-10 15:26) [2]

> Vlad ©

Значит, чем больше у меня ячеек, тем больше верятность какой-нибудь гадости???


 
Vlad   (2003-11-10 15:28) [3]


> Vick © (10.11.03 15:26) [2]

Да нет, боюсь количество ячеек и вероятность гадости - никак не связаны друг с другом :)))


 
Vick   (2003-11-10 15:32) [4]

Все же непонятно как это действует на системные библиотеки????


 
Vlad   (2003-11-10 15:38) [5]


> Vick © (10.11.03 15:32) [4]

Возможно 17-я строка подскажет :)
http://podgoretsky.com/ftp/Language/nps/idioms.html


 
Vick   (2003-11-10 15:43) [6]

> Vlad ©

не смешно!!!!!! Да код ничего не скажет, потому что он, во-первых, правильный, во-вторых закономерность этих вылетов отследить нельзя - может каждые 5 мин случаться, а может и 3 мес работать без ошибок. Ну раз Вы так настаиваете, приведу все же код:

procedure Tw_Period_Comp.gehPeriod_CompDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
begin

for i := 0 to adsComp_Periods.Fields.Count - 1 do begin
if adsComp_Periods.Fields[i].AsString = "Итого" then begin
TDBGridEh(Sender).Canvas.Brush.Color := clYellow;
TDBGridEh(Sender).Canvas.Font.Style := [fsBold];
end;
if copy(adsComp_Periods.Fields[i].AsString, 1, 8) = "Сумма по" then begin
TDBGridEh(Sender).Canvas.Brush.Color := cl3DLight;
TDBGridEh(Sender).Canvas.Font.Style := [fsBold];
end;
end;

TDBGridEh(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;


 
Vlad   (2003-11-10 16:18) [7]

Vick © (10.11.03 15:43) [6]

Во те на ! И это исполняется на отрисовку каждой ячейки !
Или поясните что тут происходит, в этой процедуре, или я бы отшлепал по попе автора этого кода.
Конкретно меня интересует, adsComp_Periods - это тот набор данных что подключен к гриду или другой ?


 
Vick   (2003-11-10 16:39) [8]

adsComp_Periods - он самый, а что не нравиться???

да ему хоть
if Column.FieldName <> "OPLACHENO" then
TDBGridEh(Sender).Canvas.Font.Style := [fsBold];


внутри напиши - одна шана.....


 
Vlad   (2003-11-10 16:50) [9]

Цикл по всем полям внутри процедуры зачем устраивать ?

procedure Tw_Period_Comp.gehPeriod_CompDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
begin
with TDBGridEh(Sender) do begin
if (Column.FieldName="ITOGO") and Column.Field.AsString="Итого") then
begin
Canvas.Brush.Color := clYellow;
Canvas.Font.Style := [fsBold];
end;
........... итд.

end;

TDBGridEh(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);

end


 
Vlad   (2003-11-10 16:52) [10]

Скобку забыл, сорри

if (Column.FieldName="ITOGO") and (Column.Field.AsString="Итого") then


 
Sandman25   (2003-11-10 16:53) [11]

Еще лучше установить у нужного Column Tag в некоторое значение. Не надо будет дважды asstring проверять.


 
Vick   (2003-11-10 17:13) [12]

Ребят, в данном случае, запрос динамический с группировкой с Rollup и заранее неизвестно в какой из колонок будет написано "Сумма" или "Итого", и поле у меня так не называется... Это я просто привела пример из такого отчета, есть намного проще, просто меняется цвет в зависимости от того, процент больше 100 или меньше.

У меня просто был вопрос, влияет ли как-то перерисовка на систему???


 
Vlad   (2003-11-10 17:23) [13]


> У меня просто был вопрос, влияет ли как-то перерисовка на
> систему???

А это уже тема далеко не одной бутылки пива. Да и не этого форума.
Кстати, в Вашем случае все равно цикл не нужен. Подозреваю, тут достаточно проверять на соответствующие значения - "Сумма" или "Итого". Цикл по всем полям отнимает энное количество времени и ресурсов. При единичном выполнении он конечно не заметен, но когда это происходит сотни раз подряд (умножте кол-во строк на кол-во столбцов в отчете) это может вызвать некое замедление прорисовки, в результате чего получим "мерцание" в сетке грида.
Как уж это отразится на системе вцелом, сказать не могу, т.к. не изучал подробно исходники DBGrid"a


 
AlexG u e s t   (2003-11-10 17:30) [14]


> У меня просто был вопрос, влияет ли как-то перерисовка на
> систему???

Нет. Сама перерисовка не влияет на систему. Но надо смотреть на все операции, которые делаются при перерисовке, так как это ОЧЕНЬ ЧАСТОЕ событие.
На событие перерисовки не стоит делать слишком долгих операций. Их наличие может притормаживать работу программы.
В Вашем случае явный перебор. Понимаете, что получается, на перерисовку КАЖДОЙ ячейки Вы пробегаетесь по ВСЕМ полям набора данных и анализируете их, даже те, которые не имеют никакого отношения к той ячейке, которая сейчас перерисовывается.
Это нужно убрать. И только потом смотреть, остаются глюки или нет.


 
Vick   (2003-11-10 17:30) [15]

Да мерцания собственно нет, и шустренько вроде работает... У меня просто возникает подозрение, что это АДО может баловаться.


 
Vlad   (2003-11-10 17:45) [16]

Не думаю, что это ADO. Ведь вы в своей процедуре используете методы и свойства TDBGrid и TDataSet, а не ADO как такового.
И еще у меня есть маленькое подозрение по поводу переменной i.
Судя по всему она у вас глобальная. Проверьте, не задействована она где нибудь еще, не используются ли где-нибудь указатели на нее, вобще не советовал бы так делать.


 
Vick   (2003-11-10 18:30) [17]

>Vlad ©

Переменная i на самом деле определена в процедуре, я при копировании ее нечаянно пропустила...
А про АДО, я имела в виду, может это совсем не из-за перерисовки происходит. Просто, когда у юзеров выскакивает такая ошибка, они ведь не запоминают, что они делали в последний момент, то ли отчет строили, то ли данные заносили, то ли в игрушки играли, и моя программа не выдержала и дала сбой, а может и не моя программа :(, т.к. пишет что "Приложение "Мое" вызвало ошибку в памяти по адресу такому-то", либо "произошла ошибка в модуле user32.dll" и т.п.


 
Vlad   (2003-11-10 18:38) [18]

Сложно сказать, боюсь это действительно вопрос не этого форума, т.к. с БД это врядли связано.
Попробуйте в "общие вопросы", там наверняка помогут :)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.009 c
11-89799
Kobik
2003-03-20 20:32
2003.11.27
KOL+DirectX


8-90007
pasha676
2003-07-30 14:32
2003.11.27
WDM капчур. Свойства фильтров


1-89942
Pert
2003-11-17 21:29
2003.11.27
из Edit a в переменную


3-89769
Chaked
2003-11-07 11:53
2003.11.27
Как убрать пробелы


3-89736
jonni
2003-11-09 05:15
2003.11.27
Key collumn information is insuficient or incorrect...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский