UMyUtils.pas 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. unit UMyUtils;
  2. interface
  3. uses IniFiles,Graphics,jpeg,classes;
  4. function GetCurrentVersion: String;
  5. function RandomRound(const R:Extended):Integer;
  6. procedure MyInputBox(const ACaption, APrompt, ADefault,Invalid: string;
  7. out ResString:String); overload;
  8. procedure MyInputBox(const ACaption, APrompt, ADefault: string;
  9. MinVal,MaxVal:Integer; out ResInteger:Integer); overload;
  10. procedure MyInputBox(const ACaption, APrompt, ADefault: string;
  11. MinVal,MaxVal:Real; out ResFloat:Real); overload;
  12. function JPGtoBMP(const FileName:string):Graphics.TBitmap;
  13. procedure CalcFPS(MeasureIntervalSec:Real);
  14. type TMyIni=class (TIniFile)
  15. public
  16. SectionDefault:string;
  17. ReadStringDefault:string;
  18. ReadBoolDefault:Boolean;
  19. ReadFloatDefault:Real;
  20. ReadIntDefault:Integer;
  21. ReadColorDefault:Integer;
  22. constructor Create(const FileName: string);
  23. procedure Read(const Ident, Default: string;
  24. Out ResString:string); overload;
  25. procedure Read(const Ident: string;
  26. Out ResString:string); overload;
  27. procedure Read(const Ident: string; Default: Integer;
  28. Out ResInt:Integer); overload;
  29. procedure Read(const Ident: string;
  30. Out ResInt:Integer); overload;
  31. procedure Read(const Ident: string; Default: Real;
  32. Out ResFloat:Real); overload;
  33. procedure Read(const Ident: string;
  34. Out ResFloat:Real); overload;
  35. procedure Read(const Ident: string; Default: Boolean;
  36. Out ResBool:Boolean); overload;
  37. procedure Read(const Ident: string;
  38. Out ResBool:Boolean); overload;
  39. procedure Write(const Name: string; Value: string); overload;
  40. procedure Write(const Name: string; Value: Integer); overload;
  41. procedure Write(const Name: string; Value: Real); overload;
  42. procedure Write(const Name: string; Value: Boolean); overload;
  43. end;
  44. type TMyStopWatch=class
  45. public
  46. Start:Cardinal;
  47. constructor create;
  48. function TimeElapsedmilliSecs:Cardinal;
  49. function TimeElapsedSecs:Real;
  50. function TimeElapsedmins:Real;
  51. procedure ResetTimer;
  52. end;
  53. var InformationDump:Cardinal;
  54. //FPS Calculation
  55. FPS:Real;
  56. FPSMeasureCount:Cardinal=0;
  57. FrameCount:Cardinal=0;
  58. LastFrameCounts:TList;
  59. implementation
  60. uses Types,Windows,SysUtils,Math,Dialogs,UMessageThread,Forms;
  61. constructor TMyStopWatch.Create;
  62. begin
  63. inherited Create;
  64. ResetTimer;
  65. end;
  66. procedure TMyStopWatch.ResetTimer;
  67. begin
  68. Start:=GetTickCount;
  69. end;
  70. function TMyStopWatch.TimeElapsedmilliSecs:Cardinal;
  71. begin
  72. Result:=GetTickCount-Start;
  73. end;
  74. function TMyStopWatch.TimeElapsedSecs:Real;
  75. begin
  76. Result:=TimeElapsedmilliSecs/1000;
  77. end;
  78. function TMyStopWatch.TimeElapsedMins:Real;
  79. begin
  80. Result:=TimeElapsedmilliSecs/60000;
  81. end;
  82. constructor TMyIni.Create(const FileName: string);
  83. begin
  84. inherited Create(FileName);
  85. SectionDefault:='';
  86. ReadStringDefault:='';
  87. ReadBoolDefault:=false;
  88. ReadFloatDefault:=NaN;
  89. ReadIntDefault:=Low(Integer);
  90. end;
  91. procedure TMyIni.Write(const Name: string; Value: string);
  92. begin
  93. self.WriteString(SectionDefault,Name,Value);
  94. end;
  95. procedure TMyIni.Write(const Name: string; Value: Integer);
  96. begin
  97. self.WriteInteger(SectionDefault,Name,Value);
  98. end;
  99. procedure TMyIni.Write(const Name: string; Value: Real);
  100. begin
  101. self.WriteFloat(SectionDefault,Name,Value);
  102. end;
  103. procedure TMyIni.Write(const Name: string; Value: Boolean);
  104. begin
  105. self.WriteBool(SectionDefault,Name,Value);
  106. end;
  107. procedure TMyIni.Read(const Ident, Default: string; Out ResString:string);
  108. begin
  109. ResString:=self.ReadString(SectionDefault,Ident,Default);
  110. end;
  111. procedure TMyIni.Read(const Ident: string; Out ResString:string);
  112. begin
  113. ResString:=self.ReadString(SectionDefault,Ident,ReadStringDefault);
  114. end;
  115. procedure TMyIni.Read(const Ident: string; Default: Integer; Out ResInt:Integer);
  116. begin
  117. ResInt:=self.ReadInteger(SectionDefault,Ident,Default);
  118. end;
  119. procedure TMyIni.Read(const Ident: string; Out ResInt:Integer);
  120. begin
  121. ResInt:=self.ReadInteger(SectionDefault,Ident,ReadIntDefault);
  122. end;
  123. procedure TMyIni.Read(const Ident: string; Default: Real; Out ResFloat:Real);
  124. begin
  125. ResFloat:=self.ReadFloat(SectionDefault,Ident,Default);
  126. end;
  127. procedure TMyIni.Read(const Ident: string; Out ResFloat:Real);
  128. begin
  129. ResFloat:=self.ReadFloat(SectionDefault,Ident,ReadFloatDefault);
  130. end;
  131. procedure TMyIni.Read(const Ident: string; Default: Boolean; Out ResBool:Boolean);
  132. begin
  133. ResBool:=self.ReadBool(SectionDefault,Ident,Default);
  134. end;
  135. procedure TMyIni.Read(const Ident: string; Out ResBool:Boolean);
  136. begin
  137. ResBool:=self.ReadBool(SectionDefault,Ident,ReadBoolDefault);
  138. end;
  139. procedure MyInputBox(const ACaption, APrompt, ADefault: string;
  140. MinVal,MaxVal:Real; out ResFloat:Real);
  141. var Error:Boolean; S1:String;
  142. begin
  143. repeat
  144. try
  145. Error:=false;
  146. S1:=InputBox(ACaption,APrompt,ADefault);
  147. ResFloat:=Strtofloat(S1);
  148. except
  149. Error:=true;
  150. end;
  151. if Error then
  152. MessageOut('An unknown error occured. Please check if "'+S1+
  153. '" is a valid floating point number',
  154. 'Invalid value') else if (ResFloat>MaxVal) or (ResFloat<MinVal) then
  155. MessageOut('Must be true: '+FloatToStr(MinVal)+'<=X<='+FloatToStr(MaxVal),
  156. 'Invalid value');
  157. if Application.Terminated then Break;
  158. until (ResFloat<=MaxVal) and (ResFloat>=MinVal) and not Error;
  159. end;
  160. procedure MyInputBox(const ACaption, APrompt, ADefault: string;
  161. MinVal,MaxVal:Integer; out ResInteger:Integer);
  162. var Error:Boolean; S1:String;
  163. begin
  164. repeat
  165. try
  166. Error:=false;
  167. S1:=InputBox(ACaption,APrompt,ADefault);
  168. ResInteger:=Strtoint(S1);
  169. except
  170. Error:=true;
  171. end;
  172. if Error then
  173. MessageOut('An unknown error occured. Please check if "'+S1+
  174. '" is a valid integer number',
  175. 'Invalid value') else
  176. if (ResInteger>MaxVal) or (ResInteger<MinVal) then
  177. MessageOut('Must be true: '+IntToStr(MinVal)+'<=X<='+IntToStr(MaxVal),
  178. 'Invalid value');
  179. if Application.Terminated then Break;
  180. until (ResInteger<=MaxVal) and (ResInteger>=MinVal) and not Error;
  181. end;
  182. function JPGtoBMP(const FileName:string):Graphics.TBitmap;
  183. var jpg1:TJPEGImage;
  184. begin
  185. Result:=Graphics.TBitmap.Create;
  186. jpg1:=TJPEGImage.Create;
  187. jpg1.LoadFromFile(FileName);
  188. Result.Assign(jpg1);
  189. end;
  190. procedure CalcFPS(MeasureIntervalSec:Real);
  191. Var P1:PCardinal; C1:Integer;
  192. begin
  193. if not assigned(LastFrameCounts) then
  194. LastFrameCounts:=TList.create;
  195. Inc(FPSMeasureCount);
  196. if FrameCount<>0 then begin
  197. New(P1);
  198. P1^:=FrameCount;
  199. LastFrameCounts.Add(P1);
  200. FrameCount:=0;
  201. while LastFrameCounts.Count>Round(5/MeasureIntervalSec) do begin
  202. P1:=LastFrameCounts[0];
  203. Dispose(P1);
  204. LastFrameCounts.Delete(0);
  205. end;
  206. end;
  207. FPS:=0;
  208. for C1:=0 to LastFrameCounts.Count-1 do begin
  209. P1:=LastFrameCounts[C1];
  210. FPS:=FPS+P1^;
  211. end;
  212. FPS:=FPS/LastFrameCounts.Count/MeasureIntervalSec;
  213. end;
  214. procedure MyInputBox(const ACaption, APrompt, ADefault,Invalid: string;
  215. out ResString:String);
  216. begin
  217. repeat
  218. try
  219. ResString:=InputBox(ACaption,APrompt,ADefault);
  220. except
  221. ResString:=Invalid;
  222. end;
  223. if ResString=Invalid then
  224. MessageOut('An unknown error occured.',
  225. 'Invalid value');
  226. if Application.Terminated then Break;
  227. until ResString<>Invalid;
  228. end;
  229. function GetCurrentVersion: String;
  230. var
  231. VerInfoSize: DWORD;
  232. VerInfo: Pointer;
  233. VerValueSize: DWORD;
  234. VerValue: PVSFixedFileInfo;
  235. Dummy: DWORD;
  236. begin
  237. VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  238. GetMem(VerInfo, VerInfoSize);
  239. GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
  240. VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
  241. with VerValue^ do begin
  242. Result := 'Version '+IntToStr(dwFileVersionMS shr 16);
  243. Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
  244. Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
  245. end;
  246. FreeMem(VerInfo, VerInfoSize);
  247. end;
  248. function RandomRound(const R:Extended):Integer;
  249. begin
  250. Result:=Floor(R);
  251. if Random>Frac(R) then Inc(Result);
  252. end;
  253. end.