123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- unit RTDebug;
- interface
- Uses Windows, Messages, SysUtils, Classes, MGRegistry;
- Const
- MG_RTD_AddReference =WM_USER+12123;
- MG_RTD_DelReference =MG_RTD_AddReference+1;
- MG_RTD_GetListHandle =MG_RTD_AddReference+2;
- REG_KEY ='\Software\MaxM_BeppeG\RTDebug\';
- REG_LOGFILE ='Log File';
- REG_LOGONFILE ='Log File Enabled';
- type
- TRTDebugParameters =record
- processID,
- threadID :DWord;
- Level :Byte;
- theString :ShortString;
- StrColor :DWord;
- end;
- var
- LogFileName :String ='';
- LogOnFile :Boolean =False;
- function RTAssert(Level :Byte; Condition :Boolean; TrueStr, FalseStr :ShortString;
- StrColor :DWord) :Boolean;
- function RTFileAssert(Filename :ShortString; Condition :Boolean; TrueStr, FalseStr :ShortString) :Boolean;
- function RTFileEmpty(Filename :ShortString) :Boolean;
- function GetLogFileName :String;
- implementation
- procedure AddLineToList(Level :Byte; theString :ShortString; StrColor :DWord);
- Var
- pCopyData :TCopyDataStruct;
- WinHandle :HWnd;
- begin
- WinHandle :=FindWindow('TRTDebugMainWin', Nil);
- if IsWindow(WinHandle) then
- begin
- pCopyData.cbData :=SizeOf(TRTDebugParameters);
- GetMem(pCopyData.lpData, SizeOf(TRTDebugParameters));
- TRTDebugParameters(pCopyData.lpData^).processID :=GetCurrentProcessID;
- TRTDebugParameters(pCopyData.lpData^).ThreadID :=GetCurrentThreadID;
- TRTDebugParameters(pCopyData.lpData^).Level :=Level;
- TRTDebugParameters(pCopyData.lpData^).theString :=theString;
- TRTDebugParameters(pCopyData.lpData^).StrColor :=StrColor;
- SendMessage(WinHandle, WM_COPYDATA, 0, Integer(@pCopyData));
- FreeMem(pCopyData.lpData);
- end;
- end;
- function RTAssert(Level :Byte; Condition :Boolean; TrueStr, FalseStr :ShortString;
- StrColor :DWord) :Boolean;
- begin
- Result :=Condition;
- if Result then AddLineToList(Level, TrueStr, StrColor)
- else AddLineToList(Level, FalseStr, StrColor);
- if (LogOnFile) and (LogFilename <> '')
- then RTFileAssert(LogFilename, Condition, TrueStr, FalseStr);
- end;
- function RTFileAssert(Filename :ShortString; Condition :Boolean; TrueStr, FalseStr :ShortString) :Boolean;
- Var
- ToWrite :PChar;
- theFile :TFileStream;
- begin
- if FileExists(FileName) then theFile :=TFileStream.Create(FileName, fmOpenWrite)
- else theFile :=TFileStream.Create(FileName, fmCreate);
- try
- Result :=False;
- theFile.Seek(0, soFromEnd);
- if Condition
- then ToWrite :=PChar(IntToHex(GetCurrentProcessID,8)+' '+
- IntToHex(GetCurrentThreadID,8)+' '+
- TrueStr+#13#10)
- else ToWrite :=PChar(IntToHex(GetCurrentProcessID,8)+' '+
- IntToHex(GetCurrentThreadID,8)+' '+
- FalseStr+#13#10);
- theFile.Write(ToWrite^, Length(ToWrite));
- Result :=True;
- finally
- theFile.Free;
- end;
- end;
- function RTFileEmpty(Filename :ShortString) :Boolean;
- Var
- theFile :TFileStream;
- begin
- theFile :=TFileStream.Create(FileName, fmCreate);
- try
- Result :=False;
- theFile.Size :=0;
- Result :=True;
- finally
- theFile.Free;
- end;
- end;
- function GetLogFileName :String;
- Var
- xReg :TMGRegistry;
- begin
- xReg :=TMGRegistry.Create;
- if xReg.OpenKeyReadOnly(REG_KEY)
- then begin
- Result :=xReg.ReadString('', true, REG_LOGFILE);
- LogOnFile :=xReg.ReadBool(False, REG_LOGONFILE);
- end
- else begin
- Result :='';
- LogOnFile :=False;
- end;
- xReg.Free;
- end;
- initialization
- LogFileName :=GetLogFileName;
- end.
|