Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как определить, сколько времени юзер читал текст


Автор: belkeandrey 2.4.2013, 20:42
Коллеги, проблема такая. Уже как говорится, голова вскипела. Есть форма, есть кнопки с названием разделов, есть ричэдит. При нажатии на кнопку подгружаем файл в ричэтид. Юзер его читает, потом выбирает другой раздел, при этом меняется только путь к файлу и он видит другой текст. Как определить, сколько времени читал текст юзер до перехода в другой раздел. Если бы каждый раздел был в новой форме, проблем бы не было, просто событие onclose или подобное. А тут как подойти не соображу...

Автор: Poseidon 2.4.2013, 20:48
Засекаешь время при открытии раздела, затем засекаешь при открытии другого и отнимаешь. В чем проблема возникла?
Цитата(belkeandrey @  2.4.2013,  20:42 Найти цитируемый пост)
При нажатии на кнопку подгружаем файл в ричэтид.
Вот прямо тут и засекай.

Автор: belkeandrey 2.4.2013, 21:38
У меня считается время таймером по 1 секунде увеличивая переменную на 1. От этого и отталкиваюсь, но никак не получается. Разделов много, а как вы имеете в виду засечь?

Автор: kami 2.4.2013, 22:17
Цитата(belkeandrey @  2.4.2013,  20:42 Найти цитируемый пост)
Как определить, сколько времени читал текст юзер до перехода в другой раздел.

smile А юзер в это время ушел попить кофе, или в чат срулил.

Цитата(belkeandrey @  2.4.2013,  20:42 Найти цитируемый пост)
просто событие onclose или подобное.

А тут - просто метод, вызывающий загрузку нового текста. Разницы нет вообще.

Автор: Данкинг 2.4.2013, 23:06
Цитата(belkeandrey @  2.4.2013,  22:38 Найти цитируемый пост)
У меня считается время таймером по 1 секунде увеличивая переменную на 1

Ну, по клику на кнопках считывать/обнулять значение глобальной переменной, которая увеличивается по таймеру.

Автор: Akella 2.4.2013, 23:58
ты не можешь определить сколько пользователь реально читал текст, можешь только определить время между некоторыми событиями в программе, а читал он или нет - как узнать?

Автор: belkeandrey 3.4.2013, 00:06
Цитата(kami @ 2.4.2013,  22:17)
Цитата(belkeandrey @  2.4.2013,  20:42 Найти цитируемый пост)
Как определить, сколько времени читал текст юзер до перехода в другой раздел.

smile А юзер в это время ушел попить кофе, или в чат срулил.

Цитата(belkeandrey @  2.4.2013,  20:42 Найти цитируемый пост)
просто событие onclose или подобное.

А тут - просто метод, вызывающий загрузку нового текста. Разницы нет вообще.


Да это не критично smile 

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

Добавлено через 1 минуту и 36 секунд
Цитата(Akella @ 2.4.2013,  23:58)
ты не можешь определить сколько пользователь реально читал текст, можешь только определить время между некоторыми событиями в программе, а читал он или нет - как узнать?

Да это и нужно, а читал он или нет, это уже его проблемы smile 

Автор: Beltar 3.4.2013, 00:14
Создай массив TDateTime, размерность задать по числу разделов, засекай момент загрузки раздела, засекай момент перехода к следующему, или иного события прекращения чтения, разницу суммируй с уже накопленным в массиве. Будет работать даже если юзер бегает туда-сюда. А лучше не DateTime, а Cardinal, и снимай замеры в миллисекундах с помощью GetTickCount (Сия функция первый помощник программиста, когда надо быстренько померить время), тогда не выйдет обмануть с помощью перевода часов, если это критично.

Автор: belkeandrey 3.4.2013, 00:15
Цитата(Данкинг @ 2.4.2013,  23:06)
Цитата(belkeandrey @  2.4.2013,  22:38 Найти цитируемый пост)
У меня считается время таймером по 1 секунде увеличивая переменную на 1

Ну, по клику на кнопках считывать/обнулять значение глобальной переменной, которая увеличивается по таймеру.

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

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

Добавлено через 5 минут и 23 секунды
Цитата(Beltar @ 3.4.2013,  00:14)
Создай массив TDateTime, размерность задать по числу разделов, засекай момент загрузки раздела, засекай момент перехода к следующему, или иного события прекращения чтения, разницу суммируй с уже накопленным в массиве. Будет работать даже если юзер бегает туда-сюда. А лучше не DateTime, а Cardinal, и снимай замеры в миллисекундах с помощью GetTickCount (Сия функция первый помощник программиста, когда надо быстренько померить время), тогда не выйдет обмануть с помощью перевода часов, если это критично.

Вот это уже ближе к моей ситуации smile  А с кодом не поможешь? smile 

Автор: Данкинг 3.4.2013, 00:29
А что в итоге надо получить? Время по каждому разделу?

Автор: belkeandrey 3.4.2013, 00:34
Цитата(Данкинг @ 3.4.2013,  00:29)
А что в итоге надо получить? Время по каждому разделу?

В итоге мне надо название просмотренного текста и время его "просмотра" поместить в БД с помощью ADOQuery, причем желательно одновременно. Помещать эту инфу надопосле каждой смены раздела или ухода в другую часть проги...

Автор: Данкинг 3.4.2013, 01:09
Ну, тогда достаточно одной переменной, значение которой будет заноситься в таблицу при смене раздела.

Автор: northener 3.4.2013, 01:10
Цитата(belkeandrey @  2.4.2013,  21:38 Найти цитируемый пост)
У меня считается время таймером по 1 секунде увеличивая переменную на 1. От этого и отталкиваюсь, но никак не получается. 

Код показывай. Как "отталкиваешься",  и что никак не получается.
P.S. Имхо в итоге всё сведётся к незанию работы с БД. smile

Автор: Poseidon 3.4.2013, 08:31
Цитата(belkeandrey @  3.4.2013,  00:06 Найти цитируемый пост)
Кнопок много, ричэдит один. 
У RichEdit есть событие OnChange, которое происходит при каждом изменении текста. Не нужно пихать на все кнопки, можно запихнуть сюда. При выполнении:
  • считываем переменную
  • загоняем значение в БД
  • обнуляем



Автор: belkeandrey 3.4.2013, 12:25
Цитата(Poseidon @ 3.4.2013,  08:31)
Цитата(belkeandrey @  3.4.2013,  00:06 Найти цитируемый пост)
Кнопок много, ричэдит один. 
У RichEdit есть событие OnChange, которое происходит при каждом изменении текста. Не нужно пихать на все кнопки, можно запихнуть сюда. При выполнении:


  • считываем переменную

  • загоняем значение в БД

  • обнуляем


Спасибо, добрый человек smile  Я только начал изучать дельфи, не все события знаю. Все работает на 5, но надо повозиться с условиями, т.к. текст много меняется и по другим причинам (поиск).

Добавлено через 4 минуты и 41 секунду
Только как теперь сделать, чтобы при подгрузке нового текста, скролл перемещался на начало?

Автор: Poseidon 3.4.2013, 14:48
Цитата(belkeandrey @  3.4.2013,  12:25 Найти цитируемый пост)
Только как теперь сделать, чтобы при подгрузке нового текста, скролл перемещался на начало?
После загрузки пропиши 
Код

RichEdit1.SelStart:= 0;

А вообще, один топик - один вопрос. Модераторы ругаются smile

Автор: belkeandrey 3.4.2013, 15:40
Принял к сведению smile  Большое спасибо за помощь smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)