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

Вниз

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

 
DelphiLexx ©   (2007-01-09 12:40) [0]

В OnDrawColumnCell  я веду отрисовку грида, при потере фокуса (т.е. данного окна двигаю окно другой проги) отрисовка перестает работать т.е. скорее всего не посылается сообщение WM_PAINT. Вопрос: Как заставить прорисовываться грид даже если окно теряет фокус.


 
KSergey ©   (2007-01-09 14:48) [1]

Чета так не бывает.

Я знаю только один случай: когда при движении "окна другой проги" этот процесс отъедает существенную часть системных ресурсов (на данной системе) - тогда Windows действительно перестает отрисовывать нижележащие окна. Но как тольео перетаскивание завершается - все окна тут же отрисовываются.

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


 
evvcom ©   (2007-01-09 16:32) [2]

Либо компоненты левые.
Что за грид?


 
DelphiLexx ©   (2007-01-10 08:53) [3]


> Либо компоненты левые.
> Что за грид?

DBGridEh.
См. рисунок http://www.rsdn.ru:80/File/26841/picture.JPG там отображен момент когда я двигаю калькулятор на фоне грида


 
ЮЮ ©   (2007-01-10 08:58) [4]


> DelphiLexx ©   (10.01.07 08:53) [3]


Калькулятор повыше будет стертой полосы. Т.е. часть строк перерисовывается, а часть нет?


 
DelphiLexx ©   (2007-01-10 09:49) [5]


> Калькулятор повыше будет стертой полосы. Т.е. часть строк
> перерисовывается, а часть нет?

Посмотри еще раз рисунок http://www.rsdn.ru:80/File/26841/picture.JPG я там внес некоторые изменения, которые все объясняют


 
DelphiLexx ©   (2007-01-10 09:52) [6]


> Калькулятор повыше будет стертой полосы. Т.е. часть строк
> перерисовывается, а часть нет

Строки перерисовываются всегда а вот прост-во между Footer"ами и последней строкой грида нет


 
KSergey ©   (2007-01-10 10:02) [7]

Нафиг рисунки (к стати, все едино не понятно что в них не так).
Код! Код давай!


 
DelphiLexx ©   (2007-01-10 10:18) [8]


> Нафиг рисунки (к стати, все едино не понятно что в них не
> так).
> Код! Код давай!

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

begin
 
  {Здесь располагается код отрисовки вертикальных разделителей ячеек   грида - приводит его я не стал потому, что они корректнно отрисовывываются}
  ....

  {VSize - позиция последней строки ну т.е. Rect.Bottom последней строки}
  VSize := _DrawInfo.Vert.FixedBoundary +
     FIBDataSet.RecordCount * (TDBGridEh(Sender).RowHeight + 1) - 1;
     
  MoveTo(Rect.Left-1, VSize);
  LineTo(Rect.Left-1, TDBGridEh(Sender).Width);
  MoveTo(Rect.Right, VSize);
  LineTo(Rect.Right, TDBGridEh(Sender).Width);
end;


 
Плохиш ©   (2007-01-10 10:46) [9]

Есть подозрение, что надо в OnPaint формы надо вызывать перерисовку грида. Потому что, не логично требовать вызова OnDrawColumnCell для несуществующих ячеек.


 
DelphiLexx ©   (2007-01-10 10:55) [10]


> Есть подозрение, что надо в OnPaint формы надо вызывать
> перерисовку грида. Потому что, не логично требовать вызова
> OnDrawColumnCell для несуществующих ячеек.

OnPaint не срабатывает, когда форма неактивна.


 
ЮЮ ©   (2007-01-10 11:13) [11]


> OnPaint не срабатывает, когда форма неактивна.

А почему, она, по-твоему, все-таки перерисовывается, когда Калькулятором по ней водишь?

Т.к. ты рисуешь их сам, то,следовательно, у грида они отключены?

 {Здесь располагается код отрисовки вертикальных разделителей ячеек   грида - приводит его я не стал потому, что они корректнно отрисовывываются}

И именно они и не отрисовываются в твоем случае :)


 
KSergey ©   (2007-01-10 11:22) [12]

О, вот теперь я въехал!
Так вы в OnDrawColumnCell пытаетесь рисовать то, что вне ячейки?
Это совершено, отсюда и проблема.
(На самом деле указанная ситуация присутствует  когда окно активно, просто вы этого не замечаете, т.к. OnDrawColumnCell для каких-нибудь ячеек все же вызывается, а после стирать уже некому. Ну и, кроме того, если этим калькулятором при движении пересекать область ячеек грида - то тоже все должно нормально отрисывываться.)
Одним словом, так желать нельзя. В OnDrawColumnCell допустимо отрисовывать только область одной указанной ячейки и ничего сверх того, т.к. грид как раз анализирует в своем WM_PAINT (которое приходит в любом случае, к стати!) какая область подлежит отрисовке и вызывает OnDrawColumnCell с соотв. параметрами необходимое кол-во раз. Но не более. Если обрасть ячеек не нуждается в отрисовке - OnDrawColumnCell не вызывется вовсе.

Теперь к вопросу "что делать".

I. Еще раз хорошенько подумайте так ли оно критично. Ну не предназначен дял этого дельфийский грид, увы. Хотя мне тоже всегда очень не нравилась эта его "особенность".

II. Если все же очень хоцца, то я вижу 3 пути:
1) Поискать более подходящее событие отрисовки, правда есть у меян сильное подозение, что такового просто несуществует. Может есть какое-то "поколоночное" подходящее событие? Или для всего грида в целом?

2) Залезть в исходники DBGridEh и посмотреть в каком месте это все разруливается и добавить туда свое событие типа "onDrawNonCellSpace", которое как раз будет вызываться в нужный момент. Ну и уже либо подхачить исходники DBGridEh, либо сделать наследника - это по вкусу. хотя, вполне возможно, в наследнике придется чать кода копировать - шибко любят все в првиватные методы пихать... Потому путь "корректировать" исходники DBGridEh мне в свое время больше нравился.

3) Вариант 2-го пункта, различна только реализация: подменить обработчик WM_PAINT грида в приложении на свой (т.е. обработчик OnPaint или вовсе всю оконную ф-цию грида, где отлавливать WM_PAINT), туда вынести необходимую логику отрисовки, не забывая вызывать родной обработчик, конечно же.


 
KSergey ©   (2007-01-10 11:23) [13]

> KSergey ©   (10.01.07 11:22) [12]
> О, вот теперь я въехал!
> Так вы в OnDrawColumnCell пытаетесь рисовать то, что вне
> ячейки?
> Это совершено, отсюда и проблема.

Гы :)
"Это совершенно неправильно!" хотелось мне написать :)


 
KSergey ©   (2007-01-10 11:27) [14]

> Еще раз хорошенько подумайте так ли оно критично. Ну не
> предназначен дял этого дельфийский грид, увы. Хотя мне тоже
> всегда очень не нравилась эта его "особенность".

Во фразе "не предназначен для этого" имелось в виду, что дельфийский грид не отрисовывает что-либо вне области ячеек, кроме фона, увы... И уж немболее не предполагает кастомизацию.
Хотя, в DBGridEh это все едино здорово похачено (отрисовывается же footer), так что... дерзайте :)


 
Плохиш ©   (2007-01-10 11:29) [15]

Путь 4) При получении WM_Paint формой сказать "Грид перерисуйся! Aть, два" ;-)


 
KSergey ©   (2007-01-10 11:40) [16]

> Плохиш ©   (10.01.07 11:29) [15]
> Путь 4) При получении WM_Paint формой сказать "Грид перерисуйся!
>  Aть, два" ;-)

Я читал это ваше сообщение, имею высказать против:
1) не факт, что форма получит WM_PAINT, когда чего-то ползает только по области грида (по-моему и вовсе не получит)
2) представьте, ползаешь вот так вот калькулятором - а тама грид весь постоянно нервно перерисовывается, по DataSet бегаем, суммы перевычисляем.... Караул какой-то получается :)


 
Плохиш ©   (2007-01-10 11:57) [17]


> KSergey ©   (10.01.07 11:40) [16]
> > Плохиш ©   (10.01.07 11:29) [15]
> > Путь 4) При получении WM_Paint формой сказать "Грид перерисуйся!
>
> >  Aть, два" ;-)
>
> Я читал это ваше сообщение, имею высказать против:
> 1) не факт, что форма получит WM_PAINT, когда чего-то ползает
> только по области грида (по-моему и вовсе не получит)

А посмотреть на посылаемые приложению сообщения?

> 2) представьте, ползаешь вот так вот калькулятором - а тама
> грид весь постоянно нервно перерисовывается, по DataSet
> бегаем, суммы перевычисляем
.... Караул какой-то получается
> :)

При перересовке грида? Ну тогда кодер есть ССЗБ :-) и мине его совершенно не жалко, т.к. пользователей для своей программы он всё-равно не найдёт :-)


 
KSergey ©   (2007-01-10 15:16) [18]

> Плохиш ©   (10.01.07 11:57) [17]
> > 1) не факт, что форма получит WM_PAINT, когда чего-то
> ползает
> > только по области грида (по-моему и вовсе не получит)
>
> А посмотреть на посылаемые приложению сообщения?

Ладно, ладно. Верю. Смотреть не досуг, простите. :)

> Плохиш ©   (10.01.07 11:57) [17]
> > 2) представьте, ползаешь вот так вот калькулятором - а
> тама
> > грид весь постоянно нервно перерисовывается, по DataSet
>
> > бегаем, суммы перевычисляем.... Караул какой-то получается
>
> При перересовке грида? Ну тогда кодер есть ССЗБ :-) и мине
> его совершенно не жалко, т.к. пользователей для своей программы
> он всё-равно не найдёт :-)

Я так понял вам не понравилось "суммы перевычисляем". Ну ладно, это я так, для пущей страшности :) Но ведь для пере-отрисовки всего грида - все же ведь придется побегать и т.п...
Так что  все же не считаю, что это хорошая идея (переотрисовывать весь грид постоянно).
Другое дело просто как точка, за которую прицепиться... Хотя и тут не вижу ее особо привлекательной.



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

Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.052 c
15-1167509299
vasIZmax
2006-12-30 23:08
2007.01.28
Распечатать текст программы...


3-1162375002
Владимир71
2006-11-01 12:56
2007.01.28
dbf в fdb


2-1168690267
AlexanderMS
2007-01-13 15:11
2007.01.28
Как ProgressBar поместить на одну из панелей StatusBar?


15-1168179208
kaZaNoVa
2007-01-07 17:13
2007.01.28
Ищу реализацию RSA - алгоритма на PHP


2-1168079153
Patrick
2007-01-06 13:25
2007.01.28
Дробные числа





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