История переиздания | ||
---|---|---|
Издание 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