- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以在 Delphi 中只将断点保存在项目的 .DSK 文件中,而不保存其他桌面设置?
大多数 .DSK 都妨碍了,但无法保存调试断点是一个真正的痛苦(尤其是当它们是有条件的或附加了操作时)。
最佳答案
我从未遇到过在 .Dsk 文件中仅保存与断点相关的设置的 IDE 工具。
为了娱乐,我想我会尝试使用 OTA 通知通过 IDE 插件实现一些东西。下面的代码安装到安装在 D7 中的包中运行良好,IDE 似乎很乐意重新打开一个项目,其 .Dsk 文件已由它处理(并且设置了断点!)。
如您所见,当使用 ofnProjectDesktopSave 的 NotifyCode 调用时,它会捕获 OTA 通知程序的 FileNotification 事件,这发生在 IDE 保存 .Dsk 文件(最初扩展名为“.$$$”之后,我失败了第一次写这篇文章时要注意)。然后它读取保存的文件文件,并准备一个更新版本,从中删除除指定部分列表之外的所有部分。然后,用户可以选择将精简后的文件保存回磁盘。我使用 TMemIniFile 来完成大部分处理,只是为了最大限度地减少所需的代码量。
当我阅读您的问题时,我对编写 OTA 通知程序的经验为零,但下面引用的 GE 专家常见问题解答非常有帮助,尤其是示例通知程序代码。
通常情况下,删除项目的 .Dsk 文件是无害的,但请谨慎使用此代码,因为它尚未经过压力测试。
更新: 我注意到 TIdeNotifier.FileNotification 事件收到的文件名实际上有一个扩展名“.$$$”。我不太确定为什么会这样,但似乎在文件重命名为 xxx.Dsk 之前调用了该事件。我认为这需要改变方式保存精简版,但显然不是。
更新 #2: 使用文件夹监控实用程序查看实际发生的情况后,发现代码收到的桌面保存通知只是与.Dsk 文件。其中包括将任何现有版本的 .Dsk 文件重命名为 .~Dsk 文件,并最终将 .$$$ 文件保存为新的 .Dsk 文件。
unit DskFilesu;
interface
{$define ForDPK} // undefine to test in regular app
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, StdCtrls, IniFiles, TypInfo
{$ifdef ForDPK}
, ToolsApi
{$endif}
;
{$ifdef ForDPK}
{
Code for OTA TIdeNotifier adapted from, and courtesy of, the link on http://www.gexperts.org/open-tools-api-faq/#idenotifier
}
type
TIdeNotifier = class(TNotifierObject, IOTANotifier, IOTAIDENotifier)
protected
procedure AfterCompile(Succeeded: Boolean);
procedure BeforeCompile(const Project: IOTAProject; var Cancel: Boolean);
procedure FileNotification(NotifyCode: TOTAFileNotification;
const FileName: string; var Cancel: Boolean);
end;
{$endif}
type
TDskForm = class(TForm)
edDskFileName: TEdit;
SpeedButton1: TSpeedButton;
OpenDialog1: TOpenDialog;
lbSectionsToKeep: TListBox;
lbDskSections: TListBox;
moDskFile: TMemo;
btnSave: TButton;
procedure btnSaveClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
procedure GetSectionsToKeep;
function GetDskFileName: String;
procedure SetDskFileName(const Value: String);
function GetDskFile: Boolean;
protected
public
DskIni : TMemIniFile;
property DskFileName : String read GetDskFileName write SetDskFileName;
end;
var
NotifierIndex: Integer;
DskForm: TDskForm;
{$ifdef ForDPK}
procedure Register;
{$endif}
implementation
{$R *.DFM}
{$ifdef ForDPK}
procedure Register;
var
Services: IOTAServices;
begin
Services := BorlandIDEServices as IOTAServices;
Assert(Assigned(Services), 'IOTAServices not available');
NotifierIndex := Services.AddNotifier(TIdeNotifier.Create);
end;
{$endif}
procedure DskPopUp(FileName : String);
var
F : TDskForm;
begin
F := TDskForm.Create(Application);
try
F.DskFileName := FileName;
F.ShowModal;
finally
F.Free;
end;
end;
function TDskForm.GetDskFileName: String;
begin
Result := edDskFileName.Text;
end;
procedure TDskForm.SetDskFileName(const Value: String);
begin
edDskFileName.Text := Value;
if Assigned(DskIni) then
FreeAndNil(DskIni);
btnSave.Enabled := False;
DskIni := TMemIniFile.Create(DskFileName);
DskIni.ReadSections(lbDskSections.Items);
GetSectionsToKeep;
end;
procedure TDskForm.btnSaveClick(Sender: TObject);
begin
DskIni.UpdateFile;
end;
procedure TDskForm.FormCreate(Sender: TObject);
begin
lbSectionsToKeep.Items.Add('watches');
lbSectionsToKeep.Items.Add('breakpoints');
lbSectionsToKeep.Items.Add('addressbreakpoints');
if not IsLibrary then
DskFileName := ChangeFileExt(Application.ExeName, '.Dsk');
end;
procedure TDskForm.GetSectionsToKeep;
var
i,
Index : Integer;
SectionName : String;
begin
moDskFile.Lines.Clear;
for i := lbDskSections.Items.Count - 1 downto 0 do begin
SectionName := lbDskSections.Items[i];
Index := lbSectionsToKeep.Items.IndexOf(SectionName);
if Index < 0 then
DskIni.EraseSection(SectionName);
end;
DskIni.GetStrings(moDskFile.Lines);
btnSave.Enabled := True;
end;
function TDskForm.GetDskFile: Boolean;
begin
OpenDialog1.FileName := DskFileName;
Result := OpenDialog1.Execute;
if Result then
DskFileName := OpenDialog1.FileName;
end;
procedure TDskForm.SpeedButton1Click(Sender: TObject);
begin
GetDskFile;
end;
{$ifdef ForDPK}
procedure RemoveNotifier;
var
Services: IOTAServices;
begin
if NotifierIndex <> -1 then
begin
Services := BorlandIDEServices as IOTAServices;
Assert(Assigned(Services), 'IOTAServices not available');
Services.RemoveNotifier(NotifierIndex);
end;
end;
function MsgServices: IOTAMessageServices;
begin
Result := (BorlandIDEServices as IOTAMessageServices);
Assert(Result <> nil, 'IOTAMessageServices not available');
end;
procedure TIdeNotifier.AfterCompile(Succeeded: Boolean);
begin
end;
procedure TIdeNotifier.BeforeCompile(const Project: IOTAProject; var Cancel: Boolean);
begin
Cancel := False;
end;
procedure TIdeNotifier.FileNotification(NotifyCode: TOTAFileNotification;
const FileName: string; var Cancel: Boolean);
begin
Cancel := False;
// Note: The FileName passed below has an extension of '.$$$'
if NotifyCode = ofnProjectDesktopSave then
DskPopup(FileName);
end;
initialization
finalization
RemoveNotifier;
{$endif}
end.
关于德尔福 2007 : save only the breakpoint options in the DSK file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27288723/
使用Eclipse PDT和Xdebug调试PHP应用程序的当前状态是什么。有没有人最终使它工作,即停止在Eclipse中定义的断点(不使用xdebug_break())? 我读过this over
我想用 lldb 设置一个条件断点。这通常使用 -c 完成选项 : breakpoint set -f myFile.cpp -l 123 -c 'a==3' 但是,就我而言,我想测试是否 std::
The breakpoints do not hit, not even one断点没有命中,甚至一个都没有 I have tried:我尝试过: Restarting U
我有一个基于VSCode上运行的electron-hello-world项目的基本HelloWorld应用程序,能够启动调试 session ,并且该应用程序可以正常启动。 我在main.js上设置了
我只是无法理解 Eclipse 中菜单的 Run 按钮下的两个选项。通常断点不是指一行吗?我意识到可能存在这种情况: if (x >= 0 && x = 0 && y < 4) source
我正在 Visual Studio 代码中使用 chrome 调试器扩展来调试我的主干应用程序。 launch.json文件是这样的; { "version": "0.2.0", "c
最近,Edge 脚本调试支持已添加到 Visual Studio,这使您可以在附加 VS 调试器的情况下启动 Edge。所以我正是这样做的,并在启用脚本调试的情况下开始了我的解决方案: 唉,当我开始这
从帮助文档中,设置数据访问断点,我们可以使用 var.break /READWRITE 但是,这只有在我们输入该变量的上下文时才有效。 因为我想写一个PRACTICE脚本来做自动调试,所以我想在程序
模式.txt ^[\s]*set breakpoint.*if ^[\s]*set breakpoint.*in ^[\s]*set breakpoint.*skip 脚本.txt set break
我在哪里可以找到有关移动和桌面屏幕尺寸的统计信息? 我正在制作一个响应式网站,特别是我试图找出的天气是大多数手机与台式机和平板电脑用户之间的大小差距,我可以在其中设置断点。我认为应该有,但我知道我应该
在开放的互联网上找到答案应该非常简单,但显然不是。你如何在 spyder (anaconda) 中设置条件断点? 例如这里是代码的一小部分: if elem.name == "p":
一直在使用 Pycharm 编写服务器。 我有一些使用 Python 中的“unittest”库的单元测试。 我只是在运行测试,一切都很好,我可以在代码的任何地方设置断点。 昨天我开始通过调试器运行服
我正在使用一些定义了两个断点的响应式设计: Mobile > max-width 320px Tablet portrait > max-width 767px 在桌面上,我有很多动画 + Javas
是否有可能安装 ipdb(或一些其他明确编写的包)将导致 breakpoint() 运行 ipdb pdb 没有绑定(bind) sys.breakpointhook() 到 ipdb? https:
有没有一种优雅的方法可以在容器的高度上设置各种断点。 示例: 假设您有一个 div,最小高度设置为 100px。一旦内容太多,它不仅会增长,还会增长 100px,当内容最终到达 200px 的底部时,
使用分段包创建分段线性回归我在尝试设置自己的断点时看到错误;似乎只有当我尝试设置两个以上时。 (编辑)这是我正在使用的代码: # data bullard <- structure(list(Rt =
在互联网上很难找到关于此的信息,因为神奇的单词“GameShark”,“ Action 重播”,“内存编辑器”和“内存培训师”触发了很多BS,所以我认为我应该在某个论坛上提问。 我将在本周末前得到任天
我目前正在研究调试器。我读到调试器有软件断点(apparently 这些是最常用的断点)。这些通过将操作码的第一个字节替换为 Int 3(操作码 0xcc)来工作。 我已经读过程序的文本(/code)
在 Chrome 开发者工具中,在一个 JavaScript 文件中添加两个断点并执行整个代码后,有没有办法测量它们之间耗时? 最佳答案 您可以使用 time and timeEnd methods用
根据内存中的值在lldb中设置条件断点的语法是什么? 就像是: breakpoint modify -c "memory read -Gx $esp+4 == 0" 或者,如果条件为假,我想我可以设置
我是一名优秀的程序员,十分优秀!