| История переиздания | ||
|---|---|---|
| Издание 1.0 | 2003.11.30 | |
Для упрощения администрирования, при работе с сетевой версией программы, чаще всего исполняемые модули выкладываются в общедоступный сетевой ресурс. При этом во время обновления программы, достаточно заменить модули программы в одном месте. Но тут мы наталкиваемся на ряд проблем, самой существенной из которых, является освобождение программы пользователями для снятия блокировки записи.
Самым простым решением данной проблемы является дозванивание к пользователям по телефону, или рассылка сообщений с просьбой выйти из программы. Способ конечно действенный, но утомительный. Да и порой пользователей не удается застать на рабочем месте. То ли ушли на обед, а может, компьютер забыли выключить...
Данный материал не решает проблему на все сто процентов, так как при работе в DOS сессии старых CLIPPER’ных программ “многозадачная” ОС Windows 98 забывает про остальные процессы, но значительно облегчает жизнь (звонить приходится поменьше). Алгоритм достаточно простой. Периодически по таймеру программа считывает дату и время завершения, и при превышении заданного времени автоматически завершает заботу. При этом пользователю выдается соответствующее сообщение. Для вывода сообщения используется предварительно созданная html страничка, вывод которой осуществляется независимым процессом в Web браузере на клиентском компьютере.
//Метод вызова по таймеру
procedure TfrmMain.DigitalClockHalfPast(Sender: TObject;
DDGTime: TDateTime);
begin
CheckExpiredTime(Sender);
end;
//Обработчик контроля завершения программы
procedure TfrmMain.CheckExpiredTime(Sender:TObject);
var
closeAppFileName, tmpStr:String;
fTextFile:TextFile;
begin
if DM.IsExpiredTime then
begin
tmpStr:=ExtractFilePath(Application.ExeName);
closeAppFileName:=IncludeTrailingBackslash(tmpStr)
+'CloseProgram.htm';
//Контроль на наличие файла сообщения
//и попытка создания при его отсутствии
if not FileExists(closeAppFileName) then
try
AssignFile(fTextFile,closeAppFileName);
ReWrite(fTextFile);
Writeln(fTextFile,'<html>');
Writeln(fTextFile,'<head>');
Writeln(fTextFile,'<title>Сообщение программы БС-Сервис</title>');
Writeln(fTextFile,'<meta http-equiv=Content-Type content="text/html; charset=windows-1251">');
Writeln(fTextFile,'</head>');
Writeln(fTextFile,'<body>');
Writeln(fTextFile,'<p>Программа закрыта для администрирования</p>');
Writeln(fTextFile,'<p>до 15<sup>30</sup></p>');
Writeln(fTextFile,'</body>');
Writeln(fTextFile,'</html>');
CloseFile(fTextFile);
except
on E: Exception do
LogError(E.Message,['']);
end;
if FileExists(closeAppFileName) then
//вывод сообщения. RX-lib функция запуска внешнего процесса
FileExecute('closeProgram.htm','',ExtractFilePath(Application.ExeName),esNormal);
//Завершение работы программы
actApplicationExitExecute(Sender);
end;
end;
//Функция чтения времени завершения програмы из
//ini файла параметров
function TDM.IsExpiredTime:boolean;
var
iniFileName,timeStr:String;
FIniFile: TIniFile;
pIni: TObject;
FTextFile:TextFile;
expiredTime:TDateTime;
begin
pIni:=nil;
iniFileName:=ChangeFileExt(ParamStr(0), '.ini');
Result:=false;
//если ini файл не найден, то создаем
if not FileExists(iniFileName) then
begin
AssignFile(FTextFile,iniFileName);
ReWrite(FTextFile);
CloseFile(FTextFile);
end;
try
pIni := TIniFile.Create(iniFileName);
FIniFile := TIniFile(pIni);
try
//Читаем переменную ExpiredTime
//в разделе CFG
timeStr:=FIniFile.ReadString('CFG','ExpiredTime','31/12/4712 00:00:00');
expiredTime:=StrToDateFmt('DD/MM/YYYY HH:MM:SS', timeStr);
if Now >= expiredTime then
Result:=true;
except
Result:=false;
end;
finally
pIni.Destroy;
end
end;
Скачать модуль bs_lib