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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2017, 05:19   #11
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от 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.

Здравствуйте еще раз. Разбираясь с модулями, никак не мог остаться в покое. Хотелось научиться подключать дополнительные модули. Модуль FileInfo работает отлично, спасибо что подсказали как подключить, я начинаю немного понимать. Но при подключении модуля выше (rpVersionInfo) у меня возникли трудности. В частности, подключаю я его также, как fileinfo, но в конечном итоге выходит ошибка:

[dcc32 Error] Unit1.pas(249): E2010 Incompatible types: 'TComponent' and 'TFileName'

Можете подсказать что я делаю не так? Мне на будущее, чтобы потом легче было разобраться с другими модулями.
Spq вне форума Ответить с цитированием
Старый 03.09.2017, 12:15   #12
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от Spq Посмотреть сообщение
Incompatible types: 'TComponent' and 'TFileName'
Несовместимые типы TComponent и TFileName. Очень похоже, что Вы передаёте в переменную типа TComponent или его наследника значение TFileName. Приведите код, как именно Вы обращаетесь к указанному модулю.

И да, приведённый модуль - это код компонента, его нужно установить в IDE.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 03.09.2017, 20:21   #13
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Несовместимые типы TComponent и TFileName. Очень похоже, что Вы передаёте в переменную типа TComponent или его наследника значение TFileName. Приведите код, как именно Вы обращаетесь к указанному модулю.

И да, приведённый модуль - это код компонента, его нужно установить в IDE.
Цитата:
uses rpVersionInfo;
Я указываю ее как глобальную переменную

Цитата:
var
vTrpVersionInfo: TrpVersionInfo;
и добавляю следующий код:

Цитата:
vTrpVersionInfo := TrpVersionInfo.Create(ParamStr(0));
Memo1.Lines.Clear;
Memo1.Lines.Add(vTrpVersionInfo.Fil eVersion);
Memo1.Lines.Add(vTrpVersionInfo.Com panyName);
Memo1.Lines.Add(vTrpVersionInfo.Fil eDescription);
Memo1.Lines.Add(vTrpVersionInfo.Leg alCopyright);
Memo1.Lines.Add(vTrpVersionInfo.Leg alTradeMark);
Цитата:
И да, приведённый модуль - это код компонента, его нужно установить в IDE.
Получается, мне нужно найти этот компонент в интернете?
Spq вне форума Ответить с цитированием
Старый 03.09.2017, 22:52   #14
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

О, а вот и ошибка:

Цитата:
Код:
vTrpVersionInfo := TrpVersionInfo.Create(ParamStr(0));
Передаёте ParamStr(0), которая действительно имеет тип TFileInfo, в конструктор с параметром TComponent:

Код:
  
public
    constructor Create(AOwner: TComponent); override;
нужно

Код:
vTrpVersionInfo := TrpVersionInfo.Create(nil);
И обратите внимание на комментарий в модуле:
Цитата:
Код:
(* Данный компонент позволяет получать информацию о версии вашего приложения во время его выполенния *)
Цитата:
Получается, мне нужно найти этот компонент в интернете?
Получается, Вам его по сути дали в виде кода. Не обязательно его устанавливать, можно и в uses прописать (что Вы, собственно, и сделали).

Преимущество компонентов (визуальных) в том, что если Вы его, скажем, бросите на форму - метод Create для этого компонента выполнится вместе с Create самой формы - это избавляет от создания объекта в коде, как это выше описано.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 03.09.2017, 23:28   #15
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Несовместимые типы TComponent и TFileName. Очень похоже, что Вы передаёте в переменную типа TComponent или его наследника значение TFileName. Приведите код, как именно Вы обращаетесь к указанному модулю.

И да, приведённый модуль - это код компонента, его нужно установить в IDE.
Цитата:
Сообщение от Sciv Посмотреть сообщение
О, а вот и ошибка:



Передаёте ParamStr(0), которая действительно имеет тип TFileInfo, в конструктор с параметром TComponent:

Код:
  
public
    constructor Create(AOwner: TComponent); override;
нужно

Код:
vTrpVersionInfo := TrpVersionInfo.Create(nil);
И обратите внимание на комментарий в модуле:




Получается, Вам его по сути дали в виде кода. Не обязательно его устанавливать, можно и в uses прописать (что Вы, собственно, и сделали).

Преимущество компонентов (визуальных) в том, что если Вы его, скажем, бросите на форму - метод Create для этого компонента выполнится вместе с Create самой формы - это избавляет от создания объекта в коде, как это выше описано.
Спасибо за пояснение. Теперь задался вопросом в связи с комментарием в коде. Получается я никак не могу с помощью этого модуля скопировать versioninfo другого приложения? Модуль очень интересный и по своим функциям подходит для меня больше. Используя решение, которые вы мне дали, приложение запускается, но не отправляет информацию в memo, видимо как раз из-за этого. Либо я опять что-то напутал.
Spq вне форума Ответить с цитированием
Старый 05.09.2017, 04:25   #16
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию

Покопался в интернете и нашел следующий код (внес нужные мне изменения в процедуру кнопки):


Код:
type
TFileVersionInfo = record
fCompanyName,
fFileDescription,
fFileVersion,
fInternalName,
fLegalCopyRight,
fLegalTradeMark,
fOriginalFileName,
fProductName,
fProductVersion,
fComments: string;
end;

var
FileVersionInfo: TFileVersionInfo;

{...}

procedure GetAllFileVersionInfo(Filename: String);
var
Buffer: PChar;
Infosize : DWORD;

procedure InitVersion;
var
Filenamep: PChar;
begin
with FileVersionInfo do begin
Filenamep := PChar(Filename);
Infosize := GetFileVersionInfoSize(Filenamep, Infosize);
if Infosize > 0 then begin
ReAllocMem(Buffer, Infosize);
GetFileVersionInfo(Filenamep, 0, Infosize, Buffer);
end;
end;
end;

function GetVersion(Typ: String): string;
var
temp: String;
Len: DWORD;
Value: PChar;
begin
Result := 'Undefined';
if Infosize > 0 then
begin
SetLength(temp, 200);
Value := @temp;
// 04E4 (code-page)
// English: 0409 (language)
// German: 0407 (language)
if VerQueryValue(Buffer, PChar('StringFileInfo\040704E4\' + Typ), Pointer(Value), Len) then Result := Value;
end;
end;

begin
Buffer := nil;
with FileVersionInfo do begin
InitVersion;
fCompanyName := GetVersion('CompanyName');
fFileDescription := GetVersion('FileDescription');
fFileVersion := GetVersion('FileVersion');
fInternalName := GetVersion('InternalName');
fLegalCopyRight := GetVersion('LegalCopyRight');
fLegalTradeMark := GetVersion('LegalTradeMark');
fOriginalFileName := GetVersion('OriginalFileName');
fProductName := GetVersion('ProductName');
fProductVersion := GetVersion('ProductVersion');
fComments := GetVersion('Comments');
end;
if Buffer <> nil then FreeMem(Buffer);
end;

// Example
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
 begin
 GetAllFileVersionInfo(OpenDialog1.FileName);
memo1.Lines.Add(FileVersionInfo.fFileVersion);
end;
К моему удивлению я заставил его работать без проблем (сказываются знания приобретенные в этом топике), вот только проблема сама в выводе информации. Кто сможет объяснить, почему у меня вместо Версии приложения выводится Undefined? Перевод понятен, но почему так возникает?


_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 05.09.2017 в 09:27.
Spq вне форума Ответить с цитированием
Старый 05.09.2017, 16:54   #17
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

А там точно есть немецкий набор ресурсов???

Цитата:
Сообщение от Spq Посмотреть сообщение
Код:
// 04E4 (code-page) 
// English: 0409 (language) 
// German: 0407 (language) 
if VerQueryValue(Buffer, PChar('StringFileInfo\040704E4\' + Typ)
Black Fregat вне форума Ответить с цитированием
Старый 05.09.2017, 18:16   #18
Spq
Пользователь
 
Регистрация: 02.02.2017
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
А там точно есть немецкий набор ресурсов???
Я менял значения на русский,английский, все равно undefined.
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