Форум: "Базы";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];
ВнизМигает 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.015 c