RTDebug.pas 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. unit RTDebug;
  2. interface
  3. Uses Windows, Messages, SysUtils, Classes, MGRegistry;
  4. Const
  5. MG_RTD_AddReference =WM_USER+12123;
  6. MG_RTD_DelReference =MG_RTD_AddReference+1;
  7. MG_RTD_GetListHandle =MG_RTD_AddReference+2;
  8. REG_KEY ='\Software\MaxM_BeppeG\RTDebug\';
  9. REG_LOGFILE ='Log File';
  10. REG_LOGONFILE ='Log File Enabled';
  11. type
  12. TRTDebugParameters =record
  13. processID,
  14. threadID :DWord;
  15. Level :Byte;
  16. theString :ShortString;
  17. StrColor :DWord;
  18. end;
  19. var
  20. LogFileName :String ='';
  21. LogOnFile :Boolean =False;
  22. function RTAssert(Level :Byte; Condition :Boolean; TrueStr, FalseStr :ShortString;
  23. StrColor :DWord) :Boolean;
  24. function RTFileAssert(Filename :ShortString; Condition :Boolean; TrueStr, FalseStr :ShortString) :Boolean;
  25. function RTFileEmpty(Filename :ShortString) :Boolean;
  26. function GetLogFileName :String;
  27. implementation
  28. procedure AddLineToList(Level :Byte; theString :ShortString; StrColor :DWord);
  29. Var
  30. pCopyData :TCopyDataStruct;
  31. WinHandle :HWnd;
  32. begin
  33. WinHandle :=FindWindow('TRTDebugMainWin', Nil);
  34. if IsWindow(WinHandle) then
  35. begin
  36. pCopyData.cbData :=SizeOf(TRTDebugParameters);
  37. GetMem(pCopyData.lpData, SizeOf(TRTDebugParameters));
  38. TRTDebugParameters(pCopyData.lpData^).processID :=GetCurrentProcessID;
  39. TRTDebugParameters(pCopyData.lpData^).ThreadID :=GetCurrentThreadID;
  40. TRTDebugParameters(pCopyData.lpData^).Level :=Level;
  41. TRTDebugParameters(pCopyData.lpData^).theString :=theString;
  42. TRTDebugParameters(pCopyData.lpData^).StrColor :=StrColor;
  43. SendMessage(WinHandle, WM_COPYDATA, 0, Integer(@pCopyData));
  44. FreeMem(pCopyData.lpData);
  45. end;
  46. end;
  47. function RTAssert(Level :Byte; Condition :Boolean; TrueStr, FalseStr :ShortString;
  48. StrColor :DWord) :Boolean;
  49. begin
  50. Result :=Condition;
  51. if Result then AddLineToList(Level, TrueStr, StrColor)
  52. else AddLineToList(Level, FalseStr, StrColor);
  53. if (LogOnFile) and (LogFilename <> '')
  54. then RTFileAssert(LogFilename, Condition, TrueStr, FalseStr);
  55. end;
  56. function RTFileAssert(Filename :ShortString; Condition :Boolean; TrueStr, FalseStr :ShortString) :Boolean;
  57. Var
  58. ToWrite :PChar;
  59. theFile :TFileStream;
  60. begin
  61. if FileExists(FileName) then theFile :=TFileStream.Create(FileName, fmOpenWrite)
  62. else theFile :=TFileStream.Create(FileName, fmCreate);
  63. try
  64. Result :=False;
  65. theFile.Seek(0, soFromEnd);
  66. if Condition
  67. then ToWrite :=PChar(IntToHex(GetCurrentProcessID,8)+' '+
  68. IntToHex(GetCurrentThreadID,8)+' '+
  69. TrueStr+#13#10)
  70. else ToWrite :=PChar(IntToHex(GetCurrentProcessID,8)+' '+
  71. IntToHex(GetCurrentThreadID,8)+' '+
  72. FalseStr+#13#10);
  73. theFile.Write(ToWrite^, Length(ToWrite));
  74. Result :=True;
  75. finally
  76. theFile.Free;
  77. end;
  78. end;
  79. function RTFileEmpty(Filename :ShortString) :Boolean;
  80. Var
  81. theFile :TFileStream;
  82. begin
  83. theFile :=TFileStream.Create(FileName, fmCreate);
  84. try
  85. Result :=False;
  86. theFile.Size :=0;
  87. Result :=True;
  88. finally
  89. theFile.Free;
  90. end;
  91. end;
  92. function GetLogFileName :String;
  93. Var
  94. xReg :TMGRegistry;
  95. begin
  96. xReg :=TMGRegistry.Create;
  97. if xReg.OpenKeyReadOnly(REG_KEY)
  98. then begin
  99. Result :=xReg.ReadString('', true, REG_LOGFILE);
  100. LogOnFile :=xReg.ReadBool(False, REG_LOGONFILE);
  101. end
  102. else begin
  103. Result :='';
  104. LogOnFile :=False;
  105. end;
  106. xReg.Free;
  107. end;
  108. initialization
  109. LogFileName :=GetLogFileName;
  110. end.