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

Delphi Sources



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

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

Мне нужно, чтобы программа при выключении windows записывала в файл текущие дату/время. При выходе из программы она записывает, а при выключении винды нет! Что делать? Подскажите!
Вот код:
Код:
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 и теперь все работает! Вот что у меня получилось:
Код:
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, время: 23:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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