Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как притормозить загрузку данных формы при скроллинге? / 24 сообщений из 24, страница 1 из 1
02.09.2004, 16:33:25
    #32677960
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
База у меня DAO, в форме помимо полей есть еще две подчиненные формы и одна картинка, которая загружается с сервера.

Бесит поведение пользователей: просто скроллят колесиком по записям, даже когда знают нужный номер (т.е. можно вбить напрямую). У меня аж сердце кровью обливается, когда смотрю на это дело, ведь каждую запись он начинает обрабатывать (а их там штук 50 за секунду мелькает). Отсюда возможные глюки и т.д.

Как бы это дело сделать таким образом, чтобы сама форма обрабатывалась только через, скажем, 200-500 мс после успокоения пользователя. Главное, чтобы она никакой активности/загрузки до этого момента не только не афишировала, но и реально не делала. Это возможно?

P.S. Запретить скроллить не могу из соображений собственной безопасности
...
Рейтинг: 0 / 0
02.09.2004, 16:37:27
    #32677970
vam911
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Точо посоветовать ничего не могу, но если поможет, то при скроллировании не просходит обновление данных, а происходить лишь их отображение. Следовательно если на какое-то время отлючать отображение...
...
Рейтинг: 0 / 0
02.09.2004, 16:53:53
    #32678027
guest1187
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
А если поменять тактику.
Запретить скроллирование всего набора записей.
А переход осуществлять через выбор в combobox'e.
...
Рейтинг: 0 / 0
02.09.2004, 18:11:21
    #32678210
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
vam911

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

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

guest1187

Спасибо, но я не могу запретить скроллить. Это у нас уже на уровне инстинктов :)
...
Рейтинг: 0 / 0
02.09.2004, 18:25:41
    #32678239
kk@comson.ru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Если я правильно понял ситуацию, то могу предложить такое решение:

- Подчиненные формы не связывать с полями в главной.
- В обработчике события "включение" утанавливаем таймер.
- В обработчике события "На запись" пишем код, который обнуляет таймер. После достижения таймером заданного времени меняем свойство RecordSource у подчиненных форм и выполняем для них Requery. Таким образом, запрос к серверу произойдет через заданное время после успокоения.

Если нужно подробнее, пиши - отвечу.
...
Рейтинг: 0 / 0
02.09.2004, 19:17:31
    #32678337
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
kk@comson.ru

Спасибочки! Куда писать?

Хоть способ и кажется довольно трудоемким, попробовать стОит.
...
Рейтинг: 0 / 0
03.09.2004, 08:25:11
    #32678552
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Если я правильно понял ситуацию, то могу предложить такое усовершенствование:

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

Таким образом, запрос к серверу будет происходить не чаще интервала таймера.
-----------

Доп. усовершенствование:
В событии OnCurrent устанавливаем глобальную переменную модуля в TRUE.
В обработчике события "OnTimer" сначала проверяем
если TRUE - сбрасываем и ничего не делаем.
если FALSE - заполняем дополнительные свободные поля нужными значениями из текущей записи (ежели таковая есть или NULL, ежели нету).

Таким образом обновление субформ пройдет только через интервал таймера после успокоения пользователя.
...
Рейтинг: 0 / 0
03.09.2004, 09:58:11
    #32678679
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
вообще то обычно загружаются данные всех записей и при прокрутке подгрузка не совершается

перерисовкой можно управлять задавая эхо или паинтинг

например:
me.painting = false

выключает перерисовку формы
...
Рейтинг: 0 / 0
03.09.2004, 10:24:55
    #32678745
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
>вообще то обычно загружаются данные всех записей и при прокрутке подгрузка не совершается

Совершается на субформах, если они связаны с основной.
...
Рейтинг: 0 / 0
03.09.2004, 10:52:06
    #32678818
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
понял суть.

я использую немножко другой тип интерфейса:

1 ленточная форма для выбора записи с которой работать в основной - выбираем нужную запись нажимаем кнопку открывается :
2 главная форма в которую выбирается только одна запись выбранная из предыдущей при открытии.
3 подчиненная форма вложенная в главную

в этом случае крути не крути колесо - в главной форме одна запись
нужно другую - закрывай форму ищи в ленточной нужную и вперед


думаю что многие так делают.
...
Рейтинг: 0 / 0
03.09.2004, 10:55:21
    #32678828
Hummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
2 АлексейК
Именно так. Такой принцип используется в модуле для меню (ну практически).
...
Рейтинг: 0 / 0
03.09.2004, 11:39:04
    #32678970
sposad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
АлексейКпонял суть.

я использую немножко другой тип интерфейса:

1 ленточная форма для выбора записи с которой работать в основной - выбираем нужную запись нажимаем кнопку открывается :
2 главная форма в которую выбирается только одна запись выбранная из предыдущей при открытии.
3 подчиненная форма вложенная в главную

в этом случае крути не крути колесо - в главной форме одна запись
нужно другую - закрывай форму ищи в ленточной нужную и вперед


думаю что многие так делают.

Точно так
...
Рейтинг: 0 / 0
03.09.2004, 13:14:30
    #32679245
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Ну вот опять разработчики дают _дельные_ мысли но с другой стороны юзабилити. Не как _удобнее_ а как надежнее/проще :)

Обрисую как у меня это выглядит:

Форма "Работник", вверху список номеров работников и ФИО, в центре фотография и данные, внизу первая вложенная форма с историей наработки, справа расширенное примечание (лог примечаний как отдельная таблица).

Соответственно, когда я ввожу номер, хочется сразу видеть и его наработку и примечания (там бывают важные вещи, типа "Не пускать на ХХХ объект, униформа выдана и т.д.").


P.S. Картинку вставить не знаю как, поэтому просто прикладываю.
...
Рейтинг: 0 / 0
03.09.2004, 15:52:38
    #32679635
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
АлексейКпонял суть.

я использую немножко другой тип интерфейса:

1 ленточная форма для выбора записи с которой работать в основной - выбираем нужную запись нажимаем кнопку открывается :
2 главная форма в которую выбирается только одна запись выбранная из предыдущей при открытии.
3 подчиненная форма вложенная в главную

в этом случае крути не крути колесо - в главной форме одна запись
нужно другую - закрывай форму ищи в ленточной нужную и вперед


думаю что многие так делают.

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

Конкретное решение... хм?
...
Рейтинг: 0 / 0
03.09.2004, 16:33:03
    #32679749
Andres 1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
aleks2 АлексейКпонял суть.

я использую немножко другой тип интерфейса:

1 ленточная форма для выбора записи с которой работать в основной - выбираем нужную запись нажимаем кнопку открывается :
2 главная форма в которую выбирается только одна запись выбранная из предыдущей при открытии.
3 подчиненная форма вложенная в главную

в этом случае крути не крути колесо - в главной форме одна запись
нужно другую - закрывай форму ищи в ленточной нужную и вперед


думаю что многие так делают.

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

Конкретное решение... хм?

Так это и есть конкретное решение. 1 форма - список для поиска (только самое важное, никто не ищет человека в списке работников по дате рождения его любимой собачки), 2 форма - детали, где есть все, вплоть до размера обуви (при необходимости, например, если инф-я по военнослужащим) - но только по одному человеку.
...
Рейтинг: 0 / 0
03.09.2004, 16:40:56
    #32679789
sposad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Посмотри всё-таки связанные формы. Хотя бы с помощью мастера форм. Там есть возможность передвигаться по главной форме как с открытой связанной, так и без неё. Сравни ...
...
Рейтинг: 0 / 0
04.09.2004, 08:33:58
    #32680237
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Andres 1[
Так это и есть конкретное решение. 1 форма - список для поиска (только самое важное, никто не ищет человека в списке работников по дате рождения его любимой собачки), 2 форма - детали, где есть все, вплоть до размера обуви (при необходимости, например, если инф-я по военнослужащим) - но только по одному человеку.

Дык тебе и объясняют: пользователям лениво жать лишний раз на кнопку и я их понимаю. Ты попробуй сам так поработать - взвоешь.
...
Рейтинг: 0 / 0
04.09.2004, 18:01:03
    #32680416
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Конечно, это уже вопрос стиля программиста. Либо ему малосущественно кто такие пользователи и что они хотят от твоего шедевра. Либо он сидит с ними в соседней комнате, делает базу, согласовывает ее с боссом, который, что печально, сам является пользователем базы и, что _самое_ печальное, имеет представление как Access работает и _что_ он может. Кроме того, все хотят предложить "как лучше", при этом через три дня после того как "фича" появляется, ей реально пользуются один раз в месяц!

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

Думаю, счастливы те программеры, которые кодят исключительно движки или простейшие формы/отчеты, потому что эта пустячная возня с "хочу/удобно" урывает слишком много времени.

-------------------------------------

Блин, столько "диалектики" у меня и ни одного дельного предложения... Хотя, пожалуйста:

Есть идея безхитростно задерживать выполнение запроса для формы и подчиненных. Выглядеть будет примерно так: при загрузке получаем список работников, листаем форму как угодно. Есть таймер, скажем, на 200 мс, который обнуляется с переходом на запись, т.е. если таймер достиг своего значения выполняем запрос и загружаем данные по работнику.

Таким образом, достигается эффект нормальной работы с формой, если клацать по кнопкам записей, и эффект экономии ресурсов при скроллинге.

P.S. Народ, а что лучше делать, изменять программно recordset или работать с фильтром?
...
Рейтинг: 0 / 0
04.09.2004, 21:27:47
    #32680457
Andres 1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Ну если вариант "только так и никак иначе", то:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub Form_Current()
  Me.sfrm_address.SourceObject = ""  ' Очищаем подчиненную форму 
  Me.sfrm_company_comms.SourceObject = ""  ' И еще одну 
   'Me.olePhoto.ControlSource = "" ' И фотографию 
  Me.TimerInterval =  750   'запускаем таймер на 0,75 секунды  
End Sub

Private Sub Form_Timer()
  Me.sfrm_address.SourceObject = "sfrm_address"
  Me.sfrm_company_comms.SourceObject = "sfrm_company_comms"
   'Me.olePhoto.ControlSource = "olePhoto" 
   'Me.olePhoto.Requery 
  Me.TimerInterval =  0    ' Одного раза хватит, а то будет мелькать каждую секунду 
End Sub


Поле с фотографией закомментировано потому, что я не пробовал, лень :), но должно работать. Подчиненные формы работают
...
Рейтинг: 0 / 0
05.09.2004, 09:07:45
    #32680498
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Гм, тривиальное усовершенствование:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Private  blDoNotShowSubform as boolean

Private Sub Form_Current()
if not blDoNotShowSubform then
  Me.sfrm_address.SourceObject = ""  ' Очищаем подчиненную форму 
  Me.sfrm_company_comms.SourceObject = ""  ' И еще одну 
   'Me.olePhoto.ControlSource = "" ' И фотографию 
  Me.TimerInterval =  750   'запускаем таймер на 0,75 секунды  
  blDoNotShowSubform=TRUE
end if
End Sub

Private Sub Form_Timer()
  if  blDoNotShowSubform then
    blDoNotShowSubform=FALSE
  else
    Me.sfrm_address.SourceObject = "sfrm_address"
    Me.sfrm_company_comms.SourceObject = "sfrm_company_comms"
     'Me.olePhoto.ControlSource = "olePhoto" 
     'Me.olePhoto.Requery 
    Me.TimerInterval =  0    ' Одного раза хватит, а то будет мелькать каждую секунду 
  end if
End Sub

не мелькает, пока пользователь не угомонился.
...
Рейтинг: 0 / 0
07.09.2004, 16:15:19
    #32683767
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Большушее спасибо Andres 1 , aleks2 и kk@comson.ru !

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

Метод от Andres 1 внедряется легче, чем решение от kk@comson.ru (он предложил систему таймера с обновлением RecordSource по достижении секундомером нужной задержки). А по сути, получается, одно и тоже.

Даже странно, что сама MS не догадалась такую фичу сделать как стандартную опцию. Имхо, довольно удобно. Например, у меня производительность скроллинга клиентской формы возрасла раза в четыре :)


That's all folks...
...
Рейтинг: 0 / 0
22.09.2004, 13:34:01
    #32706341
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
В ответ на собственный вопрос в "P.S." сообщения от 4 сен 04, 18:01 (просто в форуме ответ так и не нашел, а тут почти случайно в Help'е наткнулся). Напомню вопрос:

dknyP.S. Народ, а что лучше делать, изменять программно recordset или работать с фильтром?

Код: plaintext
1.
2.
3.
4.
5.
Filter Property

...

In many cases, it 's faster to open a new Recordset 
object by using an SQL statement that includes a WHERE clause.

...и чуть дальше:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Filter Property Example

...

When you know the data you want to select, it 's usually more efficient 
to create a Recordset with an SQL statement. This example shows how
you can create just one Recordset and obtain records
from a particular country.

Хоть это и ощущается экспериментально, но все равно официальное подтверждение приятнее :)
...
Рейтинг: 0 / 0
27.09.2004, 14:18:36
    #32712802
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
Теперь у меня опять вопрос: здесь указаны два метода: SourceObject и RecordSource. Есть ли разница в их применении? Особенно в моем случае, т.е. для подчиненных форм. Дело в том, что я пропробовал и так и эдак, оба способа работают, но не совсем понятно какой лучше использовать.

Я пока склонен думать, что SourceObject это тоже что и RecordSource, но для любых объектов, т.е. и для полей и для OLE.

А вообще, конечный вариант сделующий (для текущей записи):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private blDoNotShowSubform As Boolean  ' наша переменная - флаг 

If Not blDoNotShowSubform Then
    Me![Форма_подчиненная].Visible = False
    Me![Форма_подчиненная].Form.RecordSource = ""
    Me.TimerInterval =  500   'запускаем таймер на 0,5 секунды 
    blDoNotShowSubform = True  ' ставим флаг 
End If

для таймера:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
If blDoNotShowSubform Then
    blDoNotShowSubform = False  ' убираем флаг 
Else
    Запрос = "SELECT Работники.Уч_№ ...бла, бла, бла (мой запрос)... WHERE Работники_примечание.Уч_№"
    Me![Форма_подчиненная].Form.RecordSource = Запрос
    Me![Форма_подчиненная].Form.Recordset.MoveLast
    Me![Форма_подчиненная].Form.Visible = True
    Me.TimerInterval =  0   ' убираем таймер, чтобы больше не обрабатывать 
End If

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

Главная проблема этого способа, это реагирование подчиненных форм на изменение рекордсета по отображению через таймер (у меня там прописано пару простеньких функций). Причем, реагировать на события нужно именно после конечного отображения. Я так понимаю, что когда рекордсет меняется программно, то событие не обрабатывается. Есть ли способ выполнить код подчиненной формы из главной?

P.S. Thanks to ALL! Special thanks to Andres 1 , aleks2 и kk@comson.ru!!!
...
Рейтинг: 0 / 0
28.09.2004, 05:58:15
    #32713821
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как притормозить загрузку данных формы при скроллинге?
SourceObject и RecordSource это две большие разницы:

SourceObject=NOTHING => вообще нет субформы
RecordSource ="" => есть субформа с пустым рекордсетом.

>>Причем, реагировать на события нужно именно после конечного отображения. Я так понимаю, что когда рекордсет меняется программно, то событие не обрабатывается.

На программные изменения не вызывается НИКАКИХ (почти никаких - это оговорка на всякий случай) событий.

>>Есть ли способ выполнить код подчиненной формы из главной?
Surely

в модуле подчиненной формы Form_Subform:

public sub GoGoGo()
...

в модуле основной формы Form_Mainform:

...
Form_Subform.GoGoGo
или
Me.SubformEmbeddedObject.Form.GoGoGo
...
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как притормозить загрузку данных формы при скроллинге? / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]