При разработке приложений бывает иногда необходимо вывести какую-либо информацию в Event Log. В Delphi для этих целей удобно пользоваться методами OutputDebugString, но так как это путь исключительно для Windows, то в случае работы с Lazarus, например в Debian или Slax такой подход не подойдет. В Lazarus, для того чтобы вывести какое-либо сообщение при отладке приложения имеется несколько способов речь о которых пойдет далее.
Если всё-таки Windows?
Если Вы планируете использовать Lazarus исключительно в среде Windows и, то, в принципе, никто вам не мешает подключить в uses модуль Windows и продолжать пользоваться уже привычными методами OutputDebugString, правда ваши сообщения будут попадать не в окно «Сообщения» к которому мы привыкли в Delphi, а в отдельное под названием «Журнал событий». Чтобы добраться до журнала событий, необходимо открыть в меню «Вид — Окна отладки — Журнал событий»
С пользовательским сообщением журнал событий выглядит вот так:
В принципе, ничего для тех, кто привык работать в Delphi, не поменяется за исключением расположения сообщений — в отдельном окне.
Аналог OutputDebugString в Lazarus «из коробки»
Для пользователей Lazarus в Linux всё не на много сложнее. Дело в том, что в Lazarus присутствует модуль dbugintf.pas, выводить различные отладочные сообщения, правда опять же, в отдельном окне. Чтобы эта возможность заработала, необходимо выполнить следующие действия:
1.Собрать утилиту debugserver, которая находится в папке с Lazarus по пути: %Lazarus%\tools\debugserver\
По сути, эта утилита сильно напоминает «Журнал событий», о котором шла речь выше. Вот как выглядит пустой debugserver:
2. Добавить debugserver в список внешних средств Lazarus. Для этого заходим в меню: Сервис — Настроить внешние средства:
добавить утилиту в список следующим образом:
Теперь debugserver появится в меню Lazarus:
3. Подключить в uses любого модуля вашего проекта модуль dbugintf и включить вывод сообщений в окно debugserver, используя следующий метод:
procedure SetDebuggingEnabled(const AValue : boolean);
Думаю, тут всё понятно и без комментариев — передача в метод значение True включается вывод сообщений, False — отключает. Для вывода различных сообщений в debugserver можно воспользоваться следующими методами:
procedure SendBoolean(const Identifier: string; const Value: Boolean); procedure SendDateTime(const Identifier: string; const Value: TDateTime); procedure SendInteger(const Identifier: string; const Value: Integer; HexNotation: Boolean = False); procedure SendPointer(const Identifier: string; const Value: Pointer); procedure SendDebugEx(const Msg: string; MType: TDebugLevel); procedure SendDebug(const Msg: string); procedure SendMethodEnter(const MethodName: string); procedure SendMethodExit(const MethodName: string); procedure SendSeparator; procedure SendDebugFmt(const Msg: string; const Args: array of const); procedure SendDebugFmtEx(const Msg: string; const Args: array of const; MType: TDebugLevel);
Чтобы продемонстрировать работу методов, напишем следующий тестовый код на Lazarus:
procedure TForm1.Button2Click(Sender: TObject); var b: boolean; i: integer; d: TDateTime; begin SetDebuggingEnabled(True); SendMethodEnter('Button2Click Enter'); b:=True; SendBoolean('b',b); i:=100; SendInteger('i',i,False); SendInteger('i as hex',i,True); d:=Now; SendDateTime('d',d); SendSeparator; SendDebugEx('Это сообщение будет выглядеть в окне debugserver как ошибка', dlError); SendMethodExit('Button2Click Enter'); end;
Здесь мы воспользовались различными методами модуля dbugintf и отправили в debugserver несколько сообщений, которые будут выглядеть следующим образом:
Соответственно, все сообщения читаются снизу вверх и при необходимости их можно сохранить в буфер обмена или отдельный файл.
Как видите, в Lazarus можно без проблем выводить отладочные сообщения практически так же, как мы привыкли делать это в Delphi за одним лишь различием в том, что в Lazarus это будет работать в любой операционной системе и, поэтому, требуется дополнительный шаг настройки утилиты debugserver.
На сегодня всё. Продолжаем разбираться с Lazarus и попутно в нем же работать :)