Как сделать калькулятор в Delphi?

Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.

Как Delphi реализует многоплатформенную разработку?

Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...

Получаем всю информацию о файле

Советы » Файлы » Получаем всю информацию о файле

Данный объект может быть использован для получения исчерпывающей информации о любом файле. Так же включена функция выполнения файла Execute().

Использование: создайте объект с именем файла или путём

unit FileInfo;

interface

uses
  forms, shellapi, windows, sysutils;

type
  EFileInfo = exception;
  TLangInfoBuffer = array [1..4] of SmallInt;
  TFileInfo = class
  private
    f : TSearchRec;
    fVerBlk : TVSFixedFileInfo;
    fFileName : string;
    function GetFileVersion( AFileName : string ) : boolean;
  public
    constructor Create( AFileName : string ); // Создаём объект
    destructor Destroy; override;
    function Execute : integer; // Открывает файл в программе, связанной с ним
    function VersionString : string; // Версия файла. Строка пустая, если строка не найдена
    function OS : string; // Операционная система
    function Path : string; // Путь файла
    function FileName : string; // Имя файла
    function name : string; // Имя файла без расширения
    function DosFileName : string; // Имя файла в DOS
    function FileExt : string; // Расширение файла
    function FileType : string; // Тип файла
    function FileSize : longint; // Размер файла
    function isDebugBuild : boolean; // True если флаг отладки (debug build) установлен
    function isPreRelease : boolean; // True если флаг prerelease установлен
    function isPrivateBuild : boolean; // True если флаг private установлен
    function isSpecialBuild : boolean; // True если флаг special build установлен
    function isDirectory : boolean; // True если файл является директорией
    function isHidden : boolean; // True если файл является скрытым (hidden)
    function isSystemFile : boolean; // True если файл является системным
    function isVolumeId : boolean; // True если файл является меткой тома
    function isArchive : boolean; // True если файл является архивом
    function CreationTime : TDateTime; // Время создания файла
    function LastAccessed : TDateTime; // Время последнего доступа к файлу
    function LastWritten : TDateTime; // Время последней записи в файл
end;

implementation

constructor TFileInfo.Create(AFileName: string);
var
  ret: integer;
begin
  inherited Create;
  fFileName := AFileName;
  ret := FindFirst( AFileName, faReadOnly + faHidden+ faSysFile +
    faVolumeID + faDirectory + faArchive + faAnyFile, f );
  if ret <> 0 then
    SysUtils.RaiseLastWin32Error;
end;

destructor TFileInfo.Destroy;
begin
  FindClose( f );
end;

function TFileInfo.GetFileVersion(AFileName: string): boolean;
var
  InfoSize, puLen: DWord;
  Pt, InfoPtr: Pointer;
begin
  InfoSize := GetFileVersionInfoSize( PChar(AFileName), puLen );
  fillchar( fVerBlk, sizeof(TVSFixedFileInfo), 0);
  if InfoSize > 0 then
  begin
    GetMem(Pt,InfoSize);
    GetFileVersionInfo( PChar(AFileName), 0, InfoSize, Pt);
    VerQueryValue(Pt,'',InfoPtr,puLen);
    move(InfoPtr^, fVerBlk, sizeof(TVSFixedFileInfo) );
    FreeMem(Pt);
    result := true;
  end
  else
    result := false;
end;

function TFileInfo.VersionString: string;
begin
  if GetFileVersion( fFileName ) then
    result := Format('%u.%u.%u.%u',
    [HiWord(fVerBlk.dwProductVersionMS),
    LoWord(fVerBlk.dwProductVersionMS),
    HiWord(fVerBlk.dwProductVersionLS),
    LoWord(fVerBlk.dwProductVersionLS)])
  else
    result := '';
end;

function TFileInfo.isDebugBuild : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
    VS_FF_DEBUG) <> 0
end;

function TFIleInfo.isPreRelease : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
    VS_FF_PRERELEASE) <> 0
end;

function TFIleInfo.isPrivateBuild : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
    VS_FF_PRIVATEBUILD) <> 0
end;

function TFIleInfo.isSpecialBuild : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
    VS_FF_SPECIALBUILD) <> 0
end;

function TFileInfo.OS : string;
begin
  if GetFileVersion( fFileName ) then
    case fVerBlk.dwFileOS of
      VOS_DOS_WINDOWS16 : result := 'MS-DOS or 16 bit Windows';
      VOS_DOS_WINDOWS32 : result := '32 bit Windows';
      VOS_OS216_PM16 : result := '16 bit OS/2';
      VOS_OS232_PM32 : result := '32 bit OS/2';
      VOS_NT_WINDOWS32 : result := 'Win32 or Windows NT';
      else
        result := 'Unknown OS';
    end
  else
    result := '';
end;

function TFileInfo.FileType : string;
var
  S: string;
begin
  S := '';
  if GetFileVersion( fFileName ) then
  begin
    case fVerBlk.dwFileType of
      VFT_APP : S := 'Application';
      VFT_DLL : S := 'Dynamic Link Library (DLL)';
      VFT_DRV :
      begin
        S := 'Device Driver - ';
        case fVerBlk.dwFileSubtype of
          VFT2_DRV_PRINTER : S := S + 'Printer';
          VFT2_DRV_KEYBOARD : S := S + 'Keyboard';
          VFT2_DRV_LANGUAGE : S := S + 'Language';
          VFT2_DRV_DISPLAY : S := S + 'Display';
          VFT2_DRV_MOUSE : S := S + 'Mouse';
          VFT2_DRV_NETWORK : S := S + 'Network';
          VFT2_DRV_SYSTEM : S := S + 'System';
          VFT2_DRV_INSTALLABLE : S := S + 'Installable';
          VFT2_DRV_SOUND : S := S + 'Sound';
          else
            S := S + 'Unknown';
        end;
      end;
      VFT_FONT :
      begin
        S := 'Font File - ';
        case fVerBlk.dwFileSubType of
          VFT2_FONT_RASTER : S := S + 'Raster';
          VFT2_FONT_VECTOR : S := S + 'Vector';
          VFT2_FONT_TRUETYPE : S := S + 'TrueType';
          else
            S := S + 'Unknown';
        end;
      end;
      VFT_VXD : S := 'Virtual Device';
      VFT_STATIC_LIB : S := 'Static Link Library';
      else
        S := 'Unknown File Type';
    end;
  end;
  Result := S;
end;

function TFileInfo.Path : string;
begin
  result := ExtractFilePath( fFileName );
end;

function TFileInfo.FileName : string;
begin
  result := ExtractFileName( fFileName );
end;

function TFileInfo.name : string;
begin
  if Pos( FileExt, FileName ) > 0 then
    result := Copy( FileName, 0, pos( FileExt, FileName )-1 )
  else
    result := FileName;
end;

function TFileInfo.DosFileName : string;
begin
  result := StrPas( f.FindData.cAlternateFileName )
end;

function TFileInfo.FileExt : string;
begin
  result := ExtractFileExt( fFileName );
end;

function TFileInfo.isDirectory : boolean;
begin
  result := f.Attr and faDirectory = faDirectory;
end;

function TFileInfo.isHidden : boolean;
begin
  result := f.Attr and faHidden = faHidden;
end;

function TFileInfo.isSystemFile : boolean;
begin
  result := f.Attr and faSysFile = faSysFile;
end;

function TFileInfo.isVolumeId : boolean;
begin
  result := f.Attr and faVolumeId = faVolumeId;
end;

function TFileInfo.isArchive : boolean;
begin
  result := f.Attr and faArchive = faArchive;
end;

function TFileInfo.FileSize : longint;
begin
  result := f.Size;
end;

function TFileInfo.CreationTime : TDateTime;
var
  LTime: TFileTime;
  Systemtime: TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftCreationTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

function TFileInfo.LastAccessed : TDateTime;
var
  LTime : TFileTime;
  Systemtime : TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftLastAccessTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

function TFileInfo.LastWritten : TDateTime;
var
  LTime : TFileTime;
  Systemtime : TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftLastWriteTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

function TFileInfo.Execute : integer;
begin
  result := shellapi.ShellExecute( Application.Handle, 'open',
    pChar( fFileName ), '', pChar(Path), SW_SHOWDEFAULT );
  case result of
    0 :
      raise Exception.Create( 'Недостаточно памяти или ресурсов.' );
    ERROR_FILE_NOT_FOUND :
      raise Exception.Create( 'Указанный файл не найден.' );
    ERROR_PATH_NOT_FOUND :
      raise Exception.Create( 'Указанный путь не найден.' );
    ERROR_BAD_FORMAT :
      raise Exception.Create( 'Ошибка файла .EXE (не -Win32 .EXE или ошибка ' + 'в .EXE).' );
    SE_ERR_ACCESSDENIED :
      raise Exception.Create( 'Доступ к файлу запрещён.' );
    SE_ERR_ASSOCINCOMPLETE :
      raise Exception.Create( 'The filename association is incomplete or invalid.' );
    SE_ERR_DDEBUSY :
      raise Exception.Create( 'Транзакция DDE не может быть завершена, потому что ' +
      'другая транзакция DDE находится в процессе выполнения.' );
    SE_ERR_DDEFAIL :
      raise Exception.Create( 'Ошибка транзакции DDE.' );
    SE_ERR_DDETIMEOUT :
      raise Exception.Create( 'DDE транзакция не может быть завершина из-за тайм-аута.' );
    SE_ERR_DLLNOTFOUND :
      raise Exception.Create( 'Указанная dynamic-link library не найдена.' );
    SE_ERR_NOASSOC :
      raise Exception.Create( 'Не найдено приложение связанной с данным расширением файла.' );
    SE_ERR_OOM :
      raise Exception.Create( 'Недостаточно памяти для завершения операции.' );
    SE_ERR_SHARE :
      raise Exception.Create( 'Файл используется другим приложением.' );
    else
  end;
end;

end.

Другое по теме:

Категории

Статьи

Советы

Copyright © 2024 - All Rights Reserved - www.delphirus.com