Новичок
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.1.2007
Репутация: нет Всего: нет
|
Привет всем ГУРУ  ! Вчера появилась необходимость в процедуре вывода в текстовик всех, значений переменных и последовательности исполнения процессов (Функций, процедур, изменения значений переменных) происходящих в приложении в момент его исполнения. Решил написать Функцию которая могла-бы реализовать поставленную задачу и упорядочить выводимый в файл текст ввиде вложенности следующего вида : Содержание ЛОГА : | Код | <<< LOG BEGIN 03.07.2007 at 14:37:23 >>>
[14:37:23.976] < Процедура 1> (название) : BEGIN [14:37:23.976] < Процесс 1 > : (Название) : Значение 1 уровеня вложенности : 2 уровеня вложенности : ...n уровеня вложенности [14:37:23.976] < Процесс 2 > : (Название) : Значение 1 уровеня вложенности : 2 уровеня вложенности : ...n уровеня вложенности [14:37:23.976] < Процесс n.. > : (Название) : Значение 1 уровеня вложенности : 2 уровеня вложенности : ...n уровеня вложенности [14:37:23.986] <Task> : Check if AlreadyRun [14:37:23.986] <Task> : Check if BackupStartService [14:37:23.986] <Task> : Check if not AlreadyRun [14:37:23.986] <Task> : if not AlreadyRun : Application.Title := 'Title'; [14:37:23.986] <Task> : if not AlreadyRun : Application.HelpFile := 'App.hlp'; [14:37:23.986] <Task> : if not AlreadyRun : Application.Initialize; [14:37:23.986] <Task> : if not AlreadyRun : Check if DataFilesExists [14:37:23.996] <Task> : if not AlreadyRun : if DataFilesExists : RunningAsService:=false; [14:37:24.006] <Task> : if not AlreadyRun : if DataFilesExists : Application.CreateForm(TMainForm, MainForm); [14:37:24.177] <Task> : if not AlreadyRun : if DataFilesExists : Check if DataFilesInvalid [14:37:51.306] < Процедура 1> (название) : END
>>> LOG END 03.07.2007 at 14:37:51 <<<
|
И этот список продлить для всех событий внутри приложения. Пришла в голову идея, написать следующее, но потом понял, что это совсем не лучший вариант по ряду причин который Вы сами поймёте, да и процедуру придётся тыкать после каждой строчки.. :( | Код | function CreateLogFile(LogStatus : Integer; LogFilePath : String; TaskName : String; ProcessList : TStringList) : Boolean; var LOGFile : TextFile; LogFileName : String; ErrorTypeMessageStr : String; TimeStamp, ProcTimeStamp, DateStamp : String; LogHeaderLine, LogFooterLine : String; TaskLine, ProcessLine : String; i : Integer; begin try try LOGFileName := 'LogFileTest'; AssignFile(LOGFile, LogFilePath + LOGFileName + '.txt'); //FileMode := fmOpenRead; if not FileExists(LogFilePath + LOGFileName + '.txt') then begin Rewrite(LOGFile); end else Append(LOGFile);
TimeStamp := FormatDateTime('hh:mm:ss', TDateTime(now)); ProcTimeStamp := FormatDateTime('hh:mm:ss.zzz', TDateTime(now)); DateStamp := FormatDateTime('dd/mm/yyy', TDateTime(now)); LogHeaderLine := Format('<<< %s at %s >>>', [ DateStamp , TimeStamp]); LogFooterLine := Format('>>> %s at %s <<<', [ DateStamp , TimeStamp]); TaskLine := Format(' [%s] <<< Task >>> : %s', [ProcTimeStamp, TaskName]);
if LogStatus = StartLog then begin WriteLn(LOGFile, LogHeaderLine); WriteLn(LOGFile, ''); WriteLn(LOGFile, TaskLine); WriteLn(LOGFile, ''); for i := 0 to ProcessList.Count -1 do begin TimeStamp := FormatDateTime('hh:mm:ss.zzz', TDateTime(now)); ProcessLine := Format(' [%s] Process : %s', [TimeStamp, ProcessList.Strings[i]]); WriteLn(LOGFile, ProcessLine); end; WriteLn(LOGFile, ''); end else if LogStatus = ContinueLog then begin WriteLn(LOGFile, TaskLine); WriteLn(LOGFile, ''); for i := 0 to ProcessList.Count -1 do begin TimeStamp := FormatDateTime('hh:mm:ss.zzz', TDateTime(now)); ProcessLine := Format(' [%s] Process : %s', [TimeStamp, ProcessList.Strings[i]]); WriteLn(LOGFile, ProcessLine); end; WriteLn(LOGFile, ''); end else if LogStatus = EndLog then begin WriteLn(LOGFile, TaskLine); WriteLn(LOGFile, ''); for i := 0 to ProcessList.Count -1 do begin TimeStamp := FormatDateTime('hh:mm:ss.zzz', TDateTime(now)); ProcessLine := Format(' [%s] Process : %s', [TimeStamp, ProcessList.Strings[i]]); WriteLn(LOGFile, ProcessLine); end; WriteLn(LOGFile, ''); WriteLn(LOGFile, LogFooterLine); WriteLn(LOGFile, ''); end;
// WriteLn(LOGFile, ''); // if LogStatus = EndLog then WriteLn(LOGFile, LogFooterLine); // WriteLn(LOGFile, ''); finally CloseFile(LOGFile); end; except on IO : EInOutError do begin Case IO.ErrorCode of 2 : ErrorTypeMessageStr := 'Файл ' + LogFilePath + LOGFileName + '.txt' + ' не найден'; 3 : ErrorTypeMessageStr := 'название ' + LogFilePath + LOGFileName + '.txt' + ' не правильное'; 4 : ErrorTypeMessageStr := 'Слишком много открытых файлов'; 5 : ErrorTypeMessageStr := 'Нет доступа к файлу ' + LogFilePath + LOGFileName + '.txt'; 100 : ErrorTypeMessageStr := 'Конец файла ' + LogFilePath + LOGFileName + '.txt'; 101 : ErrorTypeMessageStr := 'Переполнение диска, при работе с файлом ' + LogFilePath + LOGFileName + '.txt'; 106 : ErrorTypeMessageStr := 'При работе с файлом ' + LogFilePath + LOGFileName + '.txt' + ', обнаружена ошибка ввода'; end; if ErrorTypeMessageStr = '' then ErrorTypeMessageStr := 'При работе с файлом ' + LogFilePath + LOGFileName + '.txt' + ' обнаружена неизвесная ошибка'; ShowMessage(ErrorTypeMessageStr + ' ' + IntToStr(IO.ErrorCode)); Application.MessageBox(PChar(ErrorTypeMessageStr), PChar(Application.Title + 'Внимание, обнаружена ошибка') , MB_OK); end; end; end;
|
У кого есть идеи, как всё это реализовать, очень прошу откликнуться ??? Заранее спасибо !!!
|