
11.02.2011, 13:44
|
Прохожий
|
|
Регистрация: 09.02.2011
Сообщения: 5
Репутация: 10
|
|
GriLab, спасибо за совет. Я записал операторы выхода из программы в обработчик события FormCloseQuery вместо FormClose и теперь все работает! Вот что у меня получилось:
Код:
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.
Может поможете теперь оптимизировать код?  А то я не знаю, что тут еще можно сделать...
|