在Delphi 2009中,SysUtils.pas包含第425行:
EProgrammerNotFound = class(Exception);
问:这个异常类是否仍在Delphi中声明(目前是XE7)?答:是的,甚至有记录!
指示软件故障的非标准方式.
您可以使用EProgrammerNotFound作为替代,以指示在运行时检测到的软件故障.
我试图检测是否释放了一块内存.当然,经理告诉我通过对话框或日志文件,但如果我想将结果存储在数据库中该怎么办?例如,我想在数据库表中包含分配给定块的例程的名称.
在阅读了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.
我缺少的是回调,如:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
在浏览FastMM的源代码后,我发现有一个过程: …
我在安装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 尝试了以下解决方案,但仍然遇到相同的文件锁定问题:
我将尝试从头开始重新安装Windows并在Windows更新之前安装Delphi,以查看更新是否真的是原因.我现在的解决方法是在启动Delphi之前重命名EditorLineEnds.ttr.
在干净安装Delphi之后,您确定要安装哪些组件和IDE加载项?什么是你的Delphi"装备"?这是我在干净安装后安装的内容:
其他Delphi开发人员怎么样?
我有一个带有大型TImage的表单作为背景.问题是,它作为位图直接存储在DFM中,占用大约3 MB.原始的PNG文件大约是250K.我想尝试通过在资源中嵌入PNG来减少膨胀,然后在OnCreate期间使用表单加载它.我现在可以这样做,因为Delphi 2009包含PNG支持,除了我不太清楚如何使用PNG构建资源文件.有谁知道这是怎么做的?
所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量不是.我还听说记录成员(也是基于堆栈的)也没有初始化.编译器警告局部变量未初始化([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, ' …我想,我把手远离德尔福太久了.在过去的几年里,我一直忙于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;
哪里很简单
result := result + (combo.text='')?'null':quotedStr(combo.text);
就够了 我喜欢这个,它不仅缩短了代码,这样我也避免声明一些辅助s:string变量.
为什么条件运算符不是Delphi的一部分 - 它们是否会得到支持?我注意到2009版Delphi(泛型)有很多语言扩展,为什么不添加这个功能呢?
在阅读了文章"Simmering Unicode,让DPL沸腾"和"Simmering Unicode,让DPL沸腾(第2部分)"的"Oracle Delphi"(Allen Bauer)之后,Oracle就是我理解的全部:)
文章提到了Delphi Parallel Library(DPL),锁定免费数据结构,互斥锁和条件变量(这篇维基百科文章转发到' Monitor(同步) ',然后介绍了用于线程同步的新TMonitor记录类型并描述了它的一些方法.
是否有介绍文章,其中的示例显示了何时以及如何使用此Delphi记录类型?网上有一些文档.
TCriticalSection和TMonitor之间的主要区别是什么?
我能做些什么与Pulse和PulseAll方法呢?
它是否具有例如C#或Java语言的对应物?
RTL或VCL中是否有使用此类型的代码(因此它可以作为示例)?
更新:文章为什么在Delphi 2009中TObject的大小翻了一番?解释说现在可以使用TMonitor记录锁定Delphi中的每个对象,每个实例需要额外四个字节.
看起来TMonitor的实现类似于Java语言中的Intrinsic Locks:
每个对象都有一个与之关联的内在锁.按照惯例,需要对对象字段进行独占和一致访问的线程必须在访问对象之前获取对象的内部锁,然后在完成它们时释放内部锁.
等待,Delphi中的Pulse和PulseAll似乎是Java编程语言中wait(),notify()和notifyAll()的对应物.如果我错了,请纠正我:)
更新2:生产者/消费者应用程序的示例代码,使用TMonitor.Wait和TMonitor.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 = …Delphi 2009使用构建配置.创建新项目时,您有两个默认构建配置"Debug"和"Release".
现在我问自己如何使用MSBuild自动化构建(自2007版以来Delphi支持).
您可以在某个Delphi项目目录中的"RAD Studio命令提示符"中启动"msbuild"命令,它将构建默认的构建配置(Delphi IDE中最后一个激活的构建配置).
现在,我想通过命令行参数指定某个(非默认)构建配置.
Delphi帮助断言参数是[/ p:configuration = <configuration name>],这是错误的(Delphi 2009,Help Update 1)!
什么是正确的方法?
我的程序必须读取使用各种编码的文件.它们可以是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 ×10
delphi-2009 ×10
delphi-2010 ×3
delphi-2007 ×2
algorithm ×1
delphi-2006 ×1
delphi-xe ×1
delphi-xe7 ×1
encoding ×1
fastmm ×1
memory-leaks ×1
msbuild ×1
png ×1
resources ×1
tmonitor ×1
variables ×1