如何使用Delphi IDE保存断点?

时间:2016-03-28 12:33:45

标签: delphi breakpoints

如何使用Delphi IDE保存断点?我只知道如何将设置存储在.dsk文件中。

我正在使用Delphi 2007.

1 个答案:

答案 0 :(得分:2)

我假设您提到.Dsk文件,您知道断点存储在那里,但是由于某种原因想要自己保存它们。当然,获取已保存断点列表的最简单方法就是从.Dsk文件中读取它们,但这假定它已保存到磁盘,这通常是 关闭项目文件时发生。

您可以编写自己的IDE插件来获取当前设置的断点列表 并以任何你想要的方式保存它们。下面的极简主义示例显示了如何执行此操作 - 有关详细信息,请参阅GetBreakpoints方法。要在IDE中使用它,您需要创建一个需要的新包 DesignIde.Dcp。确保.Bpl文件的输出目录位于其中 您的第三方.Bpls存储在您的路径上或在您的路径上。然后你可以安装 IDE中的包从IDE菜单中查看Install packages

正如您所看到的,它通过使用ToolsAPI单元中的BorlandIDEServices接口来获取IOTADebuggerServices接口,然后使用它来迭代其SourceBkpts列表并保存一个数字该列表中每个IOTASourceBreakpoint的属性。

请注意

  • 您还可以检索address breakpoints的列表,并以类似的方式保存这些列表。

  • ToolsAPI中的两种断点接口都有属性设置器和getter,因此您可以修改代码中的现有断点,并可以创建新的断点。

代码

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

type
  TBreakpointSaveForm = class(TForm)
    Memo1: TMemo;
    btnGetBreakpoints: TButton;
    procedure btnGetBreakpointsClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
  protected
  public
    procedure GetBreakpoints;
  end;

var
  BreakpointSaveForm: TBreakpointSaveForm;

procedure Register;

implementation

{$R *.DFM}

procedure TBreakpointSaveForm.GetBreakpoints;
var
  DebugSvcs: IOTADebuggerServices;

  procedure SaveBreakpoint(BreakPoint : IOTASourceBreakpoint);
  begin
    Memo1.Lines.Add('File:      ' + Breakpoint.FileName);
    Memo1.Lines.Add('LineNo:    ' + IntToStr(Breakpoint.LineNumber));
    Memo1.Lines.Add('Passcount: ' + IntToStr(Breakpoint.Passcount));
    Memo1.Lines.Add('');
  end;

  procedure SaveBreakpoints;
  var
    i : Integer;
    BreakPoint : IOTASourceBreakpoint;
  begin
    Memo1.Lines.Add('Source breakpoint count : '+ IntToStr(DebugSvcs.GetSourceBkptCount));
    for i := 0 to DebugSvcs.GetSourceBkptCount - 1 do begin
      Breakpoint := DebugSvcs.SourceBkpts[i];
      SaveBreakpoint(Breakpoint);
    end;
  end;

begin
  if not Supports(BorlandIDEServices, IOTADebuggerServices, DebugSvcs) then begin
    ShowMessage('Failed to get IOTADebuggerServices interface');
    exit;
  end;
  Memo1.Lines.Clear;
  SaveBreakpoints;
end;

procedure Register;
begin
end;

initialization
  BreakpointSaveForm := TBreakpointSaveForm.Create(Application);
  BreakpointSaveForm.Show;

finalization

  if Assigned(BreakpointSaveForm) then
    BreakpointSaveForm.Free;
end.

procedure TBreakpointSaveForm.btnGetBreakpointsClick(Sender: TObject);
begin
  GetBreakpoints;
end;