Delphi-int.ru: портал программистов

Вход Регистрация | Забыли пароль?

Просмотр кода

Идентификатор: 44c86547 Описание: Код загружен: 4 июля 2011, 09:30 (min@y™)

unit uRoutines;
 
interface
 
uses
  //============================== Модули проекта ==============================
  uConsts,
  //=============================== Левые модули ===============================
  rpVersionInfo, {CoolTrayIcon, }RxStrUtils,
  //============================= Системные модули =============================
  Windows, Classes, Forms, Registry, SysUtils, Controls, ComCtrls, ShlObj;
 
type
  TNotifyIcon = (niNone, niInfo, niWarning, niError);
  {TShowBalloonHintMethod = function (Title: String;
                                     Text: String;
                                     IconType: TBalloonHintIcon;
                                     TimeoutSecs: TBalloonHintTimeOut): Boolean of object;   }
 
// ------------------------ Математические функции -----------------------------
function IntegerInRange(const Value, Min, Max: Integer): Boolean;
 
// -------------------------- Логические функции -------------------------------
procedure SetBit(var AValue: Integer; const ABit: Boolean; const ABitNumber: Byte); // Установка бита в 32-битном целом
 
// ------------------------ Функции преобразований -----------------------------
function AdvancedStr2Int(const AValue: string): Integer; // Перевод строки в число в системе счисления 10, 16, 8, 2 
function IsValueSystem(const S: string; const ASystem: Byte): Boolean; // Определение системы счисления числа
function AdvancedDec2Numb(const N: Integer; const A, B, C: Byte): string; // Пpеобpазование целого числа N в число по
основанию B, дополняя слева нулями до длины A и вставляя пробелы через каждые С символов (0 - не вставляет)
function GetShellExecuteError(const ErrorCode: Integer; const FileName: string = ''): string;
 
// ----------------- Функции выдачи сообщений и запросов -----------------------
procedure NotImplementedYet(const ACaption: string); // Выдача сообщения о ещё не реализованном действии
function SaveRequest(const AFileName: string): Integer; // Выдача запроса на сохранение изменённого файла
//function ShowNotification(Title, Text: string; IconType: TNotifyIcon; // Показ уведомления в трее
//                          TimeoutSecs: TBalloonHintTimeOut): Boolean;
function BrowseForFolder(Handle: THandle;         // Вывод диалога выбора директории.
                         const Title: string;
                         var Dir: string): Boolean;
 
// -------------------- Функции для работы с реестром --------------------------
function RegFileExt(AExtension, AExtDescription, AFileDescription,
                    AOpenWith, AParamString: String; AIconIndex: Integer): Boolean;
function FileExtIsRegistered(const AExtension: string): Boolean;
function UnRegFileExt(AExtension, AExtDescription: String): Boolean;
function ExtToFileType(const Ext: string): string; // Описание формата из реестра по расширению
function FileNameToFileType(const AFileName: string): string; // Описание формата из реестра по имени файла
 
// ------------------- Функции для работы со строками --------------------------
function MatchesMask(const S, Mask: string): Boolean; // Соответствие имени файла маске
function MatchesMasks(const S: string; AMasks: TStrings): Boolean; // Соответствие имени файла одной из масок списка
function ExtractFileNameOnly(const AFileName: string): string; // Извлечение из пути имени файла без расширения
function ExtractFileExtOnly(const AFileName: string): string; // Извлечение из пути расширения файла без точки
function SwitchCase(const S: string): string; // Функция переключения регистра символов.
function IsProjectFileName(const AFileName: string): Boolean; // Проверка расширения на равенству расширению файлов
проектов
 
// -------------------- Функции для работы с классами --------------------------
procedure PushStringItem(Items: TStrings; const NewItem: string; const Max: Integer = 16);
 
// -------------------- Функции для работы с файлами ---------------------------
function GetUniqueFileName(const AFolder, APrefix, AExtention: string): string; // Поиск уникального имени файла в папке
AFolder
 
// -------- Функции для работы с компонентами и оконными элементами ------------
procedure SetControlEnabled(Parent: TWinControl; const Enabled: Boolean);  // Рекурсивная установка своства Enabled у
Parent и всех его дочерних контролов
procedure ToggleVisible(AControl: TControl); // Переключение видимости объекта
procedure CallOnIdle; // Принудительный вызов обработчика Application.OnIdle
 
 
// --------------------------- Прочие функции ----------------------------------
function GetProgramVersion: string; // Выдача версии exe-файла
procedure GlobalInit; // Инициализация глобальных переменных
 
 
// Глобальные переменные
var
  WindowsDirectory:     string;
  ProgramExeFile:       string;
  ProgramDirectory:     string;
  ProjectsDirectory:    string;
  UserName:             string;
  AutoCompleteFileName: string; // Файл для хранения пользовательских автозамен
  TagsFileName:         string; // Файл для хранения пользовательских HTML-тэгов
  //ShowBalloon: TShowBalloonHintMethod; // глобальный метод показа баллуна
  ApplicationOnIdleHandler: TIdleEvent; // Указатель на обработчик события Application.OnIdle для вызова его вручную
 
  ActivePageExists: Boolean; // Флаг существования активной страницы PageControl
  ActivePage: TTabSheet; // Ссылка на активную страницу
  CurrentProjectNode: TTreeNode; // Ссылка на текущий проект 
 
  // Запуск только одной копии программы
  MutexHandle:     THandle;
  ActivateMessage: Cardinal;
 
implementation
 
uses uSettings;
 
// ------------------------ Математические функции -----------------------------
function IntegerInRange(const Value, Min, Max: Integer): Boolean;
begin
  Result:= (Value >= Min) and (Value <= Max);
end;
 
// -------------------------- Логические функции -------------------------------
 
// Установка бита в 32-битном целом
procedure SetBit(var AValue: Integer;
                 const ABit: Boolean;
                 const ABitNumber: Byte);
begin
  if ABit
    then AValue:= AValue or (1 shl ABitNumber)
    else AValue:= AValue and not (1 shl ABitNumber);
end;
 
// ------------------------ Функции преобразований -----------------------------
 
// Перевод строки в число в системе счисления 10, 16, 8, 2
function AdvancedStr2Int(const AValue: string): Integer;
var
  Len: Integer;
  Q: string; // Число с отрезанным суффиксом b или h.
begin
  Len:= Length(AValue);
  if Len = 0
    then raise Exception.Create('Вместо числа - пустая стока');
 
  Q:= Copy(AValue, 1, Len - 1);
  if (AValue[Len] in ['H', 'h']) and IsValueSystem(Q, 16)
    then begin
           Result:= StrToInt('$' + Q);
           Exit;
         end;
 
  Q:= Copy(AValue, 3, Len - 2);
  if (LowerCase(Copy(AValue, 1, 2)) = '0x') and IsValueSystem(Q, 16)
    then begin
           Result:= StrToInt('$' + Q);
           Exit;
         end;
 
  Q:= Copy(AValue, 1, Len - 1);
  if (AValue[Len] in ['B', 'b']) and IsValueSystem(Q, 2)
    then begin
           Result:= Numb2Dec(Q, 2);
           Exit;
         end;
 
  if (AValue[1] = '0') and IsValueSystem(Copy(AValue, 2, Len - 1), 8)
    then begin
           Result:= Numb2Dec(AValue, 8);
           Exit;
         end;
 
  if IsValueSystem(AValue, 10)
    then Result:= StrToInt(AValue)
    else raise Exception.Create('Строка "' + AValue + '" не является числом.');
end;
 
// Определение системы счисления числа
function IsValueSystem(const S: string; const ASystem: Byte): Boolean;
var
  i: Integer;
  Digs: TDigitsSet;
begin
  Result:= False;
  if S = ''
    then Exit;
 
  case ASystem of
    16: Digs:= HexDigits;
     8: Digs:= OctDigits;
    10: Digs:= DecDigits;
     2: Digs:= BinDigits;
  else
        Digs:= [];
  end;
 
  for i:= 1 to Length(S) do
    if not (S[i] in Digs)
      then Exit;
 
  Result:= True;
end;
 
{ Пpеобpазует целое число N в число по основанию B,
  дополняя слева нулями до длины A и вставляя пробелы
  через каждые С символов (0 - не вставляет).}
function AdvancedDec2Numb(const N: Integer; const A, B, C: Byte): string;
var
  i, Len: Integer;
  S: string;
begin
  Result:= '';
  S:= Dec2Numb(N, A, B);
  Len:= Length(S);
 
  if C > 0
    then begin
           for i:= Len downto 1 do
             begin
               Result:= S[i] + Result;
               if (Len - i + 1) mod C = 0
                 then Result:= ' ' + Result;
             end;
           Result:= Trim(Result);
         end
    else Result:= S;
end;
 
function GetShellExecuteError(const ErrorCode: Integer; const FileName: string = ''): string;
var
 FN:string;
begin
{      Value                               Meaning
 0                The operating system is out of memory or resources.
 ERROR_FILE_NOT_FOUND  The specified file was not found.
 ERROR_PATH_NOT_FOUND  The specified path was not found.
 ERROR_BAD_FORMAT  The .EXE file is invalid (non-Win32 .EXE or error
                        in .EXE image).
 SE_ERR_ACCESSDENIED  The operating system denied access to the specified file.
 SE_ERR_ASSOCINCOMPLETE  The filename association is incomplete or invalid.
 SE_ERR_DDEBUSY          The DDE transaction could not be completed because other
                        DDE transactions were being processed.
 SE_ERR_DDEFAIL          The DDE transaction failed.
 SE_ERR_DDETIMEOUT  The DDE transaction could not be completed because the
                        request timed out.
 SE_ERR_DLLNOTFOUND  The specified dynamic-link library was not found.
 SE_ERR_FNF          The specified file was not found.
 SE_ERR_NOASSOC          There is no application associated with the given
                        filename extension.
 SE_ERR_OOM          There was not enough memory to complete the operation.
 SE_ERR_PNF          The specified path was not found.
 SE_ERR_SHARE       A sharing violation occurred.}
 
 Result:='';
 FN:='';
 if FileName<>''
  then FN:=' '+FileName;
 case ErrorCode of
  {0                      }  0 : Result:='Системе не хватает памяти или ресурсов для выполнения операции';
  {SE_ERR_FNF             }  2 : Result:='Файл'+FN+' не найден.';
  {SE_ERR_PNF             }  3 : Result:='Путь к файлу'+FN+' не найден.';
  {SE_ERR_ACCESSDENIED    }  5 : Result:='Нет доступа к файлу'+FN+'.';
  {SE_ERR_OOM             }  8 : Result:='Недостаточно памяти для выполнения операции.';
  {ERROR_BAD_FORMAT       } 11 : Result:='Файл'+FN+' не является приложением Win32 или повреждён.';
  {SE_ERR_SHARE           } 26 : Result:='Ошибка при совместном доступе к файлу'+FN+'.';
  {SE_ERR_ASSOCINCOMPLETE } 27 : Result:='The filename association is incomplete or invalid.';
  {SE_ERR_DDETIMEOUT      } 28 : Result:='The DDE transaction could not be completed because the request timed out.';
  {SE_ERR_DDEFAIL         } 29 : Result:='Транзакция DDE не может быть выполнена.';
  {SE_ERR_DDEBUSY         } 30 : Result:='Транзакция DDE не может быть выполнена, т.к. выполняется другая транзакция
DDE.';
  {SE_ERR_NOASSOC         } 31 : Result:='Файлу'+FN+' не сопоставлено приложение для его открытия.';
  {SE_ERR_DLLNOTFOUND     } 32 : Result:='Не найдена необходимая динамическая библиотека (DLL).';
  1,4,6,7,9,10,12..25          : Result:='Ошибка при работе с файлом'+FN+'.';
 end;//case
end;
 
// ----------------- Функции выдачи сообщений и запросов -----------------------
 
// Выдача сообщения о ещё не реализованном действии
procedure NotImplementedYet(const ACaption: string);
begin
  Application.MessageBox(PChar('Действие "' + ACaption + '" ещё не реализовано.'),
                         PChar('Информация'),
                         MB_OK + MB_ICONINFORMATION);
  //ShowNotification('Информация', 'Действие "' + ACaption + '" ещё не реализовано.', niInfo, 10);
end;
 
// Выдача запроса на сохранение изменённого файла
function SaveRequest(const AFileName: string): Integer;
var
  Msg: string;
begin
  if AFileName <> ''
    then Msg:= 'Сохранить изменения в файле "' + AFileName + '"?'
    else Msg:= 'Файл был изменён. Сохранить изменения?';
 
  Result:= Application.MessageBox(PChar(Msg),
                                  PChar('Запрос на сохранение'),
                                  MB_YESNOCANCEL + MB_ICONQUESTION);
end;
 
{// Показ уведомления в трее
function ShowNotification(Title, Text: string; IconType: TNotifyIcon;
                          TimeoutSecs: TBalloonHintTimeOut): Boolean;
begin
  if Assigned(ShowBalloon) and TBooleanOption(ProgramSettings.OptionsByName[snShowNotifications]).Value
    then Result:= ShowBalloon(Title, Text, TBalloonHintIcon(IconType), TimeoutSecs)
    else Result:= False;
end; }
 
// Вывод диалога выбора директории.
function BrowseForFolder(Handle: THandle;
                         const Title: string;
                         var Dir: string): Boolean;
var
  lpItemID : PItemIDList;
  BrowseInfo : TBrowseInfo;
  DisplayName : array[0..MAX_PATH] of char;
  TempPath : array[0..MAX_PATH] of char;
begin
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
 
  with BrowseInfo do
    begin
  hwndOwner:=       Handle;
  pszDisplayName:=  @DisplayName;
  lpszTitle:=       PChar(Title);
  //ulFlags:=         BIF_RETURNONLYFSDIRS + BIF_EDITBOX;
  ulFlags := BIF_RETURNONLYFSDIRS or
             $0040 or
             BIF_EDITBOX or
             BIF_STATUSTEXT;
    end;
 
  lpItemID:=                   SHBrowseForFolder(BrowseInfo);
 
  Result:=                     lpItemId <> nil;
 
  if Result
    then begin
           SHGetPathFromIDList(lpItemID, TempPath);
           Dir:= TempPath;
           GlobalFreePtr(lpItemID);
         end;
end;
 
// -------------------- Функции для работы с реестром --------------------------
 
// Регистрация расширения, установка иконки и ассоциативной программы
function RegFileExt(AExtension, AExtDescription, AFileDescription,
                    AOpenWith, AParamString: String; AIconIndex: Integer): Boolean;
  var  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
  with Reg do begin
    RootKey := HKEY_CLASSES_ROOT;
    OpenKey(AExtension, True);
    WriteString('', AExtDescription);
    OpenKey('\' + AExtDescription, True);
    WriteString('', AFileDescription);
    OpenKey('DefaultIcon', True);
    WriteString('', AOpenWith + ','+IntToStr(AIconIndex));
    OpenKey('\' + AExtDescription + '\Shell\Open\Command', True);
    WriteString('', '"' + AOpenWith + '" "' + AParamString + '"');
  end;
  Result := True;
  except
    Result := False;
  end;
  Reg.Free;
end;
 
// Проверка регистрации
function FileExtIsRegistered(const AExtension: string): Boolean;
var
  Reg: TRegistry;
begin
  Reg:= TRegistry.Create;
  try
    Reg.RootKey:= HKEY_CLASSES_ROOT;
    Result:= Reg.KeyExists(AExtension);
  finally
    Reg.Free();
  end;
end;
 
// Удаление регистрации
function UnRegFileExt(AExtension, AExtDescription: String): Boolean;
  var Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    with Reg do
     begin
      RootKey := HKEY_CLASSES_ROOT;
      DeleteKey(AExtension);
      DeleteKey('\' + AExtDescription);
     end;
   Result := True;
  except
   Result := False;
  end;
  Reg.Free;
end;
 
// Описание формата из реестра по расширению
function ExtToFileType(const Ext: string): string;
var
  Reg: TRegIniFile;
  LinkKey: string; // ccылка из ключа .ext на ключ Ext.File
begin
  Reg:= TRegIniFile.Create();
  try
    // Открытие ключа .ext
    Reg.RootKey:= HKEY_CLASSES_ROOT;
    if Reg.OpenKey('.' + Ext, False)
      then begin
             LinkKey:= Reg.ReadString('', '', '');
             Reg.CloseKey();
           end;
 
    // Открытие ключа Ext.File
    if Reg.OpenKey(LinkKey, False)
      then begin
             Result:= Reg.ReadString('', '', '');
             Reg.CloseKey();
           end;
  finally
    Reg.Free();
  end;
 
  if (LinkKey = '') or (Result = '')
    then Result:= 'Файл ''' + Ext + '''';
end;
 
// Описание формата из реестра по имени файла
function FileNameToFileType(const AFileName: string): string;
begin
  Result:= ExtToFileType(ExtractFileExtOnly(AFileName));
end;
 
// ------------------- Функции для работы со строками --------------------------
// Соответствие имени файла маске
function MatchesMask(const S, Mask: string): Boolean;
var
  si, mi: Integer;
  b: Boolean;
begin
  if Mask = ''
    then begin
           Result:= True;
           Exit;
         end;
 
    si:= 1;
    mi:= 1;
 
    while mi <= Length(mask) do
      begin
        case mask[mi] of
          '?': begin
                 Inc(si);
                 Inc(mi);
                 Continue;
               end; // '?':
 
          '*': begin
                 if mi = Length(mask)
                   then begin
                          Result:= True;
                          Exit
                        end;
 
                 Inc(mi);
 
                 while si <= Length(s) + 1 do
                   begin
                     b := MatchesMask(Copy(s, si, Length(s) - si + 1),
                                      Copy(mask, mi, Length(mask) - mi + 1));
                     if b
                       then begin
                              Result:= True;
                              Exit
                            end;
 
                     Inc(si);
                   end; // while
 
                 Result:= False;
                 Exit;
               end; // '*':
          else begin
                 if si > Length(s)
                   then begin
                          Result:= False;
                          Exit
                        end;
 
                 if s[si] <> mask[mi]
                   then begin
                          Result:= False;
                          Exit;
                        end;
               end // else
        end; // case
 
        Inc(si);
        Inc(mi);
    end; // while
 
  Result:= (si = Length(s) + 1) and (mi = Length(mask) + 1);
end;
 
// Соответствие имени файла одной из масок списка
function MatchesMasks(const S: string; AMasks: TStrings): Boolean;
var
  Index: Integer;
begin
  for Index:= 0 to AMasks.Count - 1 do
    begin
      Result:= MatchesMask(S, AMasks[Index]);
 
      if Result
        then Exit;
    end;
 
  Result:= False;
end;
 
// Извлечение из пути имени файла без расширения
function ExtractFileNameOnly(const AFileName: string): string;
var
  Index, PointPos: Integer;
begin
  Result:= ExtractFileName(AFileName);
 
  PointPos:= 0;
  for Index:= Length(Result) downto 1 do
    if Result[Index] = '.'
      then begin
             PointPos:= Index;
             Break;
           end;
 
  if PointPos <> 0
    then Result:= Copy(Result, 1, PointPos - 1);
end;
 
// Извлечение из пути расширения файла без точки
function ExtractFileExtOnly(const AFileName: string): string;
var
  Index, PointPos: Integer;
begin
  Result:= '';
 
  PointPos:= 0;
  for Index:= Length(AFileName) downto 1 do
    if AFileName[Index] = '.'
      then begin
             PointPos:= Index;
             Break;
           end;
 
  if PointPos <> 0
    then Result:= Copy(AFileName, PointPos + 1, Length(AFileName));
end;
 
// Переключение регистра символов
function SwitchCase(const S: string): string;
var
  Index: Integer;
  Symbol: Char;
begin
  Result:='';
  for Index:=1 to Length(S) do
    begin
      Symbol:=S[Index];
      case Symbol of
        #$41..#$5A, #$C0..#$DF: Inc(Symbol, $20);
        #$61..#$7A, #$E0..#$FF: Dec(Symbol, $20);
      end;
      Result:= Result + Symbol;
    end;
end;
 
// Проверка расширения на равенству расширению файлов проектов
function IsProjectFileName(const AFileName: string): Boolean;
begin
  Result:= AnsiLowerCase(ExtractFileExtOnly(AFileName)) = ProjectDefaultExt;
end;
 
// -------------------- Функции для работы с классами --------------------------
 
procedure PushStringItem(Items: TStrings; const NewItem: string; const Max: Integer = 16);
var
  Index, Count: Integer;
begin
  if NewItem = ''
    then Exit;
 
  Index:= Items.IndexOf(NewItem);
 
  if Index < 0
    then Items.Insert(0, NewItem)
    else Items.Move(Index, 0);
 
  Count:= Items.Count;
  while Count > Max do
    begin
      Items.Delete(Count - 1);
      Dec(Count);
    end;
end;
 
 
// -------------------- Функции для работы с файлами ---------------------------
 
// Поиск уникального имени файла в папке AFolder
function GetUniqueFileName(const AFolder, APrefix, AExtention: string): string;
var
  Index: Integer;
begin
  Index:= 1;
  repeat
    Result:= IncludeTrailingPathDelimiter(AFolder) + APrefix + IntToStr(Index) + AExtention;
    Inc(Index);
  until not FileExists(Result);
end;
 
 
// -------- Функции для работы с компонентами и оконными элементами ------------
 
// Рекурсивная установка своства Enabled у Parent и всех его дочерних контролов
procedure SetControlEnabled(Parent: TWinControl; const Enabled: Boolean);
var
  Control: TControl;
  Index: Integer;
begin
  if not Assigned(Parent)
    then Exit;
 
  Parent.Enabled:= Enabled;
  for Index:= 0 to Parent.ControlCount - 1 do
   begin
     Control:= Parent.Controls[Index];
     if Control is TWinControl
       then SetControlEnabled(TWinControl(Control), Enabled) // Рекурсия !!!
       else Control.Enabled:= Enabled;
   end;
end;
 
 
// Переключение видимости объекта
procedure ToggleVisible(AControl: TControl); 
begin
  AControl.Visible:= not AControl.Visible;
end;
 
// Принудительный вызов обработчика Application.OnIdle
procedure CallOnIdle;
var
  Done: Boolean;
begin
  if Assigned(ApplicationOnIdleHandler)
    then ApplicationOnIdleHandler(nil, Done);
end;
 
 
// --------------------------- Прочие функции ----------------------------------
 
// Выдача версии exe-файла
function GetProgramVersion: string;
var
  Info: TrpVersionInfo;
begin
  Info:= TrpVersionInfo.Create(nil);
  try
    Result:= Format(AboutText, [Info.FileVersion]);
  finally
    Info.Free();
  end;
end;
 
procedure GlobalInit; // Инициализация глобальных переменных
var
  Buffer: array[0..MAX_PATH - 1] of Char;
  Size: Cardinal;
begin
  GetWindowsDirectory(Buffer, MAX_PATH);
  WindowsDirectory:= Buffer;
 
  ProgramExeFile:=   ParamStr(0);
  ProgramDirectory:= ExtractFileDir(ProgramExeFile);
 
  ProjectsDirectory:= ProgramDirectory + '\Projects';
  if not DirectoryExists(ProjectsDirectory)
    then if not CreateDir(ProjectsDirectory)
           then ProjectsDirectory:= ProgramDirectory;
 
  Size:= MAX_PATH;
  GetUserName(Buffer, Size);
  UserName:= Buffer;
 
  AutoCompleteFileName:= ProgramDirectory + '\AutoComplete.ini';
  TagsFileName:= ProgramDirectory + '\HtmlTags.xml';
end;
 
end.

Ссылка на данный код:

На главную страницу сервиса обмена кодом »