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

Вниз

Уменьшить мерцание DBGrid a при перемещении курсора   Найти похожие ветки 

 
DelphiLexx ©   (2006-08-08 09:01) [0]

DBGrid у меня отображает некоторые строки разными цветами. При перемещении курсора у меня в AfterScroll"e вызывается Refresh DBGrid"a (так нужно), что приводит к мерцанию.
Как уменьшить мерцание DBGrid"a при перемещении курсора?


 
Sergey13 ©   (2006-08-08 09:05) [1]

> (так нужно)
Зачем, если не секрет?


 
ANB ©   (2006-08-08 09:15) [2]


> Как уменьшить мерцание DBGrid"a при перемещении курсора?

Убрать рефреш в AfterScroll


 
DelphiLexx ©   (2006-08-08 09:16) [3]


> > (так нужно)
> Зачем, если не секрет?

Не секрет. При установки курсора на опреденные строки у меня в DBGrid"e выделяются зеленым цветом группы строк, при уходе с этих выделение соответственно пропадают.


 
DelphiLexx ©   (2006-08-08 09:17) [4]


> > Как уменьшить мерцание DBGrid"a при перемещении курсора?
>
>
> Убрать рефреш в AfterScroll

Ты вопрос прочитай.


 
Sergey13 ©   (2006-08-08 09:20) [5]

> [3] DelphiLexx ©   (08.08.06 09:16)

Ты слишком многого хочешь, ИМХО. При этом ты ставишь противоречивые условия - говоришь обновись, но не мерцая.
Тебе наверное надо переделать это дело на М-Д связку в двух датасетах (и гридах соответственно).


 
DelphiLexx ©   (2006-08-08 09:25) [6]


> При этом ты ставишь противоречивые условия - говоришь обновись,
>  

Ну есть же способы:
например, у многих компонентов от данного гемороя спасает DoubleBuffered = true. Правда DBGrid"у он не помагает.


 
MsGuns ©   (2006-08-08 09:29) [7]

>DelphiLexx ©   (08.08.06 09:16) [3]
>При установки курсора на опреденные строки у меня в DBGrid"e выделяются зеленым цветом группы строк, при уходе с этих выделение соответственно пропадают.

Для того, чтобы запоминать "выделенные" записи, одного грида недостаточно


 
evvcom ©   (2006-08-08 09:34) [8]

> [3] DelphiLexx ©   (08.08.06 09:16)

Напиши свой Refresh (унаследуйся от DBGrid)


 
ANB ©   (2006-08-08 09:43) [9]


> Ты вопрос прочитай.

Я прочитал. :)
Совет прежний.

А если серьезно - неудачная идея с таким интерфейсом (при перемещении по гриду его весь рефрешить постоянно).


 
PEAKTOP ©   (2006-08-08 10:39) [10]

Непонятно только зачем в AfterScroll вызывать метод Refresh.
Перекрытие стандартоного метода прорисовки, как правило, хватает выше крыши, если требуется выделить какие-то там условные данные (например, просроченные накладные), а в противном случае - вызываем родительский метод прорисовки.

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 if ({условие})then
   begin
   ........
   end
 else
   inherited
end;


 
evvcom ©   (2006-08-08 10:51) [11]

> [10] PEAKTOP ©   (08.08.06 10:39)

Очень часто бывает, что DBGrid1DrawColumnCell срабатывает только на ячейки записей, с которой ушли и на которую пришли, потому как грид/система считает, что только они изменились, что только их и надо перерисовывать. Кстати, ты путаешь обработчики событий и перекрытие стандартных методов. Это очень разные понятия.


 
PEAKTOP ©   (2006-08-08 10:58) [12]

не путаю, просто DBGrid-oм пользовался последний раз 300 лет назад. Я лично предпочитаю DBGridEh, там есть DBGridEh.OnGetCellParams, причем в одном проекте у меня вообще все строчки разноцветные, где цвет фона и шрифта возвращается набором данных. И нечего, соотвественно, не моргает.

 procedure TForm1.dbgJrnlGetCellParams(Sender: TObject; Column: TColumnEh;
             AFont: TFont; var Background: TColor; State: TGridDrawState);
 begin
   if(not(Column.Field.DataSet.Active)or(Column.Field.DataSet.RecordCount=0))then exit;  
   if    (Column.Field.DataSet.FieldByName("FLAG_COMMIT").AsInteger=0)then aFont.Style:= aFont.Style + [fsBold     ];
   Background := Column.Field.DataSet.FieldByName("DOCTYPE_COLOR_BGR").AsInteger;
   aFont.Color:= Column.Field.DataSet.FieldByName("DOCTYPE_COLOR_FRG").AsInteger;
   if Background =clWhite then Background := Amunhotep_MainForm_StyleManager.Colors.Window;
 end;


 
Плохиш ©   (2006-08-08 11:03) [13]


> PEAKTOP ©   (08.08.06 10:58) [12]

Ты вопрос-то внимательно читал? Особенно слова "При установки курсора на опреденные строки у меня в DBGrid"e выделяются зеленым цветом группы строк"

> DelphiLexx ©   (08.08.06 09:25) [6]

Рекомендую использовать компьютер самой последней модели, тогда мерцания перестанешь замечать.


 
Desdechado ©   (2006-08-08 11:10) [14]

Вызывать refresh не каждый раз, как переходишь со строки на строку.
А, например, при выполнении условия, которое требует перерисовки (т.е. когда надо подкрасить или снять подкраску). Еслитаких случаев мало, мерцать будет меньше.


 
evvcom ©   (2006-08-08 11:17) [15]

> [14] Desdechado ©   (08.08.06 11:10)

Лучше все же, думаю, свой MyRefresh написать без популярной в данном случае полной очистки фона.


 
DelphiLexx ©   (2006-08-08 11:20) [16]


> Вызывать refresh не каждый раз, как переходишь со строки
> на строку.
> А, например, при выполнении условия, которое требует перерисовки
> (т.е. когда надо подкрасить или снять подкраску). Еслитаких
> случаев мало, мерцать будет меньше.

А где это условие разместить?


 
DelphiLexx ©   (2006-08-08 11:20) [17]


> Лучше все же, думаю, свой MyRefresh написать без популярной
> в данном случае полной очистки фона.

Ну и как должен выглядеть код MyRefresh?


 
DelphiLexx ©   (2006-08-08 11:23) [18]


> DBGridEh.OnGetCellParams

Я тоже пользуюсь DBGridEh, а в каких случаях генерируется событие OnGetCellParams?


 
Desdechado ©   (2006-08-08 11:45) [19]

> А где это условие разместить?
Логично предположить, что перед вызовом Refresh, не так ли?

evvcom ©   (08.08.06 11:17) [15]
Автор же просил "Уменьшить мерцание DBGrid"a", а не избавиться о него полностью :))


 
evvcom ©   (2006-08-08 14:05) [20]

> [17] DelphiLexx ©   (08.08.06 11:20)
> Ну и как должен выглядеть код MyRefresh?

Смотришь как реализован Refresh, находишь очистку фона. Пишешь аналогичную MyRefresh, но без очистки фона. Долго и муторно вылавливаешь глюки. Или предлагаешь мне за тебя проделать сию работу?

> [19] Desdechado ©   (08.08.06 11:45)
> а не избавиться о него полностью :))

О, да... Я этого не учел. :)


 
sniknik ©   (2006-08-08 14:22) [21]

не надо ничего переписывать... оно и так не мерцает... (чтото делаю не так?)


 
evvcom ©   (2006-08-08 14:36) [22]

> [21] sniknik ©   (08.08.06 14:22)
> оно и так не мерцает... (чтото делаю не так?)

Сам не пробовал... А может у тебя машинка супер-пупер интел-пень > 3ГГц? :-)


 
Silver... ©   (2006-08-09 14:46) [23]


> При перемещении курсора у меня в AfterScroll"e вызывается
> Refresh DBGrid"a (так нужно), что приводит к мерцанию.


при этом изменяются данные в DataSet-е?
не пойму зачем Refresh


 
evvcom ©   (2006-08-09 14:49) [24]

> [23] Silver... ©   (09.08.06 14:46)
> не пойму зачем Refresh

Чтобы раскрасить ВСЕ строки грида уже ДРУГИМИ цветами.


 
zdm ©   (2006-08-09 14:56) [25]

DBGridEh форева


 
Silver... ©   (2006-08-09 15:01) [26]


> Чтобы раскрасить

при чем тут Refresh

как красишь?


 
Silver... ©   (2006-08-09 15:07) [27]

в догонку ...

при этом изменяются данные в DataSet-е?


 
evvcom ©   (2006-08-09 15:10) [28]

> [26] Silver... ©   (09.08.06 15:01)
> как красишь?

Крашу не я, а автор. Все же

> Чтобы раскрасить

правильнее было написать "Чтобы перекрасить"
Кстати данные в DataSet-е не меняются.


 
Silver... ©   (2006-08-09 15:34) [29]

> Крашу не я, а автор. Все же

имел ввиду как рялизована "перекраска"
a)  DBGrid1.OnDrawCollumnCell
b)  DBGrid1.OnDrawDataCell
c)  иное

>Кстати данные в DataSet-е не меняются

если  a)  или  b) то Refresh не нужен (...хотя сначала раскажи о методе раскраски, потом поговорим)

... или ты Refresh для перерисовки вызываесь (попытка телепнуть) тогда Invalidate


 
evvcom ©   (2006-08-09 15:46) [30]

> [29] Silver... ©   (09.08.06 15:34)
> имел ввиду как рялизована "перекраска"

Аткель я знаю, как реализована у автора перекраска?

> если  a)  или  b) то Refresh не нужен

Для того, что нужно автору, нужен. Обработчики OnDraw* вызываются только для тех строк, которые грид считает нужным перерисовать. Если происходит перемещение курсора с одной строки на другую, то грид считает, что надо перерисовать строку, с которой курсор ушел, и строку, на которую пришел. Автору же требуется ПЕРЕРАСКРАСИТЬ ВСЕ строки грида, обозначая особым цветом все строки с параметром (-ами), схожим(и) с текущей выделенной строкой. Может я уже чего и не помню про стандартный грид, давно не юзал, но вроде все так.


 
Silver... ©   (2006-08-09 16:00) [31]

в место DataSet.Refresh - DbGrid1.Invalidate/Repaint (не помню точно как там правильней глянь в справку)


 
DelphiLexx ©   (2006-08-09 16:20) [32]


> в место DataSet.Refresh - DbGrid1.Invalidate/Repaint (не
> помню точно как там правильней глянь в справку)

А разницы собственно нет т.к. Refresh вызывает Repaint.


 
evvcom ©   (2006-08-09 16:25) [33]

> [31] Silver... ©   (09.08.06 16:00)
> глянь в справку

На фиг мне это? Я в подобных случаях обычно Invalidate вызывал, но в некоторых случаях этого недостаточно. Нужен тщательный анализ VCL в частности TDBGrid. И хорош писать свои посты в духе, будто это я вопросы задаю, и я жду ответа на [0]. Я свои предложения уже в [8] изложил, не переубеждая автора использовать один метод вместо другого.

> в место DataSet.Refresh

Вообще-то до сих пор я считал, что речь идет о DBGrid.Refresh, который вызывает в свою очередь Repaint :)
Только эти методы чистят целиком весь фон, из-за чего и наблюдается эффект мерцания, уменьшить который автор и возжелал в [0] :-)


 
sniknik ©   (2006-08-09 16:40) [34]

> Нужен тщательный анализ VCL
искать где светлее? а код автора значит "ака невиная овечка в этом плане", ну вот не может сей "титан мысли" лажу написать... ага, верю. ;)

> Только эти методы чистят целиком весь фон, из-за чего и наблюдается эффект мерцания
не изза этого. выше вроде бы упоминалось о DoubleBuffered, и о том что мерцание и при нем есть? ...  ну какая разница чистится или нет в неотображаемом битмаме фон, для мерцания?


 
evvcom ©   (2006-08-09 16:46) [35]

> [34] sniknik ©   (09.08.06 16:40)
> > Нужен тщательный анализ VCL
> искать где светлее? а код автора значит "ака невиная овечка
> в этом плане", ну вот не может сей "титан мысли" лажу написать...
> ага, верю. ;)

:) Тщательный анализ VCL не для того, чтобы ТАМ ошибки найти, а чтобы у себя их не наделать неумелым перекрытием методов.


> выше вроде бы упоминалось о DoubleBuffered, и о том что
> мерцание и при нем есть?

Видимо пропустил или уже забыл. 35 постов уж воду в ступе толчем :)



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

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

Наверх





Память: 0.54 MB
Время: 0.055 c
15-1158505411
Tirael
2006-09-17 19:03
2006.10.08
чайник


15-1158157573
oldman
2006-09-13 18:26
2006.10.08
Надо купить комп. Все новые камни уже 64.


15-1157984994
Alx_
2006-09-11 18:29
2006.10.08
"Потрепаться" перестала загружаться в Magic Forum(1.2)


2-1158399969
stfu
2006-09-16 13:46
2006.10.08
Поиск по имени и столбцу в StringGrid..


6-1147857716
alb67
2006-05-17 13:21
2006.10.08
Ошибка при пинге





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