Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/45: Рейтинг темы: голосов - 45, средняя оценка - 4.56
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
1

Запись "логов" в файл

17.04.2012, 22:41. Просмотров 8442. Ответов 14
Метки нет (Все метки)

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

В общем есть код, определяющий время работы программы и выводит это время в Label:

Delphi
1
2
3
4
procedure TForm2.Timer1Timer(Sender: TObject);
begin
 Label1.Caption := FormatDateTime('hh:nn:ss', Now - TimeStart);
end;
Delphi
1
2
3
4
procedure TForm2.Timer1Timer(Sender: TObject);
begin
 Label1.Caption := FormatDateTime('hh:nn:ss', Now - TimeStart);
end;
Нужно чтобы при FormDestroy время работы программы записывалась в лог, через Append.

Сам что-то туплю вообще, хоть и понимаю, что нужно, но сделать не могу..

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2012, 22:41
Ответы с готовыми решениями:

В каждом слове текста замените "а" на букву "е", если "а" стоит на четном месте, и заменить букву "б" на сочетание "ак",
В каждом слове текста замените "а" на букву "е", если "а" стоит на четном...

Из слов "Работа", "крест", "тон" составить фразу "Кто не работает, тот не ест" и определить ее длину
Из слова "Работа","крест","тон" составить фразу:"Кто не работает, тот не ест" и...

На форме располагаются компоненты: редактор Edit; линейка ScrollBar; радионабор с опциями "Цветы", "Деревья", "Рыбы", "Звери"
Доброго времени суток, 2 курс 2 семестр, пришли, препод раздал задачи, сказал...

Сформируйте новый файл t2, который будет содержать те строки файла t1, которые начинаются с буквы "а" и заканчиваются буквой "я"
Задание 4. Задан текстовый файл t1. Сформируйте новый файл t2, который будет...

Тысячные числа исправлять к примеру с "1200" на "1 200", "12000" на "12 000" и т.д
Собственно числа исправлять к примеру с "1200" на "1 200", "12000" на "12 000",...

14
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
17.04.2012, 22:50 2
Можно так:
Delphi
1
2
3
4
5
6
procedure TForm2.FormDestroy(Sender: TObject);
begin
  //Writeln(F);
  Write(F, 'Завершение работы: ' + FormatDateTime('hh:nn:ss', Now - TimeStart) );
  CloseFile(F);
end;
0
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
17.04.2012, 23:28  [ТС] 3
Доработал до:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm2.FormDestroy(Sender: TObject);
var  time : Extended;
F : TextFile;
fs: TFileStream;
begin
  time := (Now - t)/(24*60*60);
 
  if FileExists(ExtractFilePath(Application.ExeName) + 'Log.txt')  then begin
    AssignFile(F, ExtractFilePath(Application.ExeName) + 'Log.txt');
  Append(F);
  WriteLn(F, 'Завершение работы: ' + FormatDateTime('hh:nn:ss', Now - t));
  CloseFile(F);
  end
 else
 WriteLn(f,ExtractFilePath(Application.ExeName) + 'Log.txt');
 Append(F);
 WriteLn(F, 'Завершение работы: ' + FormatDateTime('hh:nn:ss', Now - t));
 CloseFile(f);
 
end;
Задумка такая: если файла нет, то он создается и туда записываются данные, соответственно если файл есть, то данные просто записываются.

Но что-то не получилось, где ошибка?
Если файл существует сразу, то туда записываются АЖ 2 сразу значения одинаковые, а если нет файла то ошибка.
0
Mawrat
12833 / 5741 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
17.04.2012, 23:38 4
Немного надо подправить:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm2.FormDestroy(Sender: TObject);
var
  F : TextFile;
  FileName : String;
begin
  FileName := ExtractFilePath(Application.ExeName) + 'Log.txt';
  AssignFile(F, FileName);
  if FileExists(FileName) then
    Append(F)
  else
    Rewrite(F)
  ;
  WriteLn(F, 'Завершение работы: ' + FormatDateTime('hh:nn:ss', Now - t));
  CloseFile(F);
end;
1
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
17.04.2012, 23:49  [ТС] 5
За это спасибо огромное, все работает.

Еще вопрос назрел, как отследить, к примеру, что в программе был скачан файл обновления(сам только додумался до if FileExists)?

А качается он у меня так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
procedure TForm1.Button1Click(Sender: TObject);
var
Stream:TMemoryStream;
url,r:WideString;
i,j:integer;
begin
try
Stream:=TMemoryStream.Create;
url:='http://111/version/update/123.rar';
for i:=1 to length(url) do
begin
if url[i]='.' then
begin
j:=i;
end;
end;
r:=copy(url,j+1,length(url));
IdHTTP1.Get(url,Stream);
Stream.SaveToFile('update.'+r);
Stream.Free;
 
except
on e:Exception do
Stream.Free;
 
end;
if progressbar1.position=progressbar1.max then
Application.Messagebox('Загрузка обновления прошла успешно. Откройте файл "Update" в каталоге программы!','Загрузка обновления..', mb_iconinformation or mb_ok);
 
 
end;
 
procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
ProgressBar1.Position:=ProgressBar1.Position+AWorkCount;
end;
 
procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
ProgressBar1.Max:=AWorkCountMax;
end;
 
end.
Конечно тухловатая, но появилась идея на каждую нужную кнопочку вешать функцию, которая будет писать в лог, что кнопка была нажата.
0
Neavy
33 / 28 / 7
Регистрация: 17.04.2012
Сообщений: 59
18.04.2012, 09:17 6
ну почему же тухловатая? вполне логичное логирование
более удобно будет использовать процедуру:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure Log(Text:string);
var
  F : TextFile;
  FileName : String;
  dt:string;
begin
  FileName := ExtractFilePath(Application.ExeName) + 'Log.txt';
  AssignFile(F, FileName);
  if FileExists(FileName) then
    Append(F)
  else
    Rewrite(F);
    dt:=DateToStr(Date);
    dt:=dt+' '+TimeToStr(Time);
  WriteLn(F, text+': ' +dt);
  CloseFile(F);
end;
использование:
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  Log('Нажат Button1');
end;
1
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
18.04.2012, 15:52  [ТС] 7
Спасибо, только тогда уж
Цитата Сообщение от Neavy Посмотреть сообщение
procedure TForm2.Log(Text:string);
0
Neavy
33 / 28 / 7
Регистрация: 17.04.2012
Сообщений: 59
18.04.2012, 16:08 8
Цитата Сообщение от HanDi Посмотреть сообщение
Спасибо, только тогда уж
В пределах одной формы будет работать без привязки процедуры к форме.
Ну , я описал общий случай. А уже к какой форме привязывать процедуру решать вам
1
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
18.04.2012, 16:19  [ТС] 9
Да это мелочь, но без нее все не работало

Вот еще такой вопрос, получается что процедура лог хранит string данные, т.е. текстовые.
Как в нее запихнуть переменную Z, типа Extended?:

Delphi
1
2
3
4
5
6
procedure TForm2.FormDestroy(Sender: TObject);
var  Z : Extended;
begin
  Z := (Now - t)/(24*60*60);
Log('Завершение работы программы');
end;
Пробовал и через IntToStr, не работает :O
0
Neavy
33 / 28 / 7
Регистрация: 17.04.2012
Сообщений: 59
18.04.2012, 16:47 10
Delphi
1
FloatToStr(Z);
0
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
18.04.2012, 17:04  [ТС] 11
Delphi
1
2
3
4
5
6
procedure TForm2.FormDestroy(Sender: TObject);
var  Z : Extended;
begin
  Z := (Now - t)/(24*60*60);
Log('Завершение работы программы / '+FloatToStr(Z));
end;
Итого имеем:
18.04.2012 / 16:03:10 : Завершение работы программы / 4,83592733265444E-10
WTF?
0
Neavy
33 / 28 / 7
Регистрация: 17.04.2012
Сообщений: 59
18.04.2012, 17:30 12
Delphi
1
Z := (Now - t)/(24*60*60);
какую функцию выполняет данная строка? количество секунд с момента запуска программы?
0
HanDi
892 / 339 / 65
Регистрация: 11.02.2012
Сообщений: 1,502
18.04.2012, 17:35  [ТС] 13
Так точно.
При старте: t := Now;
0
duhar
60 / 43 / 6
Регистрация: 15.01.2012
Сообщений: 167
18.04.2012, 17:35 14
Цитата Сообщение от HanDi Посмотреть сообщение
WTF?
в uses надо добавить модуль Math, а
Z := (Now - t)/(24*60*60);
заменить на
Delphi
1
Z := RoundTo((Now - t)/(24*60*60), -x);
где x - количество знаков после запятой

или же просто
Delphi
1
Z := Round((Now - t)/(24*60*60));
если нужно целое число
1
Neavy
33 / 28 / 7
Регистрация: 17.04.2012
Сообщений: 59
18.04.2012, 17:44 15
или же можно подключить DateUtils
и высчитать разницу секунд так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
uses DateUtils;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(SecondsBetween(now, t)));
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  t := now;
end;
0
18.04.2012, 17:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2012, 17:44

1.Задан текстовый файл "test.txt". Написать программу,которая меняет первый символ строки на символ "?"
1.Задан текстовый файл "test.txt". Написать программу,которая меняет первый...

Файл: Добавить в конец файла "Name1" содержимое файла "Name2"
Даны два тестовых фаила с именами "Name1" и "Name2". Добавить в конец фаила...

В слове Х перед каждой буквой "к", которой предшествует буква "с", вставить букву "н"
Привет всем) вот условие задачи:В слове Х перед каждой буквой "к", которой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru