Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.02.2011, 12:18
e8gen e8gen вне форума
Прохожий
 
Регистрация: 09.02.2011
Сообщения: 5
Репутация: 10
По умолчанию Программа для учета времени работы на компьютере. Проверьте пожалуйста код

Мне нужно, чтобы программа при выключении windows записывала в файл текущие дату/время. При выходе из программы она записывает, а при выключении винды нет! Что делать? Подскажите!
Вот код:
Код:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
unit unitSysUpt;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellApi, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Timer1: TTimer;
    Edit1: TEdit;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure IconCallBackMessage(var Mess: TMessage); message WM_USER + 100;
  end;
 
var
  Form1: TForm1;
  log: TextFile;
  t: integer;
 
implementation
 
{$R *.dfm}
 
//при открытии приложения
procedure TForm1.FormCreate(Sender: TObject);
var nid: TNotifyIconData;
begin
//создание иконки в трее
with nid do
 begin
  cbSize := SizeOf(TNotifyIconData);
  Wnd := Form1.Handle;
  uID := 1;
  uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  uCallbackMessage := WM_USER + 100;
  hIcon := Application.Icon.Handle;
  StrPCopy(szTip, 'System Uptime');
 end;
Shell_NotifyIcon(NIM_ADD, @nid);
//загрузка файла log.txt
AssignFile(log,'log.txt');
try
Append(log);
except
ReWrite(log);
end;
//запись в файл
WriteLn(log,'---------------');
WriteLn(log,'Дата включения: '+DateToStr(Now));
WriteLn(log,'Время включения: '+TimeToStr(Now));
WriteLn(log,'---------------');
//закрытие файла
CloseFile(log);
//показ содержимого файла
Memo1.Lines.LoadFromFile('log.txt');
//Memo и Edit только для чтения
Memo1.ReadOnly:=true;
Edit1.ReadOnly:=true;
//кнопка выключения не доступна
Button2.Enabled:=false;
end;
 
procedure TForm1.IconCallBackMessage(var mess: TMessage);
var mouse: TMouse;
begin
 case Mess.lParam of
  //при нажатии лев. кн. мыши на иконку в трее показывать окно
  WM_LBUTTONDOWN: Form1.Visible:=true;
 end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
//при нажатии на кнопку скрывать окно
Form1.Visible:=false;
//сделать доступной кнопку выключения
Button2.Enabled:=true;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//показ времени работы
t := GetTickCount;
Edit1.Text := 'Время работы: ' +
IntToStr(t div 60000) + ' мин ' +
IntToStr((t mod 60000) div 1000) + ' сек ' +
IntToStr(t mod 1000) + ' мсек';
end;
 
//при нажатии на кнопку выключения
procedure TForm1.Button2Click(Sender: TObject);
begin
//закрыть приложение
Form1.Close;
end;
 
//при закрытии приложения
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var nid: TNotifyIconData;
begin
//загрузка файла log.txt
AssignFile(log,'log.txt');
try
Append(log);
except
ReWrite(log);
end;
//запись в файл
WriteLn(log,'Дата выключения: '+DateToStr(Now));
WriteLn(log,'Время выключения: '+TimeToStr(Now));
WriteLn(log,'---------------');
WriteLn(log,'Время работы: '+
IntToStr(t div 60000) + ' мин ' +
IntToStr((t mod 60000) div 1000) + ' сек ' +
IntToStr(t mod 1000) + ' мсек');
WriteLn(log,'---------------');
//закрытие файла
CloseFile(log);
//убрать иконку из трея
with nid do
 begin
  cbSize := SizeOf( TNotifyIconData );
  Wnd := Form1.Handle;
  uID := 1;
  uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  uCallbackMessage := WM_USER + 100;
  hIcon := Application.Icon.Handle;
  StrPCopy(szTip, 'System Uptime');
 end;
Shell_NotifyIcon( NIM_DELETE, @nid );
end;
 
end.
Ответить с цитированием
  #2  
Старый 09.02.2011, 13:47
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Отслеживай, когда винда завершает работу программы, а не когда ее закрывает пользователь. Покопайся в гугле, у меня был похожий момент, но я не помню где сам исходник. Еще дам совет, оптимизируй свой код
Ответить с цитированием
  #3  
Старый 11.02.2011, 13:44
e8gen e8gen вне форума
Прохожий
 
Регистрация: 09.02.2011
Сообщения: 5
Репутация: 10
По умолчанию

GriLab, спасибо за совет. Я записал операторы выхода из программы в обработчик события FormCloseQuery вместо FormClose и теперь все работает! Вот что у меня получилось:
Код:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
unit unitSysUpt;
 
interface
 
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellApi, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer1: TTimer;
    Edit1: TEdit;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure IconCallBackMessage(var Mess: TMessage); message WM_USER + 100;
  end;
 
var
  Form1: TForm1;
  log: TextFile;
  time: integer;
  nid: TNotifyIconData;
 
implementation
 
uses unitAbout;
 
{$R *.dfm}
 
//при открытии формы
procedure TForm1.FormCreate(Sender: TObject);
begin
//создание иконки в трее
with nid do
 begin
  cbSize := SizeOf(TNotifyIconData);
  Wnd := Form1.Handle;
  uID := 1;
  uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  uCallbackMessage := WM_USER + 100;
  hIcon := Application.Icon.Handle;
 end;
Shell_NotifyIcon(NIM_ADD, @nid);
//загрузка файла log.txt
AssignFile(log,'log.txt');
try
Append(log);
except
ReWrite(log);
end;
//запись в файл
WriteLn(log,'Компьютер включен: '+DateToStr(Now)+' '+TimeToStr(Now));
//закрытие файла
CloseFile(log);
//показ содержимого файла
Memo1.Lines.LoadFromFile('log.txt');
//Memo и Edit только для чтения
Memo1.ReadOnly:=true;
Edit1.ReadOnly:=true;
//кнопка выключения не доступна
Button2.Enabled:=false;
end;
 
procedure TForm1.IconCallBackMessage(var mess: TMessage);
var mouse: TMouse;
begin
 case Mess.lParam of
  //при двойном нажатии лев. кн. мыши на иконку в трее показывать окно
  WM_LBUTTONDBLCLK: Form1.Visible:=true;
 end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
//скрыть окно
Form1.Visible:=false;
//сделать доступной кнопку выключения
Button2.Enabled:=true;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//показ времени работы
time := GetTickCount;
Edit1.Text := 'Время работы: ' +
IntToStr(time div 60000) + ' мин ' +
IntToStr((time mod 60000) div 1000) + ' сек ' +
IntToStr(time mod 1000) + ' мсек';
with nid do StrPCopy(szTip, 'Время работы: ' +
IntToStr(time div 60000) + ' мин ' +
IntToStr((time mod 60000) div 1000) + ' сек ' +
IntToStr(time mod 1000) + ' мсек');
Shell_NotifyIcon(NIM_MODIFY, @nid);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
//закрыть приложение
Form1.Close;
end;
 
//при закрытии формы
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
//загрузка файла log.txt
AssignFile(log,'log.txt');
try
Append(log);
except
ReWrite(log);
end;
//запись в файл
WriteLn(log,'Компьютер выключен: '+DateToStr(Now)+' '+TimeToStr(Now));
WriteLn(log,'Время работы: '+
IntToStr(time div 60000) + ' мин ' +
IntToStr((time mod 60000) div 1000) + ' сек ' +
IntToStr(time mod 1000) + ' мсек');
WriteLn(log,'******************************');
//закрытие файла
CloseFile(log);
//убрать иконку из трея
Shell_NotifyIcon(NIM_DELETE, @nid);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
//загрузка файла log.txt
AssignFile(log,'log.txt');
try
Append(log);
except
ReWrite(log);
end;
//запись в файл
WriteLn(log,'Метка: '+DateToStr(Now)+' '+TimeToStr(Now));
//закрытие файла
CloseFile(log);
//показ содержимого файла
Memo1.Lines.LoadFromFile('log.txt');
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
//показ окна "О программе"
Form2.Visible:=true;
Form1.Enabled:=false;
end;
 
end.
Может поможете теперь оптимизировать код? А то я не знаю, что тут еще можно сделать...
Ответить с цитированием
  #4  
Старый 11.02.2011, 16:29
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Не знаю как другие делают, но я бы эти функции и процедуры бы вынес отдельно: создание иконки в трее, удаление иконки из трея, открытие лог-файла, закрытие лог-файла, перевод миллисекунд в строку вида HH:MM:SS. Вот что я имею в виду

Вот посмотри: http://delphisources.ru/pages/faq/ba...wn_detect.html

Последний раз редактировалось GriLab, 11.02.2011 в 18:02.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:51.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025