Просмотр кода
Идентификатор: ff168ddb Описание: 5580 Код загружен: 16 августа 2011, 16:27 (min@y™)
unit uRoutines; interface uses Windows, SysUtils, Controls, ComCtrls, Classes, Registry, Forms; function ListColumnsToStr(AColumns: TListColumns): string; procedure StrToListColumns(const S: string; AColumns: TListColumns); function GetFileVersion: string; procedure AutoRun(const Enabled: Boolean); function AutoRunExists: Boolean; function TimeInPeriod(const ATime, AFrom, ATo: TTime): Boolean; function TimeSpan(const AFrom, ATo: TTime): TTime; function TimeSpanInPeriod(const ASpanFrom, ASpanTo, AFrom, ATo: TTime): Boolean; function IntToStrLeadingZeros(const Value, Places: Integer): string; function BetweenInt(const Value, LowLimit, HighLimit: Integer): Boolean; // Глобальные переменные и константы const // Запуск только одной копии программы OneInstMutexName = 'WCOneInstanceMutex'; OneInstActivateMessage = 'WCActivateMessage'; // О программе и версии AboutText = 'Программа Worker Clocker предназначена для несчастных '#13#10 + 'работников, коротающих время до конца рабочего дня.'#13#10 + 'Разработал от нефига делать min@y™ (© 2009),'#13#10 + 'mailto:minay.tm@gmail.com'#13#10#13#10 + 'Версия программы: %s.'; // Звуки пользователя - что это такое? WhatIsIt = 'В этом списке звуковые файлы *. wav и/или *.mp3, заданные пользователем (не более 128 штук).'#13#10 + 'Первые 10 из них будут проигрываться по глобальным комбинациям клавиш WIN+1...WIN+0.'#13#10 + 'Для остановки воспроизведения нажми WIN+пробел.'; // Курсоры crHand = 1; crFist = 2; var // Запуск только одной копии программы MutexHandle: THandle; WCM_ACTIVATE: Cardinal; implementation uses rpVersionInfo; function ListColumnsToStr(AColumns: TListColumns): string; var Index: Integer; begin Result:= ''; for Index:= 0 to AColumns.Count - 1 do if Index <> 0 then Result:= Result + ';' + IntToStr(AColumns[Index].Width) else Result:= IntToStr(AColumns[Index].Width); end; procedure StrToListColumns(const S: string; AColumns: TListColumns); var Index, Width: Integer; List: TStringList; begin List:= TStringList.Create(); try List.Delimiter:= ';'; List.DelimitedText:= S; for Index:= 0 to List.Count - 1 do begin if Index > AColumns.Count - 1 then Break; if TryStrToInt(List[Index], Width) then AColumns[Index].Width:= Width; end; finally List.Free(); end; end; function GetFileVersion: string; var Info: TrpVersionInfo; begin Info:= TrpVersionInfo.Create(nil); try Result:= Format(AboutText, [Info.FileVersion]); finally Info.Free(); end; end; procedure AutoRun(const Enabled: Boolean); var Reg: TRegistry; begin Reg:= TRegistry.Create(); try Reg.RootKey:= HKEY_CURRENT_USER; Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); if Enabled // Добавление в автозагрузку then Reg.WriteString('WorkerClocker', ParamStr(0)) else begin // Удаление из автозагрузки if Reg.ValueExists('WorkerClocker') then try Reg.DeleteValue('WorkerClocker'); except Application.MessageBox(PChar('Не удалось удалить ключ автозапуска.'), PChar('Ошибка'), MB_OK + MB_ICONERROR); end; end; finally Reg.Free(); end; end; function AutoRunExists: Boolean; var Reg: TRegistry; begin Reg:= TRegistry.Create(); try Reg.RootKey:= HKEY_CURRENT_USER; Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); Result:= Reg.ValueExists('WorkerClocker'); finally Reg.Free(); end; end; // Вычисление попадания времени суток ATime в период между AFrom и ATo function TimeInPeriod(const ATime, AFrom, ATo: TTime): Boolean; var X, F, T: TTime; begin X:= Frac(ATime); // На всякий случай F:= Frac(AFrom); // На всякий случай T:= Frac(ATo); // На всякий случай if T >= F then Result:= (X >= F) and (X <= T) else Result:= (X >= F) and (X < 1.0) or (X >= 0.0) and (X <= T); end; // Вычисление длительности периода между временами суток AFrom и ATo function TimeSpan(const AFrom, ATo: TTime): TTime; var F, T: TTime; begin F:= Frac(AFrom); // На всякий случай T:= Frac(ATo); // На всякий случай if T >= F then Result:= Frac(T - F) else Result:= Frac(1 - (F - T)); end; // Вычисление попадания периода вермени суток [ASpanFrom...ASpanTo] // целиком в период [AFrom...ATo] function TimeSpanInPeriod(const ASpanFrom, ASpanTo, AFrom, ATo: TTime): Boolean; begin Result:= TimeInPeriod(ASpanFrom, AFrom, ATo) and TimeInPeriod(ASpanTo, AFrom, ATo); end; function IntToStrLeadingZeros(const Value, Places: Integer): string; begin Result:= IntToStr(Value); while Length(Result) < Places do Result:= '0' + Result; end; function BetweenInt(const Value, LowLimit, HighLimit: Integer): Boolean; begin Result:= (Value >= LowLimit) and (Value <= HighLimit); end; end.