我已经潜伏了一段时间,这是一个很好的资源.现在我将尝试成为一名活跃的会员...... :)
我有一个程序偶尔需要递归扫描一些目录(这部分程序的改进正在进行中,但暂时还没有准备好).为了避免用户不得不等待这种扫描,我希望在用户不使用我的程序时进行扫描.
我打算通过运行一个检查空闲时间的计时器来实现它.我发现以下内容用于检查系统空闲时间:http: //www.delphitips.net/2007/11/11/how-to-detect-system-idle-time/
这将是有用的,但即使用户正在使用同一台计算机上的其他程序,我也希望激活该功能.这样,如果他切换到另一个程序,我可以赶上我需要做的扫描.
我意识到我可以在后台线程中进行扫描,并且在某些时候会实现某种或某种类型的Windows挂钩,但不仅仅是.
编辑:这里的目标是对程序进行相对容易的更改,以便在用户未主动使用我的应用程序时执行任何可能排队的扫描.扫描不是特别密集,但它不是在一个线程中完成,因此在进行中冻结我的应用程序.基本上,我正在寻找一个快速的胜利,而我正在制定一个更长期的解决方案.
我们有一个应用程序,它通过TPersistent的降序将项目信息存储在一个文件中.我们使用TSteam.ReadComponentRes从流中读取对象.
我们希望能够打开具有未知属性的项目文件(来自我们应用程序的较新版本或其他开发分支).目前,这导致TReader中的异常,该异常由TStream创建.我们考虑过制作一个TStream后代,它使用TReader后代来处理这个异常,而不是停止阅读.谁能想到更优雅的方式呢?
我们目前使用Delphi 2009和GIT开发应用程序.我们已经设置了一个预构建脚本,使用来自git的信息生成版本号和构建ID,并将其编译为项目中包含的资源.问题是这个脚本不能在常规编译上运行.这意味着其他开发人员最终可能会在实际版本号和资源中的数量之间出现差异(特别是在git中切换分支时).
由于我们使用我们的软件进行一些关键计算,因此我们希望使用此构建ID来重现计算并跟踪问题.
除了试图强迫我的开发人员经常按shift-F9之外,我怎样才能确保prebuild脚本在必要时运行(理想情况下在每次编译时)?
贾森
更新:预编译脚本确实在每次编译时运行.问题是我希望在git中制作标签后按F9获得不同的结果,即使没有代码发生变化.
我一直在使用Tperlregex.但今天当我尝试编译使用Tperlregex构建的应用程序时,它会提示"致命错误:内部错误L3169".
reg: Tperlregex;
begin
reg:=Tperlregex.create(nil); //If this line is removed, there is no error prompt.
...
...
end;
Run Code Online (Sandbox Code Playgroud)
我正在使用Perlregex2009.
请帮忙.
编辑:
安德烈亚斯,非常感谢你.
@Andreas非常感谢你的回复.我正在使用Delphi 7.你的答案是否适用于D7.我在pcre.pas中找到了注释(..Delphi 2009及更早版本有一个编译器错误,如果将TPerlRegEx安装到设计时包中,可能会导致内部错误,并且您不会同时将TPerlRegEx放入运行时包中.使用Delphi 2009及更早版本,如果您根本不使用软件包,则可以使用PCRE_STATICLINK(这意味着您不要将它安装到IDE中......").我还没有在IDE中安装它,我将perlregex单元放入使用interface.我在pcre.pas中设置这些行
...
{$DEFINE PCRE_LINKDLL}
{$IFDEF PCRE_STATICLINK}
{$UNDEF PCRE_LINKDLL}
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
以前,它有效.但今天它没有.
我有以下超类:
unit DlgDefaultForm;
type
TDefaultFormDlg = class(TForm)
published
constructor Create(AOwner: TComponent); reintroduce; virtual;
end;
FormCreateFunc=function(AOwner: TComponent):TDefaultFormDlg;
Run Code Online (Sandbox Code Playgroud)
这是由一堆形式下降,如下所示:
unit Form1
type
TForm1 = class(TDefaultFormDlg)
published
constructor Create(AOwner: TComponent); override;
end;
Run Code Online (Sandbox Code Playgroud)
并创建如下:
unit MainForm;
procedure ShowForm(FormCreate:FormCreateFunc);
begin
(do some stuff)
FormCreate(ScrollBox1);
end;
Run Code Online (Sandbox Code Playgroud)
我跑的时候
ShowForm(@TForm1.Create);
Run Code Online (Sandbox Code Playgroud)
发生了两件事:
当我进入TForm1.Create时,AOwner = nil,即使它没有在ShowForm中.
我在以下行获得了EAbstractError:
unit Forms;
(...)
constructor TCustomForm.Create(AOwner: TComponent);
begin
(...)
InitializeNewForm; //EAbstractError
(...)
end;
Run Code Online (Sandbox Code Playgroud)我究竟做错了什么?
编辑:这当然不是我的确切代码.