不久前我问了一个关于隐式接口变量的类似问题.
这个问题的来源是我的代码中的一个错误,因为我没有意识到编译器创建的隐式接口变量的存在.拥有它的过程完成后,该变量已完成.这反过来导致了由于变量的生命周期比我预期的更长的错误.
现在,我有一个简单的项目来说明编译器的一些有趣的行为:
program ImplicitInterfaceLocals;
{$APPTYPE CONSOLE}
uses
Classes;
function Create: IInterface;
begin
Result := TInterfacedObject.Create;
end;
procedure StoreToLocal;
var
I: IInterface;
begin
I := Create;
end;
procedure StoreViaPointerToLocal;
var
I: IInterface;
P: ^IInterface;
begin
P := @I;
P^ := Create;
end;
begin
StoreToLocal;
StoreViaPointerToLocal;
end.
Run Code Online (Sandbox Code Playgroud)
StoreToLocal编译就像你想象的那样.局部变量I(函数的结果)作为隐式var参数传递给Create.通过StoreToLocal一次通话即可获得整齐的结果IntfClear.没有惊喜.
但是,StoreViaPointerToLocal对待方式不同.编译器创建一个传递给它的隐式局部变量Create.当Create返回时,对分配P^进行.这使例程中有两个局部变量保存对接口的引用.StoreViaPointerToLocal两次调用结果的整理结果IntfClear.
编译后的代码StoreViaPointerToLocal是这样的:
ImplicitInterfaceLocals.dpr.24: begin
00435C50 55 …Run Code Online (Sandbox Code Playgroud) 由于我相信64位 Delphi编译器很快就会出现,我很好奇是否有人知道现在32位的程序将在使用64位编译器时编译和工作而不做任何更改.
如果有一般规则,我们应该在旧程序中系统地进行哪些更改以编译为64位?
当64位编译器突然出现时,做好准备是很好的 ...
任何建议将不胜感激.
我在安装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.
我真的想知道用TOpenDialog选择目录的各种方法,无论是下载新组件还是使用Delphi提供的内容,但最好使用Delphi提供的内容.
在此之前,我一直在使用SelectDirectory命令,但我认为我的程序用户查找指定目录会很困难.
我认为SelectDirectory是"弱"的,因为在搜索你想要的目录时它可能是一个很长的过程.比如说,您想要导航到Application Data目录.在那里航行需要多长时间或多长时间?最后,用户甚至可能无法访问他们想要的目录.
我需要这样的东西,用户可以将目录复制并粘贴到顶部的目录地址栏中.

谢谢你的所有答案.
我听说过很多关于Delphi 2010新的/改进的RTTI功能,但我必须承认我的无知......我不明白.我知道每个版本的Delphi都支持RTTI ......我知道RTTI(运行时类型信息)允许我在应用程序运行时访问类型信息.
但究竟是什么意思呢?Delphi 2010的RTTI支持与.NET中的反射相同吗?
有人可以解释为什么RTTI有用吗?假装我是你的尖头发老板,帮助我理解为什么RTTI很酷.我如何在实际应用程序中使用它?
在干净安装Delphi之后,您确定要安装哪些组件和IDE加载项?什么是你的Delphi"装备"?这是我在干净安装后安装的内容:
其他Delphi开发人员怎么样?
在我的多线程应用程序中
我使用TThread.suspend和 TThread.resume
自从将我的应用程序移至Delphi 2010后,我收到以下交战消息
[DCC警告] xxx.pas(277):不推荐使用W1000符号'Resume'
如果弃用Resume应该使用什么?
编辑1:
我使用Resume命令启动线程 - 因为它创建时将'CreateSuspended'设置为True并在终止线程之前挂起.
编辑2:
我们公司有一个已经开发了十多年的软件,因此有一些真正过时的东西.它仍然非常实用,但是我看到了Delphi XE的新功能,它让我想切换.问题是源代码本身超过300mb的.pas文件(总共1gb与组件等).
我们正在使用自定义组件,旧的jvcl和最新的devexpress.
如果我决定从Delphi 7迁移到Delphi XE,我有多难以期待事情发生?
谢谢.
在阅读了文章"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 = …Run Code Online (Sandbox Code Playgroud) 我们有相当大的XML字符串,我们目前使用MSXML2进行解析
我刚刚尝试使用MSXML6希望提高速度,什么都没有!
我们目前创建了很多DOM文档,我想在不断与MSXML2/6 dll交互时可能会有一些开销
有没有人知道Delphi的更好/更快的XML组件?
如果有人可以提出替代方案,并且它更快,我们会考虑整合它,但这将是很多工作,所以希望结构不会与MSXML使用的结构太不一样
我们正在使用Delphi 2010
保罗
delphi ×10
delphi-2010 ×10
delphi-2009 ×3
delphi-xe ×2
32bit-64bit ×1
delphi-2006 ×1
delphi-2007 ×1
delphi-7 ×1
interface ×1
reflection ×1
rtti ×1
tmonitor ×1
unicode ×1