Форум: "Начинающим";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
ВнизВерсия программы... Найти похожие ветки
← →
serko © (2007-01-17 22:13) [0]Всем привет! Ребят расскажите пожалуйста как происходит генерирование и отображение в инфо версии программы?
Почему мне так кажется что все это происходит автоматически, без участия программиста...
Ато я уже замучался вписывать вручную и выдумывать аерсию проги... Вечно забываю изменить...
← →
Anatoly Podgoretsky © (2007-01-17 22:24) [1]> serko (17.01.2007 22:13:00) [0]
У тебя два вопроса.
1. автоматически генерируется номер билда
2. номер версии, все четыре составляющих можно прочитать из ресурса
Соответственно, номер версии программы в Дельфи не генерируется автоматом, только билд, возможно тебе этого хватит. Настраивается в свойства проекта.
← →
serko © (2007-01-17 23:04) [2]
> 2. номер версии, все четыре составляющих можно прочитать
> из ресурса
каким образом это делается?
← →
DrPass © (2007-01-17 23:05) [3]
> Почему мне так кажется что все это происходит автоматически,
> без участия программиста...
Если поставишь флажок "Autoincrement buid number", номер сборки будет увеличиваться автоматически. При каждой сборке, естессно. Насчет остального - а как ты думаешь, может ли Delphi лучше тебя знать, какая версия у твоей программы?
← →
Джо © (2007-01-17 23:19) [4]>
>
> [2] serko © (17.01.07 23:04)
>
> > 2. номер версии, все четыре составляющих можно прочитать
>
> > из ресурса
>
> каким образом это делается?
GetFileVersionInfo,GetFileVersionInfoSize,VerQueryValue
← →
ors_archangel © (2007-01-18 11:35) [5]Вот две составляющие, интересно, где ещё две :)
function GetFileVersion(const path,fmt: string): string;
var
ver: int;
begin
ver := SysUtils.GetFileVersion(pChar(path));
if ver = -1 then ver := $0100; // default = 1.0
result := Format(fmt, [HiWord(ver), LoWord(ver)]);
end;
← →
Джо © (2007-01-18 12:01) [6]> [5] ors_archangel © (18.01.07 11:35)
> Вот две составляющие, интересно, где ещё две :)
См. [4] :)
← →
Джо © (2007-01-18 12:06) [7]Вот, не очень изящно написано, зато давно и вполне работоспособно :)
unit VerInfo;
interface
uses Windows;
const
MaxInfoStrings = 7;
INFO_CompanyName = "CompanyName";
INFO_FileDescription = "FileDescription";
INFO_FileVersion = "FileVersion";
INFO_InternalName = "InternalName";
INFO_LegalCopyright = "LegalCopyright";
INFO_OriginalFileName = "OriginalFileName";
INFO_ProductName = "ProductName";
INFO_ProductVersion = "ProductVersion";
VersionInfoStrings: array [0..MaxInfoStrings] of string =
(
INFO_CompanyName,
INFO_FileDescription,
INFO_FileVersion,
INFO_InternalName,
INFO_LegalCopyright,
INFO_OriginalFileName,
INFO_ProductName,
INFO_ProductVersion
);
type
TFileVersion = record
Minor,
Major,
Build,
Release: WORD;
end;
// Имя файла можно указать как в конструкторе,
// так и позже, в свойстве FileName, причем, многократно
TFileVersionInfo = class
private
FFileName: string;
FBuffer: PChar;
FBuffLen: Cardinal;
FLocale: string;
procedure SetFileName(const Value: string);
procedure LoadFile (AFileName: string);
procedure UnloadFile;
function GetHasInfo: Boolean;
public
constructor Create (AFileName: string);
destructor Destroy; override;
property HasInfo: Boolean read GetHasInfo;
property FileName: string read FFileName write SetFileName;
property Locale: string read FLocale;
function GetString (AString: string): string;
function GetVersion: TFileVersion;
end;
implementation
uses SysUtils;
{ TFileVersionInfo }
type
TVer1 = record
Minor: Word;
Major: Word;
end;
TVer2 = record
Build: Word;
Release: Word;
end;
constructor TFileVersionInfo.Create(AFileName: string);
begin
FFileName := AFileName;
LoadFile(AFileName);
end;
destructor TFileVersionInfo.Destroy;
begin
UnloadFile;
inherited;
end;
function TFileVersionInfo.GetHasInfo: Boolean;
begin
Result := (FFileName <> "") and (FBuffLen <> 0);
end;
function TFileVersionInfo.GetString(AString: string): string;
var
InfoLen: Cardinal;
PInfo: PChar;
begin
if VerQueryValue(
FBuffer,
PChar("\StringFileInfo\" + FLocale + "\"+AString),
Pointer(PInfo),
InfoLen
) then
begin
Result := PInfo;
end
else
Result := ""
end;
function TFileVersionInfo.GetVersion: TFileVersion;
var
FI: PVSFixedFileInfo;
VerSize: Cardinal;
Ver1: TVer1;
Ver2: TVer2;
begin
if VerQueryValue(FBuffer,"\",Pointer(FI),VerSize) then
begin
Ver1 := TVer1(FI.dwFileVersionMS);
Ver2 := TVer2(FI.dwFileVersionLS);
Result.Minor := Ver1.Minor;
Result.Major := Ver1.Major;
Result.Build := Ver2.Build;
Result.Release := Ver2.Release;
end;
end;
procedure TFileVersionInfo.LoadFile(AFileName: string);
var
Dummy,LangLen: Cardinal;
LangBuff: PChar;
begin
UnloadFile;
FBuffLen := 0;
// Buffer size
FBuffLen := GetFileVersionInfoSize(
PChar(AFileName),
Dummy
);
if FBuffLen <> 0 then
begin
GetMem (FBuffer,FBuffLen);
// read resource data
GetFileVersionInfo(
PChar(FileName),
0,
FBuffLen,
FBuffer
);
// check string locale
VerQueryValue(FBuffer, "\VarFileInfo\Translation", pointer(LangBuff), LangLen);
if langLen >= 4 then // if specified
begin
StrLCopy(@Dummy, LangBuff, 2);
FLocale:= Format("%4.4x", [Dummy]);
StrLCopy(@Dummy, LangBuff+2, 2);
FLocale := FLocale + Format("%4.4x", [Dummy]);
end
else
// use Amer. Engl, ANSI
FLocale := "040904E4";
end;
end;
procedure TFileVersionInfo.SetFileName(const Value: string);
begin
FFileName := Value;
LoadFile(Value);
end;
procedure TFileVersionInfo.UnloadFile;
begin
FreeMem (FBuffer);
end;
end.
← →
КиТаЯц © (2007-01-18 13:56) [8]Кстати, у меня
> Если поставишь флажок "Autoincrement buid number", номер
> сборки будет увеличиваться автоматически.
не работает почему-то. Почему может не работать? D7
← →
Virgo_Style © (2007-01-18 14:38) [9]телепатирую: "Build" - это не F9, а Project - Build <имя проекта>
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.047 c