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

Вниз

Scroll у TDBGrid   Найти похожие ветки 

 
mr. Lonely ©   (2006-07-23 13:00) [0]

Уважаемые Мастера. У меня возникла такая проблема:
на форме есть TDBGrid. подключаю его к любой базе через связку TDataSource - TTable(TQuery). Скролл при этом в гриде может принимать только 3 значения: в начале, в конце и "где-то в середине". Что весьма не удобно.
Если подключать через TClientDataSet, то скролл нормально работает. Я не могу использовать TClientDataSet, тк базу подключаю по сети и в ней немеренно данных (пока TClientDataSet вытягивает все данные все "висит").
Помогите мне решить проблему: Как сделать нормальный скролл у TDBGrid при продключении его через TTable(TQuery).


 
Anatoly Podgoretsky ©   (2006-07-23 13:08) [1]

Скролл может принимать столько значений, на сколько у него хватает информации. С TTable(TQuery) хватает только на три значения. С Адо или на три или на множество. С TClientDataSet на множество.
К TDBGrid это не относится, работает как может.


 
sniknik ©   (2006-07-23 13:13) [2]

от TTable/TQuery не зависит, зависит от курсора, возможности получить значение recordcount в наборе... в локальном курсоре с выкаченными данными это значение есть, у серверного до завершения закачки (в итоге все одно на клиента перекачивается при Last или FetchAll например) нет (значение -1).
а если нет значения максимума то положение скрола относительно его расчитать сложновато... ;о)

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


 
sniknik ©   (2006-07-23 13:22) [3]

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


 
Desdechado ©   (2006-07-23 13:34) [4]

Думаю, тут надо думать не о положении ползунка, а о способах работы с БД.
Подключение таблицы целиком вообще обычно не имеет смысла.
Гораздо лучше спросить пользователя, что ему нужно в данный момент и сформировать динамически запрос на основаннии его желаний. Это даст немного строк (если желания нормальные, а не "давай все, там глазами найду"). Глазами более 200 строк просто бессмысленно высматривать, ибо оценить информацию в этом случае человек не в состоянии.
Поведение TTable, описанное тут, связано с тем, что выборка (а это все-таки выборка в случае "к любой базе") кэшируется БДЕ и подсовывается в грид по мере надобности. Поэтому это происходит быстро, но сколько строк получилось в ответе, неизвестно, пока все не вычитаются. Из-за этого только 3 состояния.
Поведение TClientDataset по умолчанию сводится к вычитыванию сразу всей выборки, т.е. количество строк сразу известно, отсюда и плавное поведение бегунка. Но есть у него такое свойство PacketRecords, которое отвечает за чтение по частям. При этом не теряется плавное поведение бегунка. Но! Предупреждаю сразу, что дочитывание происходит асинхронно, поэтому все равно не рекомендую пихать в CDS сразу всю таблицу.
Сначала запрос с ограничением кол-ва строк, потом уже CDS.


 
mr. Lonely ©   (2006-07-23 14:34) [5]

Уважаемый Desdechado, на форме имеется система фильтров и сортировок, которые как раз и должны помочь пользователю отсортиртировать и отфильтровать таблицу так как ему хочется, для упрощения поиска нужной записи. Заранее это спрашивать нельзя. причем по предметной области пользователь будет чаще пользоваться сортировкой чем фильтром.
to sniknik: да я обязательно попробую ADODataSet.
Так же можно попробовать перекрыть класс и перехватывать сообщения о перемещении курсора. Самому высчитывать положение курсора.
У меня новая проблема: как-то "вдруг" стало все работать с TTable и TQuery. причем вроде это произошло после того как я перекомпилил модуль DBGrid. хотя я не уверен. Странно но я уже 20 минут пытаюсь вернуть проблему :) пока скрол упорно работает как надо. возможно потому что я испоьзую стандартную БД BCDEMOS для тестиования... ничего не понимаю :(


 
Anatoly Podgoretsky ©   (2006-07-23 14:39) [6]

А сначал тянем мегатонны мусора, весьма умно.
Почему заранее спрашивать нельзя, еще как можно и нужно.

Так же можно попробовать перекрыть класс и перехватывать сообщения о перемещении курсора. Самому высчитывать положение курсора.
Ну попробуй :-)


 
sniknik ©   (2006-07-23 14:50) [7]

> to sniknik: да я обязательно попробую ADODataSet.
не все так просто, попробую. ;о) да у него настроек, на четыре разнотипных компонент хватит... если не знаеш его то попросту не сможеш настроить.

> как-то "вдруг" стало все работать с TTable и TQuery.
если поменял базу то неудивительно. говорю же, не зависит от компонент, зависит от курсора, есть или нет значения recordcount (и recno тоже), а это уже зависит от того какая база, тип, есть для нее у движка режимы клиентский/серверный курсор, настраиваются ли, что стоит по умолчанию (в итоге все сходится на recordcount у датасета)...

> испоьзую стандартную БД BCDEMOS
локальная, файл серверная база, серверного курсора попросту не имеет.


 
sniknik ©   (2006-07-23 14:53) [8]

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


 
Desdechado ©   (2006-07-23 14:59) [9]

> на форме имеется система фильтров и сортировок
Если ты отличаешь одно от другого, а также фильтр от выборки, то должен понимать, что фильтр сначала достает все на клиента (все миллионы записей), а потом долго и нудно их терзает там, чтоб показать 10 строк. Это фильтрация и именно так работает TTable.
Выборка же заставляет саму СУБД сделать отбор только нужных записей, не нагружая клиента ненужными операциями (особенно, если это по сети -чрезвычайно тормознуто).

> Заранее это спрашивать нельзя.
Чушь. Все эти штуки на "форме для системы фильтрации" и являются "вопросом", на основании которого можно сформировать качественный SQL-запрос к базе.

> как-то "вдруг" стало все работать
А это то, на что я намекал в своем предыдущем посте. О "любой базе". Локальные таблицы используют другой способ при доступе через TTable. И там количество записей известно из заголовка, поэтому бегунок плавный.

Но не обманывай себя, делай лучше правильно, не ерепенься  ;)


 
Anatoly Podgoretsky ©   (2006-07-23 15:02) [10]

Там хватит сложностей. Проще перейти на АДО где это уже реализовано для клиентских курсоров, а если при этом перейти еще и на Д2006 то и колесико будет работать. Среда правда там не устойчивая, но к рантайм замечаний нет, очень стабильно работает и ошибки АДО исправлены, если не пользоваться некоторыми событиями из TAdoConnection.


 
Desdechado ©   (2006-07-23 15:12) [11]

> отсортиртировать и отфильтровать таблицу для упрощения поиска нужной записи
Да, похоже разница автором таки не ощущается :(
Поиск - это позиционирование на записи, и никакого отношения ни к фильтрации, ни к сортировке, ни к выборке не имеет.



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

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

Наверх




Память: 0.48 MB
Время: 0.04 c
4-1148457913
truegosha
2006-05-24 12:05
2006.09.24
QueryServiceStatus Отказано в доступе


2-1157360717
com
2006-09-04 13:05
2006.09.24
Блокировщик виндувс


3-1153320083
SamProf
2006-07-19 18:41
2006.09.24
Как обновить данные в таблице


15-1157286084
DillerXX
2006-09-03 16:21
2006.09.24
Наши научились делать нормальные шоу?!..


2-1157114544
VitV
2006-09-01 16:42
2006.09.24
FastReport-подсчёт количества строк





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