标签: delphi-2009

Delphi中的EProgrammerNotFound异常?

在Delphi 2009中,SysUtils.pas包含第425行:

EProgrammerNotFound = class(Exception);
Run Code Online (Sandbox Code Playgroud)
  • 这只是一个复活节彩蛋还是严肃的东西?
  • 什么时候应该提出这个例外?
  • 它是否也存在于Delphi Prism和/或Free Pascal中?

问:这个异常类是否仍在Delphi中声明(目前是XE7)?答:是的,甚至有记录!

指示软件故障的非标准方式.

您可以使用EProgrammerNotFound作为替代,以指示在运行时检测到的软件故障.

delphi delphi-2009 delphi-xe7

122
推荐指数
6
解决办法
8221
查看次数

有没有办法以编程方式判断FastMM是否没有释放特定的内存块?

我试图检测是否释放了一块内存.当然,经理告诉我通过对话框或日志文件,但如果我想将结果存储在数据库中该怎么办?例如,我想在数据库表中包含分配给定块的例程的名称.

在阅读了FastMM的文档之后,我知道从版本4.98开始,我们有可能被管理员通知内存分配,释放和重新分配.例如,OnDebugFreeMemFinish事件传递给我们a PFullDebugBlockHeader包含有用的信息.PFullDebugBlockHeader缺少一件事- 如果给定的块被应用程序释放,则会显示信息.

除非OnDebugFreeMemFinish仅为未释放的块调用?这是我不知道并想知道的.

问题是,即使挂钩OnDebugFreeMemFinish事件,我也无法找出该块是否被释放.

这是一个例子:

program MemLeakTest;

{$APPTYPE CONSOLE}

uses
  FastMM4, ExceptionLog, SysUtils;


procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer);
begin
//This is executed at the end, but how should I know that this block should be freed
//by application? Unless this is executed ONLY for not freed blocks.
end;

procedure Leak;
var
  MyObject: TObject;
begin
  MyObject := TObject.Create;
end;

begin
  OnDebugFreeMemFinish := MemFreeEvent;
  Leak;
end.
Run Code Online (Sandbox Code Playgroud)

我缺少的是回调,如:

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Run Code Online (Sandbox Code Playgroud)

在浏览FastMM的源代码后,我发现有一个过程: …

delphi memory-leaks delphi-2009 fastmm

103
推荐指数
1
解决办法
2609
查看次数

Delphi 2006-2010错误:"无法创建文件C:\ Users\Admin\AppData\Local\Temp\EditorLineEnds.ttr"

我在安装Delphi 2007后遇到错误(编辑:这个问题发生在2006年到2010年的所有Delphi版本中),我无法弄清楚,以前从未见过.重新启动后,我可以毫无问题地启动程序,但如果我要关闭程序并重新启动它会给我以下错误:

"无法创建文件C:\ Users\Admin\AppData\Local\Temp\EditorLineEnds.ttr".该进程无法访问该文件,因为它正由另一个进程使用."

"System"具有此文件的句柄,除非我重新启动,否则无法清除该句柄.我也可以通过在启动程序之前重命名文件来解决问题.

我试过没有运气重新安装程序.

安装版本:CodeGear™Delphi®2007forWin32®R2版本11.0.2902.10471.操作系统:Windows 7 Pro 64bit

更新08/14 13:35 EDT 尝试了以下解决方案,但仍然遇到相同的文件锁定问题:

  1. 将Temp Directory重命名为我知道具有完全安全权限的目录.启动Delphi时,文件将在此目录中创建,但是EditorLineEnds.ttr仍然会被SYSTEM锁定并阻止我重新启动.
  2. 卸载了以下安全更新KB2982791和KB2976897,但这并没有解决问题.我暂时禁止了Windows更新,并尝试卸载8/13的所有安全补丁.
  3. 完全卸载Delphi并重新安装.重新安装所有内容后仍然会出现问题.

我将尝试从头开始重新安装Windows并在Windows更新之前安装Delphi,以查看更新是否真的是原因.我现在的解决方法是在启动Delphi之前重命名EditorLineEnds.ttr.

delphi delphi-2009 delphi-2007 delphi-2006 delphi-2010

54
推荐指数
2
解决办法
8万
查看次数

使用Delphi安装哪些组件和IDE加载项?

在干净安装Delphi之后,您确定要安装哪些组件和IDE加载项?什么是你的Delphi"装备"?这是我在干净安装后安装的内容:

  1. Delphi 2007/Delphi 2010
  2. JCL/JVCL - JEDI代码库和JEDI可视代码库(600多个组件)
  3. JWA/JWSCL - JEDI API库和安全代码库
  4. GExperts - GExperts是一套免费的工具,旨在通过向IDE添加多个功能来提高Delphi和C++ Builder程序员的工作效率.(现在包括以前的实验代码格式化程序.)
  5. CnWizards - 提供IDE增强功能以​​提高开发效率
  6. Virtual TreeView - Virtual Treeview是一个从头开始构建的树视图控件.经过5年多的发展,它成为当今最灵活,最先进的树木控制之一.
  7. MustangPeak组件(EasyList视图,虚拟ShellTools等) - EasyListview是一个不依赖于Microsoft Listview控件但具有Microsoft最新版本的所有功能的控件.还包括'Explorer.exe'之类的shell组件.
  8. Synapse轻量级网络组件 - 包含简单的低级非可视对象,可轻松编程而不会出现问题.(不需要多线程同步,不需要Windows消息处理,...)非常适合命令行实用程序,可视化项目,NT服务
  9. EurekaLog - EurekaLog是Delphi和C++ Builder开发人员的完整错误解决工具,它使您的应用程序能够直接在最终用户PC上捕获每个异常和内存泄漏,生成调用堆栈的详细日志(带文件,类,方法和行号),可选择通过电子邮件或Web错误跟踪器向您发送每个日志条目的副本.
  10. DelphiSpeedUp - DelphiSpeedUp是Delphi和C++ Builder的IDE插件.它提高了IDE的启动速度,并提高了整个IDE的总体速度.
  11. DDevExtensions - DDevExtensions通过添加一些新的生产力功能扩展了Delphi/C++ Builder IDE.
  12. IDE修订包 - IDE修订包安装是一个DLL-Expert,可在运行时修复以下RAD Studio 2007错误.所有更改都在内存中完成.磁盘上没有文件被修改.
  13. TPerlRegex - Delphi的正则表达式库

其他Delphi开发人员怎么样?

delphi delphi-2009 delphi-2010

36
推荐指数
3
解决办法
9747
查看次数

如何制作PNG资源?

我有一个带有大型TImage的表单作为背景.问题是,它作为位图直接存储在DFM中,占用大约3 MB.原始的PNG文件大约是250K.我想尝试通过在资源中嵌入PNG来减少膨胀,然后在OnCreate期间使用表单加载它.我现在可以这样做,因为Delphi 2009包含PNG支持,除了我不太清楚如何使用PNG构建资源文件.有谁知道这是怎么做的?

delphi resources png delphi-2009

35
推荐指数
1
解决办法
2万
查看次数

在Delphi中初始化哪些变量?

所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量不是.我还听说记录成员(也是基于堆栈的)也没有初始化.编译器警告局部变量未初始化([DCC警告] W1036变量'x'可能尚未初始化),但不会对记录成员发出警告.所以我决定进行测试.

对于所有记录成员,我总是从Integers得到0而从布尔都得到.

我尝试打开和关闭各种编译器选项(调试,优化等),但没有区别.我的所有记录成员都正在初始化.

我错过了什么?我正在使用Delphi 2009 Update 2.

program TestInitialization;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TR = Record
  Public
    i1, i2, i3, i4, i5: Integer;
    a: array[0..10] of Integer;
    b1, b2, b3, b4, b5: Boolean;
    s: String;
  End;

var
  r: TR;
  x: Integer;

begin
  try
    WriteLn('Testing record. . . .');
    WriteLn('i1 ',R.i1);
    WriteLn('i2 ',R.i2);
    WriteLn('i3 ',R.i3);
    WriteLn('i4 ',R.i4);
    WriteLn('i5 ',R.i5);

    Writeln('S ',R.s);

    Writeln('Booleans: ', R.b1, ' ', R.b2, ' ', R.b3, ' …
Run Code Online (Sandbox Code Playgroud)

delphi variables initialization delphi-2009

32
推荐指数
2
解决办法
8540
查看次数

Delphi中有条件运算符,或者有没有?

我想,我把手远离德尔福太久了.在过去的几年里,我一直忙于Java和PHP.现在,当我回到做一点Delphi工作时,我意识到我真的很想念Java和PHP都支持的条件运算符.

在Delphi程序中你会找到多少个这样的行?

var s : string;
begin
  ...<here the string result is manipulated>...

  if combo.Text='' then
      s := 'null'
    else
      s := QuotedStr(combo.Text);

  result := result + s;
end;
Run Code Online (Sandbox Code Playgroud)

哪里很简单

result := result + (combo.text='')?'null':quotedStr(combo.text);
Run Code Online (Sandbox Code Playgroud)

就够了 我喜欢这个,它不仅缩短了代码,这样我也避免声明一些辅助s:string变量.

为什么条件运算符不是Delphi的一部分 - 它们是否会得到支持?我注意到2009版Delphi(泛型)有很多语言扩展,为什么不添加这个功能呢?

delphi language-features delphi-2009 conditional-operator

32
推荐指数
4
解决办法
1万
查看次数

什么是Delphi System单元中的TMonitor有用?

在阅读了文章"Simmering Unicode,让DPL沸腾""Simmering Unicode,让DPL沸腾(第2部分)"的"Oracle Delphi"(Allen Bauer)之后,Oracle就是我理解的全部:)

文章提到了Delphi Parallel Library(DPL),锁定免费数据结构,互斥锁条件变量(这篇维基百科文章转发到' Monitor(同步) ',然后介绍了用于线程同步的新TMonitor记录类型并描述了它的一些方法.

是否有介绍文章,其中的示例显示了何时以及如何使用此Delphi记录类型?网上有一些文档.

  • TCriticalSection和TMonitor之间的主要区别是什么?

  • 我能做些什么与PulsePulseAll方法呢?

  • 它是否具有例如C#或Java语言的对应物?

  • RTL或VCL中是否有使用此类型的代码(因此它可以作为示例)?


更新:文章为什么在Delphi 2009中TObject的大小翻了一番?解释说现在可以使用TMonitor记录锁定Delphi中的每个对象,每个实例需要额外四个字节.

看起来TMonitor的实现类似于Java语言中的Intrinsic Locks:

每个对象都有一个与之关联的内在锁.按照惯例,需要对对象字段进行独占和一致访问的线程必须在访问对象之前获取对象的内部锁,然后在完成它们时释放内部锁.

等待,Delphi中的PulsePulseAll似乎是Java编程语言中wait(),notify()notifyAll()的对应物.如果我错了,请纠正我:)


更新2:生产者/消费者应用程序的示例代码,使用TMonitor.WaitTMonitor.PulseAll基于Java(tm)教程中有关保护方法的文章(欢迎评论):

这种应用程序在两个线程之间共享数据:生成器,创建数据,以及使用它的消费者.两个线程使用共享对象进行通信.协调是必不可少的:消费者线程不得在生产者线程交付之前尝试检索数据,并且如果消费者未检索旧数据,则生产者线程不得尝试传递新数据.

在此示例中,数据是一系列文本消息,通过Drop类型的对象共享:

program TMonitorTest;

// based on example code at http://download.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

type
  Drop = …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2009 delphi-2010 tmonitor delphi-xe

31
推荐指数
1
解决办法
1万
查看次数

Delphi MSBuild从命令行构建配置

Delphi 2009使用构建配置.创建新项目时,您有两个默认构建配置"Debug"和"Release".

现在我问自己如何使用MSBuild自动化构建(自2007版以来Delphi支持).

您可以在某个Delphi项目目录中的"RAD Studio命令提示符"中启动"msbuild"命令,它将构建默认的构建配置(Delphi IDE中最后一个激活的构建配置).

现在,我想通过命令行参数指定某个(非默认)构建配置.

Delphi帮助断言参数是[/ p:configuration = <configuration name>],这是错误的(Delphi 2009,Help Update 1)!

什么是正确的方法?

delphi msbuild build-automation delphi-2009 delphi-2007

30
推荐指数
2
解决办法
1万
查看次数

当BOM(字节顺序标记)丢失时,如何最好地猜测编码?

我的程序必须读取使用各种编码的文件.它们可以是ANSI,UTF-8或UTF-16(大或小端).

当BOM(字节顺序标记)出现时,我没有问题.我知道文件是UTF-8还是UTF-16 BE或LE.

我想假设没有BOM文件是ANSI.但我发现我正在处理的文件经常缺少BOM.因此,没有BOM可能意味着该文件是ANSI,UTF-8,UTF-16 BE或LE.

当文件没有BOM时,扫描某些文件并最准确地猜测编码类型的最佳方法是什么?如果文件是ANSI,我希望接近100%的时间,如果是UTF格式,我希望接近100.

我正在寻找一种通用的算法来确定这一点.但实际上我使用Delphi 2009,它知道Unicode并且有一个TEncoding类,所以特定的东西将是一个奖励.


回答:

ShreevatsaR的回答让我在Google上搜索"通用编码检测器delphi",这让我感到惊讶,因为这个帖子在活着只有大约45分钟后被列为#1位置!这是快速googlebotting !! 同样令人惊讶的是Stackoverflow如此迅速地进入第一名.

Google的第二个条目是Fred Eaker关于字符编码检测的博客文章,列出了各种语言的算法.

我发现在该页面上提到了Delphi,它让我直接进入SourceForge的Free OpenSource ChsDet Charset Detector,这是用Delphi编写的,基于Mozilla的i18n组件.

太棒了!谢谢所有回复的人(全+1),谢谢ShreevatsaR,再次感谢Stackoverflow,帮助我在不到一个小时内找到答案!

delphi algorithm encoding byte-order-mark delphi-2009

29
推荐指数
2
解决办法
8026
查看次数