Класс TPhotographer (модуль utPhotoExc)

Вернуться к оглавлению

Назначение этого класса - фотографирование экрана при возникновении исключительной ситуации, а так же сохранение сообщения об ошибке вместе с журналом последних SQL-запросов и состоянием стека программы. Для формирования текста, отображающего состояние стека, используется либо собственная функция CrackStack, либо функции модуля StackUnit. Для того, чтобы сохранялся журнал SQL-запросов, должен использоваться компонент TNewQuery (модуль AdoSQLUnit).

Компонент разрабатывался для Delphi 5, но работает так же и в Delphi 6, и должен работать в Delphi 7. В более поздних версиях Delphi и его клонов не тестировался.

Подробное описание

Для использования модуля необходимо:

  1. Один раз в начале работы (по возможности как можно раньше, например, в создании главной формы) назначить событие Application.OnException := Photographer.AppException;
    либо в своем обработчике вызвать Photographer.AppException.
  2. Так же желательно перенаправить события Screen.OnActiveFormChange и Screen.OnActiveControlChange на методы соответственно Photographer.FormChange и Photographer.ControlChange для того, чтобы в журнал записывались данные о смене фокуса контролов:
    Screen.OnActiveFormChange := Photographer.FormChange;
    Screen.OnActiveControlChange := Photographer.ControlChange;
  3. Присвоить значения переменным LoginName и AppVersion, чтобы в таблицу БД с именем ErrLog попадали желаемые значения. Это необязательная операция, и если ее не выполнить, в БД будет записана пустая строка в соответствующие поля. Запись в таблицу БД - необязательная часть работы, для того, чтобы она работала, необходимо определить символ условной компиляции SAVE_TO_ERRLOG_DB. Если требуется только эта часть работы, и не нужно сохранять журналы в текстовой файл, то больше ничего добавлять не требуется. Но если нужна и запись в текстовой файл, следует определить в этом случае символ SAVE_TO_LASTERRLOG. Если оба эти символа не определены, то сохранение происходит только в текстовой файл. На случай, если необходимо (временно) отключить и запись в журнал, и в базу данных, не меняя код, есть возможность определить символ условной компиляции  NOSAVEERRORS.
  4. Необходимо использовать класс TNewQuery из модуля AdoSQLUnit для того, чтобы в журнал, кроме самой ошибки можно было бы записать журнал  последние SQL-запросов вместе со всеми их параметрами (иначе журнал SQL-запросов будет пустым).
     

Примечание: запись в базу данных не реализована для случая, когда используется компонент TODBCQuery (в нем нет работы с блоб-полями). Поэтому при установленном символе ODBC_DIRECT запись в таблицу ErrLog не будет производиться в любом случае. При отсутствии записи в БД по любой причине фотографирование экрана так же не производится.

utPhotoExc StackUnit

Функции модуля utPhotoExc

Кроме того, что написано выше, никаких других функций вызывать не требуется. Ниже приведённые функции вынесены в интерфейсную часть потому, что могут оказаться полезны сами по себе.

Имя свойства / декларация метода Описание
procedure LogFileOutPut( const Filename, Text: String ); Добавляет текст в конец файла. Символы перехода на новую строку добавляются автоматически. Данная функция может быть полезна для формирования журналов работы.
function ReplaceExtension( const s, NewExt: String ): String; Меняет расширение файла, возвращает имя файла с измененным расширением.
function CrackStack( AtAddr: DWORD ): String; Возвращает расшифровку стека программы на момент вызова. При наличии файла с расширением .map (имя совпадает с именем приложения) из него извлекаются адреса функций и сопоставляются с адресами, полученными из стека возвратов. Данный способ работает не стопроцентно, из-за того, что стек возвратов может иметь в отдельных точках нестандартную структуру кадра возврата.
function CrackSoftStack( idx: Integer ): String; Возвращает состояние стека вызовов процедур и функций, для которых в начале выполнения оформлен вызов функции enter (модуль Stack).

 


(C) by Vladimir Kladov, 2000-2010