Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.011 c
4-25646
SH
2003-10-07 17:47
2004.01.09
Свой монитор сетевых подключений. Как?


3-25191
Denisiy
2003-12-12 15:11
2004.01.09
НД для временного хранения записей - присоветуете ?


14-25536
Ega23
2003-12-18 14:29
2004.01.09
Прогноз: Россия - Финляндия?


3-25253
ShadowSmart
2003-12-10 14:22
2004.01.09
Сжатие *.mdb через ADO


1-25332
незнайка
2003-12-22 10:37
2004.01.09
Окно MessageDlg и его расположение на экране...





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