如何使用DelphiIDE保存断点?

How to save breakpoints using the Delphi IDE?

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

我正在使用 Delphi 2007。

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

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

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

请注意

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

  • ToolsAPI 中的两种断点接口都有 属性 setter 和 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;