Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2013, 21:39   #1
belkeandrey
Пользователь
 
Регистрация: 21.02.2013
Сообщений: 48
По умолчанию Как определить, сколько времени юзер читал текст

Коллеги, проблема такая. Уже как говорится, голова вскипела. Есть форма, есть кнопки с названием разделов, есть ричэдит. При нажатии на кнопку подгружаем файл в ричэтид. Юзер его читает, потом выбирает другой раздел, при этом меняется только путь к файлу и он видит другой текст. Как определить, сколько времени читал текст юзер до перехода в другой раздел. Если бы каждый раздел был в новой форме, проблем бы не было, просто событие onclose или подобное. А тут как подойти не соображу...
belkeandrey вне форума Ответить с цитированием
Старый 02.04.2013, 21:42   #2
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
По умолчанию

После загрузки текста запускать таймер и делать inc(i), нажатие на кнопку сбрасывает таймер и записывает значение i в любую другую переменную. Как-то так?
noname_06 вне форума Ответить с цитированием
Старый 02.04.2013, 21:49   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Кидаем Ttimer на форму, в раздел объявления глобальных переменных пишем
Код:
var
  secc,minn:Integer;
  mks1:string[255]='';
Дважды кликаем на таймер и пишем это:

Код:
if secc < 59
    then inc(secc)
    else begin
      secc :=0;
      inc(minn);
    end;
    mks1:=IntToStr(min)+':';
  if secc<10 then  mks1:= mks1 +'0'+ IntToStr(secc)
    else  mks1:=mks1 + IntToStr(secc);
Далее например пишем обработчик для кнопки "Читать текст" в нем запустим таймер (Timer2.Enabled:=true; ), а по другой кнопки, например "Завершить" можно написать так:
Код:
timer2.enabled:=false;
richedit1.lines.add(mks1);

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

Ах, да, результат в переменной mks1, ее можно просто вывести в мемо, или в метку или в ричедит, куда угодно...
from dark to light)

Последний раз редактировалось Алексей_2012; 02.04.2013 в 22:00.
Алексей_2012 вне форума Ответить с цитированием
Старый 02.04.2013, 21:58   #4
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
По умолчанию

Интересно, что скажет автор, т.к. я понял, что его интересует логика привязки к событиям, а Вы - что его интересует сам процесс расчета времени. И не проще ли делать inc(i) через 1000 мс, а потом min:=i div 60; sec:=i mod 60; ?
noname_06 вне форума Ответить с цитированием
Старый 02.04.2013, 22:06   #5
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Выложите Ваш код-посмотрим на ваш рабочий исходник...при нажатии на кнопку подгрузки файлов активируется таймер, а при повторном нажатии на это кнопку (для проверки завести переменную типа boolean) таймер останавливается и в переменной msk1 будет то время, сколько таймер проработал. Ну или создать для остановки таймера отдельную кнопку, или меню, да что угодно, где он будет останавливаться-так еще проще
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 02.04.2013, 22:22   #6
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
По умолчанию

Код:
private
  i: Integer;
  flag: Boolean;

procedure TForm1.redt1Change(Sender: TObject);
var
  sec, min: Integer;
begin
  redt1.Lines.LoadFromFile('1.txt');
  if not flag then
  begin
    tmr1.Enabled:=True;
    flag:=True;
  end
  else
  begin
    min:=i div 60;
    sec:=i mod 60;
    flag:=False;
  end;
end;

procedure TForm1.tmr1Timer(Sender: TObject);
begin
  Inc(i);
end;
Как-то так?
*TForm1.redt1Change потому что было лень кнопку на форму кидать
noname_06 вне форума Ответить с цитированием
Старый 02.04.2013, 22:39   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А таймер зачем? Запоминать системное время при инициализации очередного раздела. При инициализации следующего имеем разницу времен, получаем минуты из разницы, если очень хочется (только на фига) в секунды и записываем ее куда нужно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.04.2013, 22:46   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Пипл, тут проблема толще чем кажется. А читает ли юзер текст вообще? Или уже минут ...дцать сидит на кухне и чай пьёт?

И да, все проще =)
Принцип маятника:
Код:
глобальные переменные: 
bControl:Boolean = False;
iTStart,iTEnd:DWORD;

Обработчик перехода из раздела в раздел:
begin
    if bControl then
    begin
      iTEnd:=GetTickCount-iTStart;
      ShowMessage('Я твой текст '+IntToStr(iTEnd div 1000)+' секунд шатал...!');
      iTEnd:=0;
      iTStart:=0;
      bControl:=False;
    end;
  iTStart:=GetTickCount;
  bControl:=True; 
end;
Человек_Борща вне форума Ответить с цитированием
Старый 02.04.2013, 23:00   #9
noname_06
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 49
По умолчанию

Цитата:
А читает ли юзер текст вообще?
А вдруг это НЕ лицензионное соглашение?
Т.е. помещаем в обработчик нажатия каждой кнопки? Может лучше все-таки процедурой оформить?
noname_06 вне форума Ответить с цитированием
Старый 02.04.2013, 23:08   #10
belkeandrey
Пользователь
 
Регистрация: 21.02.2013
Сообщений: 48
По умолчанию

Цитата:
Сообщение от noname_06 Посмотреть сообщение
Интересно, что скажет автор, т.к. я понял, что его интересует логика привязки к событиям, а Вы - что его интересует сам процесс расчета времени. И не проще ли делать inc(i) через 1000 мс, а потом min:=i div 60; sec:=i mod 60; ?
Да, вы именно так и поняли, как считать время мне понятно. Мне необходимо высчитать время пользования юзером определенного окна, в данном случае с ричэдитом. Я хочу после прочтения текста юзером добавить в БД с помощью ADOQuery информацию о том, какой текст он читал и сколько времени. Насчет какой текст проблем нет, а вот со временем ну никак не придумаю, учитывая что разделов с кнопками много и таких кнопок как "Остановить отсчет времени" и подобных, нет... При этом желательно, чтобы информация о тексте и время записались ОДНОВРЕМЕННО (чтобы они попали в одну строку в БД). Т.е. записать инфу надо при переходе в другой раздел, либо при выходе. К чему привязаться?

Прилагаю скрин формы, чтобы было понятнее о каких кнопках и разделах идет речь.

belkeandrey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить где юзер закрыл браузер KLAXON PHP 13 11.02.2011 01:28
[PHP] Как узнать сколько прошло времени? RESPECT8 PHP 1 24.10.2010 09:43
Сколько стоит такая программка? И сколько по времени её сделать? Палыч I Фриланс 8 10.09.2010 16:23
Как определить сколько памяти у видеокарты flug Общие вопросы Delphi 12 13.07.2010 08:13