Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2017, 01:07   #1
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию VersionInfo, как получить и записать в memo

Здравствуйте, меня интересует вопрос, как записать информацию о файле в memo используя отдельно подключаемый юнит, который я нашел на просторах интернета:

http://www.delphisources.ru/pages/fa...bout_file.html

Я изучаю Delphi и мне бы хотелось вывести всю информацию о выбранном файле в memo.

Конечно, если есть варианты легче, не подключая отдельный юнит, я тоже был бы рад посмотреть.

Последний раз редактировалось Spq; 01.09.2017 в 01:10.
Spq вне форума Ответить с цитированием
Старый 01.09.2017, 08:11   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Возвращает данные по собственному exe-файлу программы:

Код:
uses
  FileInfo;

var
  vFileInfo: TFileInfo;

begin
  vFileInfo:= TFileInfo.Create(ParamStr(0));
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Имя файла: ' + vFileInfo.FileName);
  Memo1.Lines.Add('Расположение файла: ' + vFileInfo.Path);
  Memo1.Lines.Add('Тип файла: ' + vFileInfo.FileType);
  Memo1.Lines.Add('Версия файла: ' + vFileInfo.VersionString);
  Memo1.Lines.Add('Размер файла: ' + IntToStr(vFileInfo.FileSize));
  FreeAndNil(vFileInfo);
end;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 01.09.2017 в 08:13.
Sciv вне форума Ответить с цитированием
Старый 01.09.2017, 08:15   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

Код:
unit rpVersionInfo; //версия 1.0 3/8/98 записана и проверена в Delphi 3.
(*Автор Rick Peterson, данный компонент распространяется свободно

и освобожден от платы за использование. В случае изменения
авторского кода просьба прислать измененный код. Сообщайте пожалуйста
обо всех найденных ошибках. Адрес для писем - rickpet@airmail.net. *)

interface

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  TypInfo;

type
{$M+}
  (* Видели директиву $M+??? Это заставляет Delphi включать в код RTTI-информацию для

  перечислимых типов. В основном допускает работу с перечислимыми типами как
  со строками с помощью GetEnumName *)
  TVersionType = (vtCompanyName, vtFileDescription, vtFileVersion,
    vtInternalName,
    vtLegalCopyright, vtLegalTradeMark, vtOriginalFileName,
    vtProductName, vtProductVersion, vtComments);
{$M-}

  TrpVersionInfo = class(TComponent)
    (* Данный компонент позволяет получать информацию о версии вашего приложения

    во время его выполенния *)
  private
    FVersionInfo: array[0..ord(high(TVersionType))] of string;
  protected
    function GetCompanyName: string;
    function GetFileDescription: string;
    function GetFileVersion: string;
    function GetInternalName: string;
    function GetLegalCopyright: string;
    function GetLegalTradeMark: string;
    function GetOriginalFileName: string;
    function GetProductName: string;
    function GetProductVersion: string;
    function GetComments: string;
    function GetVersionInfo(VersionType: TVersionType): string; virtual;
    procedure SetVersionInfo; virtual;
  public
    constructor Create(AOwner: TComponent); override;
  published
    (* Использовать это очень просто - Label1.Caption := VersionInfo1.FileVersion

    Примечание: Все свойства - только для чтения, поэтому они недоступны в
    Инспекторе Объектов *)
    property CompanyName: string read GetCompanyName;
    property FileDescription: string read GetFileDescription;
    property FileVersion: string read GetFileVersion;
    property InternalName: string read GetInternalName;
    property LegalCopyright: string read GetLegalCopyright;
    property LegalTradeMark: string read GetLegalTradeMark;
    property OriginalFileName: string read GetOriginalFileName;
    property ProductName: string read GetProductName;
    property ProductVersion: string read GetProductVersion;
    property Comments: string read GetComments;
  end;

procedure Register;

implementation

constructor TrpVersionInfo.Create(AOwner: TComponent);
begin

  inherited Create(AOwner);
  SetVersionInfo;
end;

function TrpVersionInfo.GetCompanyName: string;
begin

  result := GeTVersionInfo(vtCompanyName);
end;

function TrpVersionInfo.GetFileDescription: string;
begin

  result := GeTVersionInfo(vtFileDescription);
end;

function TrpVersionInfo.GetFileVersion: string;
begin

  result := GeTVersionInfo(vtFileVersion);
end;

function TrpVersionInfo.GetInternalName: string;
begin

  result := GeTVersionInfo(vtInternalName);
end;

function TrpVersionInfo.GetLegalCopyright: string;
begin

  result := GeTVersionInfo(vtLegalCopyright);
end;

function TrpVersionInfo.GetLegalTradeMark: string;
begin

  result := GeTVersionInfo(vtLegalTradeMark);
end;

function TrpVersionInfo.GetOriginalFileName: string;
begin
  result := GeTVersionInfo(vtOriginalFileName);
end;

function TrpVersionInfo.GetProductName: string;
begin
  result := GeTVersionInfo(vtProductName);
end;

function TrpVersionInfo.GetProductVersion: string;
begin
  result := GeTVersionInfo(vtProductVersion);
end;

function TrpVersionInfo.GetComments: string;
begin
  result := GeTVersionInfo(vtComments);
end;

function TrpVersionInfo.GeTVersionInfo(VersionType: TVersionType): string;
begin
  result := FVersionInfo[ord(VersionType)];
end;

procedure TrpVersionInfo.SeTVersionInfo;
var
  sAppName, sVersionType: string;
  iAppSize, iLenOfValue: Cardinal;
  i: integer;
  pcBuf, pcValue: PChar;
begin
  sAppName := Application.ExeName;
  iAppSize := GetFileVersionInfoSize(PChar(sAppName), iAppSize);
  if iAppSize > 0 then
  begin
    pcBuf := AllocMem(iAppSize);
    GetFileVersionInfo(PChar(sAppName), 0, iAppSize, pcBuf);
    for i := 0 to Ord(High(TVersionType)) do
    begin
      sVersionType := GetEnumName(TypeInfo(TVersionType), i);
      sVersionType := Copy(sVersionType, 3, length(sVersionType));
      if VerQueryValue(pcBuf, PChar('StringFileInfo\041904E3\' +
        sVersionType), Pointer(pcValue), iLenOfValue) then
        FVersionInfo[i] := pcValue;
    end;
    FreeMem(pcBuf, iAppSize);
  end;
end;

procedure Register;
begin
  RegisterComponents('FreeWare', [TrpVersionInfo]);
end;

end.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 01.09.2017, 13:24   #4
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Возвращает данные по собственному exe-файлу программы:

Код:
uses
  FileInfo;

var
  vFileInfo: TFileInfo;

begin
  vFileInfo:= TFileInfo.Create(ParamStr(0));
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Имя файла: ' + vFileInfo.FileName);
  Memo1.Lines.Add('Расположение файла: ' + vFileInfo.Path);
  Memo1.Lines.Add('Тип файла: ' + vFileInfo.FileType);
  Memo1.Lines.Add('Версия файла: ' + vFileInfo.VersionString);
  Memo1.Lines.Add('Размер файла: ' + IntToStr(vFileInfo.FileSize));
  FreeAndNil(vFileInfo);
end;
Спасибо за код, работает. Могу ли я также записать в memo информацию о другом файле?


Цитата:
Сообщение от min@y™ Посмотреть сообщение
Код:
unit rpVersionInfo; //версия 1.0 3/8/98 записана и проверена в Delphi 3.
(*Автор Rick Peterson, данный компонент распространяется свободно

и освобожден от платы за использование. В случае изменения
авторского кода просьба прислать измененный код. Сообщайте пожалуйста
обо всех найденных ошибках. Адрес для писем - rickpet@airmail.net. *)

interface

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  TypInfo;

type
{$M+}
  (* Видели директиву $M+??? Это заставляет Delphi включать в код RTTI-информацию для

  перечислимых типов. В основном допускает работу с перечислимыми типами как
  со строками с помощью GetEnumName *)
  TVersionType = (vtCompanyName, vtFileDescription, vtFileVersion,
    vtInternalName,
    vtLegalCopyright, vtLegalTradeMark, vtOriginalFileName,
    vtProductName, vtProductVersion, vtComments);
{$M-}

  TrpVersionInfo = class(TComponent)
    (* Данный компонент позволяет получать информацию о версии вашего приложения

    во время его выполенния *)
  private
    FVersionInfo: array[0..ord(high(TVersionType))] of string;
  protected
    function GetCompanyName: string;
    function GetFileDescription: string;
    function GetFileVersion: string;
    function GetInternalName: string;
    function GetLegalCopyright: string;
    function GetLegalTradeMark: string;
    function GetOriginalFileName: string;
    function GetProductName: string;
    function GetProductVersion: string;
    function GetComments: string;
    function GetVersionInfo(VersionType: TVersionType): string; virtual;
    procedure SetVersionInfo; virtual;
  public
    constructor Create(AOwner: TComponent); override;
  published
    (* Использовать это очень просто - Label1.Caption := VersionInfo1.FileVersion

    Примечание: Все свойства - только для чтения, поэтому они недоступны в
    Инспекторе Объектов *)
    property CompanyName: string read GetCompanyName;
    property FileDescription: string read GetFileDescription;
    property FileVersion: string read GetFileVersion;
    property InternalName: string read GetInternalName;
    property LegalCopyright: string read GetLegalCopyright;
    property LegalTradeMark: string read GetLegalTradeMark;
    property OriginalFileName: string read GetOriginalFileName;
    property ProductName: string read GetProductName;
    property ProductVersion: string read GetProductVersion;
    property Comments: string read GetComments;
  end;

procedure Register;

implementation

constructor TrpVersionInfo.Create(AOwner: TComponent);
begin

  inherited Create(AOwner);
  SetVersionInfo;
end;

function TrpVersionInfo.GetCompanyName: string;
begin

  result := GeTVersionInfo(vtCompanyName);
end;

function TrpVersionInfo.GetFileDescription: string;
begin

  result := GeTVersionInfo(vtFileDescription);
end;

function TrpVersionInfo.GetFileVersion: string;
begin

  result := GeTVersionInfo(vtFileVersion);
end;

function TrpVersionInfo.GetInternalName: string;
begin

  result := GeTVersionInfo(vtInternalName);
end;

function TrpVersionInfo.GetLegalCopyright: string;
begin

  result := GeTVersionInfo(vtLegalCopyright);
end;

function TrpVersionInfo.GetLegalTradeMark: string;
begin

  result := GeTVersionInfo(vtLegalTradeMark);
end;

function TrpVersionInfo.GetOriginalFileName: string;
begin
  result := GeTVersionInfo(vtOriginalFileName);
end;

function TrpVersionInfo.GetProductName: string;
begin
  result := GeTVersionInfo(vtProductName);
end;

function TrpVersionInfo.GetProductVersion: string;
begin
  result := GeTVersionInfo(vtProductVersion);
end;

function TrpVersionInfo.GetComments: string;
begin
  result := GeTVersionInfo(vtComments);
end;

function TrpVersionInfo.GeTVersionInfo(VersionType: TVersionType): string;
begin
  result := FVersionInfo[ord(VersionType)];
end;

procedure TrpVersionInfo.SeTVersionInfo;
var
  sAppName, sVersionType: string;
  iAppSize, iLenOfValue: Cardinal;
  i: integer;
  pcBuf, pcValue: PChar;
begin
  sAppName := Application.ExeName;
  iAppSize := GetFileVersionInfoSize(PChar(sAppName), iAppSize);
  if iAppSize > 0 then
  begin
    pcBuf := AllocMem(iAppSize);
    GetFileVersionInfo(PChar(sAppName), 0, iAppSize, pcBuf);
    for i := 0 to Ord(High(TVersionType)) do
    begin
      sVersionType := GetEnumName(TypeInfo(TVersionType), i);
      sVersionType := Copy(sVersionType, 3, length(sVersionType));
      if VerQueryValue(pcBuf, PChar('StringFileInfo\041904E3\' +
        sVersionType), Pointer(pcValue), iLenOfValue) then
        FVersionInfo[i] := pcValue;
    end;
    FreeMem(pcBuf, iAppSize);
  end;
end;

procedure Register;
begin
  RegisterComponents('FreeWare', [TrpVersionInfo]);
end;

end.
Сильный юнит, но мне бы что попроще

Впрочем, я проверил его. Если я не ошибаюсь, его ведь надо подключать в uses или где-то еще?
Spq вне форума Ответить с цитированием
Старый 01.09.2017, 14:41   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от Spq Посмотреть сообщение
Могу ли я также записать в memo информацию о другом файле?
Да, вместо ParamStr(0) передать строкой путь до файла, например:

Код:
  vFileInfo:= TFileInfo.Create('c:\windows\regedit32.exe');
вернёт свойства файла regedit32.exe
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 01.09.2017, 14:50   #6
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Да, вместо ParamStr(0) передать строкой путь до файла, например:

Код:
  vFileInfo:= TFileInfo.Create('c:\windows\regedit32.exe');
вернёт свойства файла regedit32.exe
Спасибо, а если самому выбирать определенный файл, а не записывать его через путь? Использую opendialog в качестве выбора файла.
Spq вне форума Ответить с цитированием
Старый 01.09.2017, 14:58   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Spq Посмотреть сообщение
Спасибо, а если самому выбирать определенный файл, а не записывать его через путь? Использую opendialog в качестве выбора файла.
какая разница?
нужно указывать имя файла. Брать его можно из строки, из реестра, из командной строки, из OpenDialog. да хоть из TEdit.

В вашем случае нужно просто так:
Код:
  vFileInfo:= TFileInfo.Create(OpenDialog1.FileName);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.09.2017, 15:11   #8
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
какая разница?
нужно указывать имя файла. Брать его можно из строки, из реестра, из командной строки, из OpenDialog. да хоть из TEdit.

В вашем случае нужно просто так:
Код:
  vFileInfo:= TFileInfo.Create(OpenDialog1.FileName);
Я пытался, почему-то возникает ошибка:

Цитата:
System error, code 3
Системе не удается найти указанный путь
Куда копать я без понятия. Либо в коде ошибка где-то у меня, либо не знаю.

Есть в коде подобный кусок:

Цитата:
label10.Caption := ExtractFileName(OpenDialog1.FileNam e);
Вот он таки обрабатывается нормально
Spq вне форума Ответить с цитированием
Старый 01.09.2017, 15:23   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Spq Посмотреть сообщение
Я пытался, почему-то возникает ошибка:

Цитата:
System error, code 3
Системе не удается найти указанный путь
Куда копать я без понятия. Либо в коде ошибка где-то у меня, либо не знаю.
покажите код полностью, как пытались.

Вы, надеюсь, правильно используете TOpenDialog ?
метод Execute вызываете? проверяете, что он вернул?

ну, например, так:
Код:
  if OpenDialog1.Execute then
  begin
      vFileInfo:= TFileInfo.Create(OpenDialog1.FileName);
      ......
  end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.09.2017, 15:39   #10
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
покажите код полностью, как пытались.

Вы, надеюсь, правильно используете TOpenDialog ?
метод Execute вызываете? проверяете, что он вернул?

ну, например, так:
Код:
  if OpenDialog1.Execute then
  begin
      vFileInfo:= TFileInfo.Create(OpenDialog1.FileName);
      ......
  end;
Да, я пропустил вызов метода Execute. Спасибо большое, все работает!
Spq вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как записать в переменную типа TextFile данные из memo sap_ax Общие вопросы Delphi 9 22.12.2012 20:58
Как записать в memo строку за строкой используя изменения combobox? Человек_Борща Общие вопросы Delphi 3 11.04.2010 17:18
Как получить из webbrawser'а исходник HTML в memo Marsel737 Общие вопросы Delphi 5 25.11.2009 18:37
FoxPro. Как записать в поле Memo большой текст? zag БД в Delphi 5 30.05.2008 06:10
Как имея хендл на Memo получить выделенный в нем текст? hoza_syl Помощь студентам 2 23.05.2008 17:06