Показать сообщение отдельно
  #3  
Старый 11.02.2011, 13:44
e8gen e8gen вне форума
Прохожий
 
Регистрация: 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.
Может поможете теперь оптимизировать код? А то я не знаю, что тут еще можно сделать...
Ответить с цитированием