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

Вниз

Мигает DBGrid   Найти похожие ветки 

 
LinOS ©   (2003-12-08 13:48) [0]

Кважаемые мастера.
Есть два DBGrid`а. при навигации в первом гриде выполняется
процедура AfterScroll в которой выполняется запрос. Данные этого запроса отображаются во втором гриде. МОжно ли сделавть, что бы при навигации в первом гриде второй не моргал?


 
NAlexey ©   (2003-12-08 13:49) [1]

Прогнозирую не меньше 3 постов исключая мой.


 
Shirson ©   (2003-12-08 14:23) [2]

Не проще ли связать источники этих гридов по DataSource?


 
Silver Alex ©   (2003-12-08 14:32) [3]

не совсем понятно что к чему, но может это пойдет

with DataSet do
try
DisableControls;
...
finally
EnableControls;
end;


 
LinOS ©   (2003-12-09 12:40) [4]

// with DataSet do
// try
// DisableControls;
// ...
// finally
// EnableControls;
// end;
Это не помогает.


 
Alex_Bredin ©   (2003-12-09 12:49) [5]

как же он не будет моргать, если НД каждый раз заново открывается?
тут другой вопрос уместен- а оправдано ли такое решение?
может запрос лучше выполнять один раз(по кнопке например)


 
HSolo ©   (2003-12-09 13:04) [6]

Бросьте на форму TTimer.
В его OnTimer - выполняйте запрос и Timer.Enabled := false;
В AfterScroll - Timer.Enabled := true;
И подберите интервал таймера - через какое время после окончания навигации выполнять запрос.


 
LinOS ©   (2003-12-09 13:06) [7]

// может запрос лучше выполнять один раз(по кнопке например)

Это что, закачать всю таблицу, а потом фильтровать?
А если она очень большая?
В общем если я делаю для ClientDataSet Open потом новый запрос и
Close
Open
то никаким образом нельзя сделать что бы grid не моргал? Так?


 
HSolo ©   (2003-12-09 13:11) [8]

И для пущей красоты:
DBGrid.DataSource := nil;
выполняем запрос
DBGrid.DataSource := то-что-было;


 
Silver Alex ©   (2003-12-09 13:14) [9]

вместо AfterScroll можно попробовать DataSource.OnDataChange, кстати есть у меня компонент там как раз релизована такая задержка http://www.delphimaster.ru/cgi-bin/download.pl?get=1067936708&n=0


 
Alex_Bredin ©   (2003-12-09 13:27) [10]


> LinOS © (09.12.03 13:06) [7]
> // может запрос лучше выполнять один раз(по кнопке например)
>
> Это что, закачать всю таблицу, а потом фильтровать?
> А если она очень большая?
> В общем если я делаю для ClientDataSet Open потом новый
> запрос и
> Close
> Open
> то никаким образом нельзя сделать что бы grid не моргал?
> Так?


зачем закачивать всю таблицу? Вы выбираете из первого НД запись, жмете кнопку, формируете условие запроса и вытаскиваете на клиента записи, удовл. условию. Фильтровать - Боже упаси.


 
LinOS ©   (2003-12-09 13:57) [11]

> Вы выбираете из первого НД запись, жмете кнопку, формируете
> условие запроса и вытаскиваете на клиента записи, удовл.
> условию
Нет так не пойдет.
У меня два грида. При навигации в первом данные второго грида меняются. И что же мне после того как я встал на новую строку кнопку жать :/ ?


 
HSolo ©   (2003-12-09 14:15) [12]

> после того как я встал на новую строку кнопку жать :/ ?
Пусть таймер нажмет :))


 
Alex_Bredin ©   (2003-12-09 14:41) [13]

тогда

> HSolo © (09.12.03 14:15) [12]


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


 
Вованчик ©   (2003-12-09 15:20) [14]


> LinOS ©

а какой всетаки запрос? Напиши.
Может проше сделать как предлагает Shirson © (08.12.03 14:23) [2].
Да и судя по вопросу у тебя можно реализовать связь 1:М


 
HSolo ©   (2003-12-09 15:20) [15]

> Alex_Bredin © (09.12.03 14:41) [13]
Никто их не затрет, пока не сойдем с тек.записи
См. HSolo © (09.12.03 13:04) [6]


 
tchn ©   (2003-12-09 15:22) [16]

надо ж создать проблему из ничего! сцепляй запросы через DataSource, и не забудь написать в подчиненных запросах
select...where id=:id


 
Sandman25 ©   (2003-12-09 15:28) [17]

Columns у грида Persistent? Если нет, то он их каждый раз заново создает.


 
LinOS ©   (2003-12-10 05:55) [18]

Опишу подробнее.
Есть БД.
Есть приложение.
В приложении такая связка.
SQLConnection -> SQLDataSet -> DataSetProvider -> ClientDataSet -> DataSource -> DBGrid. (для каждого грида)
Так вот при открытии формы с двумя гридами для первого ClientDataSet пишу запрос и открываю. В процедуре AfterScroll для него пишу запрос для второго ClientDataSet (соотв. для второго грида) и открываю его (предварительно, если он был открыт, закрываю). Во второй запрос передается значение поля из первого ClientDataSet.

> tchn ©
Вы уж извеняйте меня, но никак не могу понять фразы:
сцепляй запросы через DataSource.


 
Вованчик ©   (2003-12-10 08:10) [19]


> Вы уж извеняйте меня, но никак не могу понять фразы:
> сцепляй запросы через DataSource.

Посмотри у ClientDataSet свойство MasterSourse :)
Нужно просто указать поля для связи двух таблиц и все ...

Удачи


 
Danilka ©   (2003-12-10 09:19) [20]

привяжи второй ClientDataSet как датальную таблицу к первому, и будет тебе щастье :))

Подробнее - см. хелп по свойствам MasterSource и MasterFields у ClientDataSet.


 
Silver Alex ©   (2003-12-10 10:13) [21]


> LinOS ©

слушай, не пойму, в чем именно проблема.Вобщем ты все верно делаешь.Но когда бежишь (быстро) по первому гриду, во втором постоянно делается обновление(закрывается и окрывается), так? А ты не хочешь чтобы он постоянно рефрешился? Ты хочешь это побороть?


 
Alex_Bredin ©   (2003-12-10 11:14) [22]


> Danilka © (10.12.03 09:19) [20]
> привяжи второй ClientDataSet как датальную таблицу к первому,
> и будет тебе щастье :))
>
> Подробнее - см. хелп по свойствам MasterSource и MasterFields
> у ClientDataSet.


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


 
nik222   (2003-12-10 11:25) [23]

LinOS - предлагаю следующее решение (которое реально используется на практике)

кидаешь на форму TTimer и в обработчике onTimer пишешь
QueryDetal.close
.... новое условие запроса
QueryDetal.Open

Или
QueryDetal.filter:=.. новый фильтр
QueryDetal.filterd:=false
QueryDetal.filterd:=true

В обработчике QueryMaster AfterScroll пишешь
Timer1.Enabled:=false
Timer1.Enabled:=true

Значение времени задержи 1000 мс (можно и изменить)
Что получается -
если юзер быстро бегает по grid-у то фильтр не успевает сработать
(просто не вышло время Timer)
Как только юзер остановися больше чем на 1 сек, то сразу получил
нужный результат
Моих клиентов это очень устраивает


 
Danilka ©   (2003-12-10 11:29) [24]

[22] Alex_Bredin © (10.12.03 11:14)
> если я все правильно понимаю, особой разницы между тем,
> что делает автор поста и связкой через MasterSource нет
> - параметрические запросы выполняются и там и там, способы
> только разные. Проблема-то в другом.


угу, получается одно и тоже, только когда делаешь как автор на AfterScroll то моргает, а когда так как я написал - не моргает. :))
я сам раньше завязвался на AfterScroll, замучился бороться с морганием, а оказалось - как все просто. :))


 
Alex_Bredin ©   (2003-12-10 11:36) [25]

Сорри за оффтоп
2 Danilka

кроме шуток,а чем это объясняется?


 
LinOS ©   (2003-12-10 11:42) [26]

>Silver Alex
Точно так.


 
Danilka ©   (2003-12-10 11:44) [27]

[25] Alex_Bredin © (10.12.03 11:36)
понятия не имею :))
лень копаться в исходниках, смотреть как они это организовали.


 
LinOS ©   (2003-12-10 11:51) [28]

> Danilka © (10.12.03 09:19) [20]
> привяжи второй ClientDataSet как датальную таблицу к первому, и будет тебе щастье :))

Привязать то я привяжу, а куда выполнение запроса писать, в этом случае, что-то не пойму.


 
Dimosha   (2003-12-10 11:54) [29]

lockwindowupdate(dbgrid1.handle);
...
...
...
lockwindowupdate(0);


 
Silver Alex ©   (2003-12-10 11:56) [30]


> LinOS © (10.12.03 11:42) [26]

Слушай, не хочу навязываться.Но я уже тебе говорил, есть компонент.Там реализована именно задержка события OnDataChange. То что ты делаешь на DataSet.OnAfterScroll можно повесить на DataSource.OnDataChange.Так в компоненте реализована именно задержка этого события на сколько-то милисекунд.Т.е. ты перемещаешься по гриду с первой записи на двадцатую, так вот событие OnDataChange произойдет не 20 раз а меньше, может 4, а может один как настроишь таймаут.Возьми попробуй, если поможет буду рад http://www.delphimaster.ru/cgi-bin/download.pl?get=1067936708&n=0
P.S. если будут вопросы напиши мне


 
LinOS ©   (2003-12-10 12:05) [31]

> Silver Alex ©
Спасибо, я не сомневаюсь что поможет, но в итоге все равно грид моргнет потому как ClientDataSet закрываю и открываю, что бы выполнить новый запрос. Или нет?


 
Silver Alex ©   (2003-12-10 12:18) [32]


> LinOS © (10.12.03 12:05) [31]

вот так рефрешь,у меня не моргает или я не понимаю что значит моргнет

procedure RefreshDet;
begin
with DataSet do
try
DisableControls;
Close;
Open;
finally
EnableControls;
end;

end;


 
Vemer ©   (2003-12-10 12:32) [33]

Может быть повторюсь, но такого решения здесь не заметил.
Мигание Грида часто можно убрать, если на время действий с его данными делать сначала DataSource.Enabled := False, а после действий - True, ведь за связь c визуальными компонентами именно он отвечает. Я даже специально проверял, при ручной прописке связи мастер-детайл мигало меньше, чем при стандартной связке через поле.


 
LinOS ©   (2003-12-10 12:35) [34]

Все, разобрался.
действительно
DisableControls;
EnableControls;
работает, только моргал из-за, того что после него менял ширину Visible колонок.
Сейчас создал все необхоримые колонки которые будут в запросе в OnCreate и там задал их парамтры. После этого перестало моргать.

Всем большое спасибо за полезные советы.



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

Текущий архив: 2004.01.09;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.024 c
3-25199
zergey
2003-12-12 10:54
2004.01.09
Доступ к нескольким книгам Excel


1-25421
AlexeyITN
2003-12-24 12:08
2004.01.09
Палистра компонентов пуста :(


8-25458
NikNik
2003-09-07 23:11
2004.01.09
Графическое изображение Wav-файла?


14-25505
vajo
2003-12-16 16:58
2004.01.09
Delphi + Реестр


4-25645
ASGroup
2003-11-06 20:37
2004.01.09
Как отловить создание нового окна?