Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Debug.Print


Автор: Mephisto 16.11.2006, 15:11
Если аналог в Delphi функции VB:
Код
Debug.Print

Она в режиме Debug выводит строки в дебагере. smile 

Автор: Romkin 16.11.2006, 15:40
Есть API, от природы smile
{ Выводимые сообщения можно просматривать из:
   - Delphi (View\Debug Windows\Event Log)
   - Программой http://www.microsoft.com/technet/sysinternals/Miscellaneous/DebugView.mspx  }
procedure Debug(Text: string);
begin
  OutputDebugString(PChar(Text + #13#10));
end;
В GExperts тоже есть средства....

Автор: Mephisto 16.11.2006, 15:52
Прикольно.
Спасибо.
 smile 

Автор: Bose 16.11.2006, 18:55
Mephisto, вместе с http://www.gexperts.org идёт unit DbugIntf.pas и утилитка gExperts Debug Window. Подклчюив модуль Dbugintf.pas к исходникам можно будет пользоваться процедурой:
Код

Senddebug(aText:string);

и текст aText будет показан в окне gExperts Debug Window. Если окно не было запущено - оно запустится(при включенной IDE). Я ползуюсь этой фичей. А раньше, пока не знал, у меня во всех апликациях была форма frmDebug с публичным методом Print  smile  smile который отображал строку в Memo этой формы smile 

Автор: popolzen 17.11.2006, 08:15
Проблема решается без использования сторонних компонентов:

1. Project Options (Ctrl+Shift+F11) -> Linker -> EXE and DLL options -> Generate console application (установить флаг)
Если флаг выставлен, то компилятор генерирует консольное приложение {$APPTYPE CONSOLE},
в противном случае генерируется приложение с графическим интерфейсом {$APPTYPE GUI}
2. В коде пишем
Код

{$IFDEF CONSOLE}
  {$DEFINE DEBUG}
{$ENDIF}

3. Используем
Код

  {$IFDEF DEBUG}
    Writeln(Message);
  {$ENDIF}

точно так же, как Debug.Print
4. Как только отдебажили код, снимаем флаг Project Options -> Linker -> EXE and DLL options -> Generate console application и компилятор генерирует приложение без текстовой консоли

В итоге код для дебага выглядит примерно так:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

{$IFDEF CONSOLE}
  {$DEFINE DEBUG}
{$ENDIF}


type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  {$IFDEF DEBUG}
    Writeln((Sender as TButton).Name);
  {$ENDIF}
end;

end.


P.S. Если что-то непонятно, смотри в help'е "conditional directives".

Автор: Mephisto 17.11.2006, 09:35
popolzen, полезно!  smile 

Автор: bems 17.11.2006, 09:44
popolzen, очень, очень плохо. не делай так

Автор: Mephisto 17.11.2006, 10:24
Цитата(bems @  17.11.2006,  10:44 Найти цитируемый пост)
popolzen, очень, очень плохо. не делай так 

 А проблема-то в чем?

Автор: bems 17.11.2006, 10:34
Mephisto, в том что для отладки кода приходиться его изменять. Если штатные средства дебагера применить нельзя, то OutputDebugString, но это максимум, что можно себе позволить. Консоль - это очень плохой стиль и создает проблемы (иногда неочевидные). Я сам так делал. Больше не хочу smile 

Автор: Mephisto 17.11.2006, 10:41
Цитата(bems @  17.11.2006,  11:34 Найти цитируемый пост)
OutputDebugString,

Этот метод действительно оптимальный для данной задачи. Я не спорю!  smile 

Автор: popolzen 17.11.2006, 10:42
bems, не буду спорить, но у меня никогда не возникало таких проблем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)