fGLAbout.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. unit fGLAbout;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.Messages,
  6. Winapi.ShellAPI,
  7. System.SysUtils,
  8. System.Variants,
  9. System.Classes,
  10. Vcl.Graphics,
  11. Vcl.Controls,
  12. Vcl.Forms,
  13. Vcl.Dialogs,
  14. Vcl.StdCtrls,
  15. Vcl.ExtCtrls,
  16. Vcl.Imaging.jpeg,
  17. //
  18. fGLDialog;
  19. type
  20. TGLAbout = class(TGLDialog)
  21. LabelCopyright: TLabel;
  22. PanelYears: TPanel;
  23. imgOpenGL: TImage;
  24. imgSourceForge: TImage;
  25. imgGLScene: TImage;
  26. LabelVersion: TLabel;
  27. StaticTextVersion: TStaticText;
  28. LabelGeoblock: TLabel;
  29. Label1: TLabel;
  30. Label3: TLabel;
  31. FreeAndOpenSource: TLabel;
  32. Label2: TLabel;
  33. procedure imgSourceForgeDblClick(Sender: TObject);
  34. procedure imgGLSceneDblClick(Sender: TObject);
  35. procedure imgOpenGLDblClick(Sender: TObject);
  36. procedure FormCreate(Sender: TObject);
  37. procedure BuiltWithDelphiDblClick(Sender: TObject);
  38. private
  39. function GetFileInfo(const FileName: TFileName): TVSFixedFileInfo;
  40. function ReadVersionInfo(FileName: TFileName): TFileName;
  41. end;
  42. var
  43. GLAbout: TGLAbout;
  44. implementation
  45. {$R *.dfm}
  46. procedure GotoURL(Handle: integer; const URL: string);
  47. var
  48. S: array[0..255] of char;
  49. begin
  50. ShellExecute(Handle, 'Open', StrPCopy(S, URL), nil, nil, SW_SHOW);
  51. end;
  52. procedure TGLAbout.BuiltWithDelphiDblClick(Sender: TObject);
  53. begin
  54. inherited;
  55. GotoURL(Handle, 'http://www.embarcadero.com');
  56. end;
  57. procedure TGLAbout.FormCreate(Sender: TObject);
  58. begin
  59. inherited;
  60. StaticTextVersion.Caption := ReadVersionInfo(ParamStr(0));
  61. end;
  62. function TGLAbout.GetFileInfo(const FileName: TFileName): TVSFixedFileInfo;
  63. var
  64. Handle, VersionSize: DWord;
  65. SubBlock: string;
  66. Temp: Pointer;
  67. Data: Pointer;
  68. begin
  69. SubBlock := '\';
  70. VersionSize := GetFileVersionInfoSize(PChar(FileName), Handle);
  71. if VersionSize > 0 then
  72. begin
  73. GetMem(Temp, VersionSize);
  74. try
  75. if GetFileVersionInfo(PChar(FileName), Handle, VersionSize, Temp) then
  76. if VerQueryValue(Temp, PChar(SubBlock), Data, VersionSize) then
  77. Result := PVSFixedFileInfo(Data)^;
  78. finally
  79. FreeMem(Temp);
  80. end;
  81. end;
  82. end;
  83. procedure TGLAbout.imgGLSceneDblClick(Sender: TObject);
  84. begin
  85. GotoURL(Handle, 'http://www.glscene.org/');
  86. end;
  87. procedure TGLAbout.imgOpenGLDblClick(Sender: TObject);
  88. begin
  89. GotoURL(Handle, 'http://www.opengl.org/');
  90. end;
  91. procedure TGLAbout.imgSourceForgeDblClick(Sender: TObject);
  92. begin
  93. GotoURL(Handle, 'http://www.sourceforge.net/projects/glscene/');
  94. end;
  95. function TGLAbout.ReadVersionInfo(FileName: TFileName): TFileName;
  96. type
  97. TGetWords = record
  98. case boolean of
  99. True: (C: cardinal);
  100. False: (Lo, Hi: word);
  101. end;
  102. var
  103. VerSize, Wnd: cardinal;
  104. Buf, Value: Pointer;
  105. MS, LS: TGetWords;
  106. begin
  107. VerSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
  108. if VerSize > 0 then
  109. begin
  110. GetMem(Buf, VerSize);
  111. GetFileVersionInfo(PChar(ParamStr(0)), 0, VerSize, Buf);
  112. VerQueryValue(Buf, '\', Value, VerSize);
  113. with TVSFixedFileInfo(Value^) do
  114. begin
  115. MS.C := dwFileVersionMS;
  116. LS.C := dwFileVersionLS;
  117. Result := Format('%d.%d.%d Build %d', [MS.Hi, MS.Lo, LS.Hi, LS.Lo]);
  118. end;
  119. FreeMem(Buf);
  120. end
  121. else
  122. Result := 'Unknown'; // or LoadResString(@sUnknown);
  123. end;
  124. end.