Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Free Pascal, Pascal ABC и другие _ Время в Файлы!

Автор: compiler 29.09.2007 23:24

Добрый день!
Я пишу программку, которая должна была бы вести учетную запись времени провождения пользователя за время работы данной программы.
То есть в автозапуске есть программа x , которая должна готовить отчеты по пользователю в файле, например в файле 20070929(дата) будет сказано
07:00-16:25
16:30-16:45
а это значит что Петров сидел целый день перед компом, а родителям говорит что и не подходил к нему smile.gif
Сначала я хотел создать нетипизированный файл и туда кидать время, но у меня не получилось работать с буфером и в файл пролазило много лишнего кроме времени(файл time0.pp), позже было еще много попыток вследствии которых уже и время не пишется… и сейчас есть код где создается типизированный файл (of TDateTime) и туда(time1.pp) пишется какой-то бред…

Помогите пожалуйста.






Прикрепленные файлы
Прикрепленный файл  time1.txt ( 2.18 килобайт ) Кол-во скачиваний: 338
Прикрепленный файл  time0.txt ( 2.23 килобайт ) Кол-во скачиваний: 340

Автор: volvo 30.09.2007 0:17

Ну, допустим, функция Date() реализуется гораздо проще:

function Date():string;
begin
result := Format('%.4d%.2d%.2d',
[YearOf(Now()), MonthOf(Now()), DayOf(Now())]);
end;



Теперь о программе: я не совсем понял, почему:
  if ((Time - DateOf(now)) <> SleepTime) then begin  // если машину выключали 
? Откуда такой вывод, что если разность последней записанной даты и текущей НЕ равна 2 (2 чего? дня? месяца?), то машину выключали? Ну, и как следствие, все нижеследующее тоже неясно... Ты хочешь, чтобы у тебя каждый какой-то промежуток времени в файл что-то записывалось, или одноразово? Другими словами, эта программа будет постоянно висеть и что-то делать или она запускается, отрабатывает и до следующей перезагрузки не запускается?

Автор: compiler 1.10.2007 16:54

Цитата(volvo @ 29.09.2007 20:17) *
Ну, допустим, функция Date() реализуется гораздо проще...
спасибо...(вот где Format и понадобился...)
Цитата(volvo @ 29.09.2007 20:17) *
Откуда такой вывод, что если разность последней записанной даты и текущей НЕ равна 2 (2 чего? дня? месяца?), то машину выключали?
да, тут надо поработать, думаю оптимально будет задавать SleepTime в TTime...
Цитата(volvo @ 29.09.2007 20:17) *
Другими словами, эта программа будет постоянно висеть и что-то делать или она запускается, отрабатывает и до следующей перезагрузки не запускается?
первое... это будет некий даемон. Ведь если в файл будет запись только при вкл/выкл ОС, то при аварийном завершении работы(пользователь нажмет Reset/Power) записи не будет.



Автор: volvo 1.10.2007 17:01

Цитата
это будет некий даемон
Тогда проще будет по таймеру каждый промежуток времени (сколько там тебе надо - минуту? 30 секунд?) просто открывать файл, и если время записанное в последней записи отличается от текущего на этот самый промежуток, то перезаписывать последнее значение. Иначе (если прошло больше заданного промежутка времени, и программа не записывала ничего в файл, то логично предположить что компьютер выключался, или просто пользователь был разлогинен) - добавлять новую запись в файле...

Автор: compiler 1.10.2007 17:14

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

Автор: volvo 1.10.2007 17:20

Или текстовый или типизированный, я бы выбрал File Of TDateTime (у тебя в любом случае есть средства конвертации дата <-> строка, зачем еще с BlockRead-ом для бестиповых файлов связываться?)

Автор: compiler 1.10.2007 17:23

Цитата(volvo @ 1.10.2007 13:20) *
Или текстовый или типизированный, я бы выбрал File Of TDateTime (у тебя в любом случае есть средства конвертации дата <-> строка, зачем еще с BlockRead-ом для бестиповых файлов связываться?)
послушаюсь совета smile.gif

оффтоп
а как BlockWrite-ом писать блок ЛЮБОГО размера и можнали это вообще?

Автор: volvo 1.10.2007 17:35

Любого это какого? Больше 64К?

В rtl.pdf приведен пример использования BlockRead/BlockWrite... Я только что этим примером скопировал файл блоками по 200000 байт... Единственное что пришлось поменять - это

NumRead, NumWritten: int64; { <--- }

Автор: compiler 1.10.2007 17:39

Цитата(volvo @ 1.10.2007 13:35) *
Любого это какого? Больше 64К?
нет малого, несколько байт..

Автор: volvo 1.10.2007 17:44

От одного до... Сколько память позволит...

Автор: compiler 1.10.2007 17:58

Цитата(volvo @ 1.10.2007 13:44) *
От одного до...
От одного? а не от 128 байт(16 байт) или это только в TP?

и еще как в типизированых файлах удалить элемент на который в данный момент указывает FilePos?

Автор: volvo 1.10.2007 18:28

Цитата
а не от 128 байт(16 байт) или это только в TP?
blink.gif blink.gif

Если я открыл файл как Rewrite(f, 1); то кто мне и в TP запретит записать ровно один байт?

Цитата
как в типизированых файлах удалить элемент на который в данный момент указывает FilePos?
Что будет с последующими элементами?

Автор: compiler 1.10.2007 18:37

Цитата(volvo @ 1.10.2007 14:28) *

blink.gif blink.gif Если я открыл файл как Rewrite(f, 1); то кто мне и в TP запретит записать ровно один байт?
это мой болт smile.gif ... я открывал Rewrite(f);

Цитата(volvo @ 1.10.2007 14:28) *
Что будет с последующими элементами?
неважно (их нету smile.gif )

добавлено
еще можна ли привести в синтаксически правильное выражение
 const //раздел описания 
SleepTime : TDateTime=StrToTime('0:0:1');

Автор: volvo 1.10.2007 19:32

Ну, если нету - то Truncate(f);


Цитата
можна ли привести в синтаксически правильное выражение
Это у тебя что? Секунда? Тогда
const
SleepTime: tdatetime = OneSecond;


Автор: compiler 1.10.2007 19:41

Цитата(volvo @ 1.10.2007 15:32) *
Ну, если нету - то Truncate(f);
спасибо

Цитата(volvo @ 1.10.2007 15:32) *
Это у тебя что? Секунда?
пока незнаю , может секунда, а может 5 мин. , буду выражать в секундах. спасибо.

Автор: volvo 1.10.2007 19:48

smile.gif Если в минутах - можно не умножать секунды на 60, есть OneMinute, и OneHour тоже есть...

Автор: compiler 1.10.2007 19:55

Цитата(volvo @ 1.10.2007 15:48) *
smile.gif Если в минутах - можно не умножать секунды на 60, есть OneMinute, и OneHour тоже есть...
smile.gif еще раз спасибо.