2012/9/28 Bernd <[email protected]>:
> I need to read the version number of the currently active project in
> my design time package. For this I have written the following code:
>
> function TSettings.GetVersion: String;
> var
>   Res: TAbstractProjectResources;
>   ResVer: TProjectVersionInfo;
> begin
>   Res := LazarusIDE.ActiveProject.Resources as TAbstractProjectResources;
>   ResVer := Res.Resource[TProjectVersionInfo] as TProjectVersionInfo;
>   Result := Format('%d.%d.%d.%d',  [ResVer.MajorVersionNr,
>                                     ResVer.MinorVersionNr,
>                                     ResVer.RevisionNr,
>                                     ResVer.BuildNr]);
> end;
>
> It needs the unit W32VersionInfo which is in the package LCL. Now I
> have noticed that when adding LCL as a depedency to my package I
> cannot compile the IDE from a clean directory, obviously when using
> IDE while IDE is not yet compiled seems to be not such a good idea. Is
> there a better way to get the version number? I could not find any
> other place to access it.
>
> Bernd



type

  { TMyAbstractProjectResources }
  TMyAbstractProjectResources = class(TAbstractProjectResources)
    // need this to call a protected class function
    class function GetList: TList;
  end;

  TFileProductVersion = array[0..3] of word;

  {This should have the same memory layout as the original one}
  TSameLayoutAsTProjectVersionInfo = class(TAbstractProjectResource)
    FAutoIncrementBuild: boolean;
    FHexCharSet: string;
    FHexLang: string;
    FStringTable: TObject;
    FUseVersionInfo: boolean;
    FVersion: TFileProductVersion;
    // more fields follow but we are not
    // interested anymore, only need FVersion
  end;



function TSettings.GetVersion: String;
var
  ResList: TAbstractProjectResources;
  Resource: TAbstractProjectResource;
  ResClass: TAbstractProjectResourceClass;
  ResClassList: TList;
  P: Pointer;
  VerInfo: TSameLayoutAsTProjectVersionInfo;

begin
  ResList := LazarusIDE.ActiveProject.Resources as TAbstractProjectResources;
  ResClassList := TMyAbstractProjectResources.GetList;
  for P in ResClassList do begin
    ResClass := TAbstractProjectResourceClass(P);
    Resource := ResList.Resource[ResClass];
    if Resource.ClassName = 'TProjectVersionInfo' then begin
      VerInfo := TSameLayoutAsTProjectVersionInfo(Resource);
      Result := Format('%d.%d.%d.%d', [VerInfo.FVersion[0],
                                       VerInfo.FVersion[1],
                                       VerInfo.FVersion[2],
                                       VerInfo.FVersion[3]]);
      break;
    end;
  end;
end;

As you can see I am really desperate. The problem with the above code
is that it will break as soon as there are changes made to the layout
of the first 6 fields of the TProjectVersionInfo class. I have also
tried to find any way to read from the currently opened projectinfo
file but I cannot find anything other other than CustomData (and I
don't want to read it directly from disk because there could be
unsaved changes to the version number). Is there really no "normal"
way for me to read the version number?

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to