Author: Rubén Pozo
If you have a project with automatic builds is posible that you want change the File/Product version of the file.
Using the code below you can create a console application for to modify these values easily.
program ChangeVersion;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
UnParseDproj in 'UnParseDproj.pas';
procedure ChangeDprojVersion;
var
DprojParser : TDprojParser;
begin
DprojParser := TDprojParser.Create;
try
DprojParser.DprojFile := ParamStr(1);
DprojParser.VersionString := ParamStr(2);
DprojParser.ChangeVersion;
finally
DprojParser.Free;
end;
end;
begin
try
if ParamCount < 2 then
begin
WriteLn('Wrong syntax. Usage:');
WriteLn('ChangeVersion "Delphi project file (dproj)" "Version string(x.x.x.x)"');
end
else
begin
ChangeDprojVersion;
end;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.
unit UnParseDproj;
interface
uses
System.Sysutils,
Winapi.Ole2,
Xml.XMLIntf,
Xml.XMLDoc;
type
TDprojParser = class
private
FXMLDocument: IXMLDocument;
FDprojFile: string;
FVersionString: string;
procedure SetDprojFile(const Value: string);
procedure SetVersionString(const Value: string);
public
property DprojFile: string read FDprojFile write SetDprojFile;
property VersionString: string read FVersionString write SetVersionString;
procedure ChangeVersion;
constructor Create;
destructor Destroy; override;
end;
implementation
{ TDprojParser }
procedure TDprojParser.ChangeVersion;
var
Project, Node, VerInfo_Keys: IXMLNode;
I, J, K: Integer;
Keys_String: String;
Keys : TArray<string>;
Version: TArray<string>;
begin
try
FXMLDocument.LoadFromFile(DprojFile);
Project := FXMLDocument.ChildNodes.First;
J := Project.ChildNodes.Count - 1;
for I := 0 to J do
begin
Node := Project.ChildNodes.Nodes[I];
VerInfo_Keys := Node.ChildNodes.FindNode('VerInfo_Keys');
if VerInfo_Keys <> nil then
begin
Keys_String := VerInfo_Keys.NodeValue;
Keys := Keys_String.Split([';']);
for K := 0 to Length(Keys) - 1 do
begin
Version := Keys[K].Split(['=']);
if Version[0]= 'FileVersion' then
Keys[K] := 'FileVersion='+FVersionString;
if Version[0]= 'ProductVersion' then
Keys[K] := 'ProductVersion='+FVersionString;
end;
Keys_String := '';
for K := 0 to Length(Keys) - 1 do
Keys_String := Keys_String + Keys[K] + ';';
Keys_String := Keys_String.Substring(0,Keys_String.Length -1);
VerInfo_Keys.NodeValue := Keys_String;
end;
end;
FXMLDocument.SaveToFile(Dprojfile);
WriteLn('dproj file changed');
except
on E: Exception do
WriteLn(E.ClassName + ':' + E.Message)
end;
end;
constructor TDprojParser.Create;
begin
FXMLDocument := TXMLDocument.Create(nil);
FXMLDocument.ParseOptions := FXMLDocument.ParseOptions+[poPreserveWhiteSpace];
end;
destructor TDprojParser.Destroy;
begin
end;
procedure TDprojParser.SetDprojFile(const Value: string);
begin
FDprojFile := Value;
end;
procedure TDprojParser.SetVersionString(const Value: string);
begin
FVersionString := Value;
end;
initialization
CoInitialize(nil);
end.
Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition






