fGLAbout.pas 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. procedure imgSourceForgeDblClick(Sender: TObject);
  33. procedure imgGLSceneDblClick(Sender: TObject);
  34. procedure imgOpenGLDblClick(Sender: TObject);
  35. procedure FormCreate(Sender: TObject);
  36. procedure BuiltWithDelphiDblClick(Sender: TObject);
  37. private
  38. function GetFileInfo(const FileName: TFileName): TVSFixedFileInfo;
  39. function ReadVersionInfo(FileName: TFileName): TFileName;
  40. end;
  41. var
  42. GLAbout: TGLAbout;
  43. implementation
  44. {$R *.dfm}
  45. procedure GotoURL(Handle: integer; const URL: string);
  46. var
  47. S: array[0..255] of char;
  48. begin
  49. ShellExecute(Handle, 'Open', StrPCopy(S, URL), nil, nil, SW_SHOW);
  50. end;
  51. procedure TGLAbout.BuiltWithDelphiDblClick(Sender: TObject);
  52. begin
  53. inherited;
  54. GotoURL(Handle, 'http://www.embarcadero.com');
  55. end;
  56. procedure TGLAbout.FormCreate(Sender: TObject);
  57. begin
  58. inherited;
  59. StaticTextVersion.Caption := ReadVersionInfo(ParamStr(0));
  60. end;
  61. function TGLAbout.GetFileInfo(const FileName: TFileName): TVSFixedFileInfo;
  62. var
  63. Handle, VersionSize: DWord;
  64. SubBlock: string;
  65. Temp: Pointer;
  66. Data: Pointer;
  67. begin
  68. SubBlock := '\';
  69. VersionSize := GetFileVersionInfoSize(PChar(FileName), Handle);
  70. if VersionSize > 0 then
  71. begin
  72. GetMem(Temp, VersionSize);
  73. try
  74. if GetFileVersionInfo(PChar(FileName), Handle, VersionSize, Temp) then
  75. if VerQueryValue(Temp, PChar(SubBlock), Data, VersionSize) then
  76. Result := PVSFixedFileInfo(Data)^;
  77. finally
  78. FreeMem(Temp);
  79. end;
  80. end;
  81. end;
  82. procedure TGLAbout.imgGLSceneDblClick(Sender: TObject);
  83. begin
  84. GotoURL(Handle, 'http://www.glscene.org/');
  85. end;
  86. procedure TGLAbout.imgOpenGLDblClick(Sender: TObject);
  87. begin
  88. GotoURL(Handle, 'http://www.opengl.org/');
  89. end;
  90. procedure TGLAbout.imgSourceForgeDblClick(Sender: TObject);
  91. begin
  92. GotoURL(Handle, 'http://www.sourceforge.net/projects/glscene/');
  93. end;
  94. function TGLAbout.ReadVersionInfo(FileName: TFileName): TFileName;
  95. type
  96. TGetWords = record
  97. case boolean of
  98. True: (C: cardinal);
  99. False: (Lo, Hi: word);
  100. end;
  101. var
  102. VerSize, Wnd: cardinal;
  103. Buf, Value: Pointer;
  104. MS, LS: TGetWords;
  105. begin
  106. VerSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
  107. if VerSize > 0 then
  108. begin
  109. GetMem(Buf, VerSize);
  110. GetFileVersionInfo(PChar(ParamStr(0)), 0, VerSize, Buf);
  111. VerQueryValue(Buf, '\', Value, VerSize);
  112. with TVSFixedFileInfo(Value^) do
  113. begin
  114. MS.C := dwFileVersionMS;
  115. LS.C := dwFileVersionLS;
  116. Result := Format('%d.%d.%d Build %d', [MS.Hi, MS.Lo, LS.Hi, LS.Lo]);
  117. end;
  118. FreeMem(Buf);
  119. end
  120. else
  121. Result := 'Unknown'; // or LoadResString(@sUnknown);
  122. end;
  123. end.