小编dum*_*uch的帖子

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
查看次数

如何确定创建Delphi项目的Delphi版本

我试图自动弄清楚哪个Delphi版本(我的计算机上安装的Delphi 5到XE2)用于打开给定项目而不会错误地升级该项目.

直到Delphi 7,每个项目都有.ini格式的.dof文件.Delphi 5没有任何可能有用的条目,但是从Delphi 6开始有一个[FileVersion]部分,其中包含以下值:

  • 德尔福5:不适用
  • 德尔福6:6.0
  • 德尔福7:7.0

所以我想这就解决了,因为较旧的Delphi版本不关心我.

对于Delphi 2005和2006,有一个XML格式的.bdsproj文件,其中包含一个版本条目:\ BorlandProject\PersonalityInfo\Option\Option

在Delphi 2005中它看起来像这样:

<Option Name="Version" Type="String">1.0</Option>

在Delphi 2006中是这样的:

<Option Name="Version">1.0</Option>

所以我可以看看属性"类型"是否存在并且取决于Delphi 2005或2006的决定.有人可以看看他的Delphi 2005和2006项目并验证这种差异吗?(或者你可能有更好的主意?)

编辑:我只是试图验证这一点并发现,Delphi 2005并不总是添加Type-Attribute.所以现在我被卡住了.

编辑:也许存储在那里的GUID对Delphi版本是唯一的?

  • Delphi 2005:{87D03616-A4C7-4B5A-AF0F-0164EA60BC59}
  • Delphi 2006:{CFE1BEE6-6FDE-4241-8CA5-D38D14EAA768}

不知怎的,我怀疑它,我担心GUID可能代表不同的SKU(专业/建筑师等).但也许你可以验证一下?

从Delphi 2007开始,有一个不同XML格式的.dproj文件.Delphi 2007格式不包含我能找到的任何版本条目,但是从Delphi 2009开始,似乎有以下条目:

\project\PropertyGroup\ProjectVersion

这些是我在.dproj文件中找到的值:

  • Delphi 2007:N/A.
  • 德尔福2009:12.0
  • Delphi 2010:12.0
  • 德尔福XE:12.3
  • 德尔福XE2:13.4

如果这些是正确的,我可以可靠地确定Delphi 2007,XE和XE2.但我如何区分Delphi 2009和2010?

而且,这些数字对我来说很奇怪.有没有人知道Delphi的各种更新之间是否有任何差异,例如原始的Delphi XE2版本是否可以从13.0开始并且每次更新都会增加点后面的数字?但如果是这样的话,德尔福XE如何获得12.3?

(有一个类似的问题我怎么能告诉用什么版本的Delphi来创建一个项目,但单一的答案非常有限.)

以防万一其他人需要这个:我刚刚在Delphi Wiki中添加了一个页面,它总结了所有答案,并为更新的Delphi版本添加了信息(目前直到Delphi 10.1).

delphi

24
推荐指数
2
解决办法
6896
查看次数

为什么RoundTo的结果(87.285,-2)=> 87.28

我预计结果将是87.29.我也试过SimpleRoundTo,但产生了相同的结果.

在帮助中还有一个"奇怪"的例子:ms-help://embarcadero.rs2010/vcl/Math.RoundTo.html

RoundTo(1.235, -2) => 1.24
RoundTo(1.245, -2) => 1.24 //???
Run Code Online (Sandbox Code Playgroud)

有谁知道我需要哪个函数来获得87.29的结果?我的意思是:如果最后一个数字> = 5向上,如果<5向下舍入.正如在学校教的:)

我使用Delphi2010,和SetRoundMode(rmNearest).我也尝试过rmTruncate.值87.285存储在double变量中.

也很奇怪:

SimpleRoundTo(87.285, -2) => 87.29
Run Code Online (Sandbox Code Playgroud)

x := 87.285; //double
SimpleRoundTo(x, -2) => 87.28
Run Code Online (Sandbox Code Playgroud)

delphi

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

FormatDateTime的反函数

我要寻找一个函数来扭转任何字符串(YYYYMDD,YY/MM/DD,YYMMDD由函数创建,...)的FormatDateTime为datetime.

我有一个由字符串日期格式YYYYMMDD创建FormatDateTime

mydatestr:=FormatDateTime('YYYYMMDD',Mydate); 
Run Code Online (Sandbox Code Playgroud)

现在我怎么能DateTime再次将mydatestr转换成?

UPDATE

这些功能

function StrToDate(const S: string): TDateTime; overload;
function StrToDate(const S: string;
  const FormatSettings: TFormatSettings): TDateTime; overload;

function StrToDateTime(const S: string): TDateTime; overload;
function StrToDateTime(const S: string;
  const FormatSettings: TFormatSettings): TDateTime; overload;
Run Code Online (Sandbox Code Playgroud)

不支持传递具有要转换格式的字符串.

我看起来像这样

Mydatetime:=InvFormatDatetime('20091225','yyyymmdd');
Run Code Online (Sandbox Code Playgroud)

要么

Mydatetime:=InvFormatDatetime('20090108','yyyyddmm');
Run Code Online (Sandbox Code Playgroud)

delphi

19
推荐指数
3
解决办法
2万
查看次数

让Allen Bauer的TMulticastEvent <T>工作

我一直在摆弄周围与Allen Bauer的代码的通用多播事件调度程序(见他关于它的博客文章在这里).

他提供了足够的代码让我想要使用它,不幸的是他没有发布完整的源代码.我有一个bash让它工作,但我的汇编技能是不存在的.

我的问题是InternalSetDispatcher方法.天真的方法是使用与其他InternalXXX方法相同的汇编程序:

procedure InternalSetDispatcher;
begin
   XCHG  EAX,[ESP]
   POP   EAX
   POP   EBP
   JMP   SetEventDispatcher
end;
Run Code Online (Sandbox Code Playgroud)

但这用于具有一个const参数的过程,如下所示:

procedure Add(const AMethod: T); overload;
Run Code Online (Sandbox Code Playgroud)

SetDispatcher有两个参数,一个是var:

procedure SetEventDispatcher(var ADispatcher: T; ATypeData: PTypeData);
Run Code Online (Sandbox Code Playgroud)

所以,我认为堆栈会被破坏.我知道代码在做什么(通过弹出对self的隐藏引用来清理堆栈帧从调用到InternalSetDispatcher,我假设返回地址),但我只是无法弄清楚那个小小的汇编程序来获取整个代码事情进行着.

编辑:只是为了澄清,我正在寻找的是我可以用来使InternalSetDispatcher方法工作的汇编程序,即汇编程序用两个参数清理一个过程的堆栈,一个是var.

编辑2:我已经修改了一下这个问题,感谢梅森到目前为止的答案.我应该提到上面的代码不起作用,并且当SetEventDispatcher返回时,会引发AV.

delphi generics events delphi-2009

18
推荐指数
2
解决办法
1700
查看次数

使用Generics.Collections.TObjectDictionary的示例

Delphi XE2在线帮助(以及Embarcadero DocWiki)在文档上非常精简TObjectDictionary(或者我找不到它太愚蠢).

据我所知,它可以用来存储可以通过字符串键访问的对象实例(基本上可以通过排序TStringList但类型安全来访问).但我对如何实际申报和使用它感到茫然.

有什么指针吗?

delphi delphi-xe2

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

为什么这个字符串的引用计数为4?(德尔福2007)

这是一个非常特殊的Delphi问题(甚至可能是Delphi 2007特有的).我目前正在为实习字符串编写一个简单的StringPool类.作为一个优秀的小编码器,我还添加了单元测试,发现了令我困惑的东西.

这是实习的代码:

function TStringPool.Intern(const _s: string): string;
var
  Idx: Integer;
begin
  if FList.Find(_s, Idx) then
    Result := FList[Idx]
  else begin
    Result := _s;
    if FMakeStringsUnique then
      UniqueString(Result);
    FList.Add(Result);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

没有什么真正的花哨:FList是一个排序的TStringList,所以所有的代码都在查找列表中的字符串,如果它已经在那里它返回现有的字符串.如果它尚未出现在列表中,它将首先调用UniqueString以确保引用计数为1,然后将其添加到列表中.(我检查了结果的引用计数,并且在'hallo'被添加两次之后它是3,如预期的那样.)

现在来测试代码:

procedure TestStringPool.TestUnique;
var
  s1: string;
  s2: string;
begin
  s1 := FPool.Intern('hallo');
  CheckEquals(2, GetStringReferenceCount(s1));
  s2 := s1;
  CheckEquals(3, GetStringReferenceCount(s1));
  CheckEquals(3, GetStringReferenceCount(s2));
  UniqueString(s2);
  CheckEquals(1, GetStringReferenceCount(s2));
  s2 := FPool.Intern(s2);
  CheckEquals(Integer(Pointer(s1)), Integer(Pointer(s2)));
  CheckEquals(3, GetStringReferenceCount(s2));
end;
Run Code Online (Sandbox Code Playgroud)

这会将字符串'hallo'添加到字符串池两次并检查字符串的引用计数,并且s1和s2确实指向相同的字符串描述符.

每个CheckEquals都按预期工作,但最后一个.它失败,错误"预期:<3>但是:<4>".

那么,为什么引用计数为4?我原以为3:

  • S1
  • S2
  • 和StringList中的另一个

这是Delphi 2007,因此字符串是AnsiStrings.

哦,是的,函数StringReferenceCount实现为:

function GetStringReferenceCount(const _s: AnsiString): integer;
var
  ptr: …
Run Code Online (Sandbox Code Playgroud)

delphi string reference-counting delphi-2007 string-interning

16
推荐指数
1
解决办法
1302
查看次数

Delphi中的游戏开发

我想为个人/学习目的制作一些简单的游戏.简单的游戏我指的是平台,迷宫,街机游戏等游戏.我有一天也想用一个简单的编辑器创建一个平台游戏,让其他人可以编辑和设计他们自己的游戏关卡.

我不确定Delphi是否可行,但我没有看到或听到很多人在Delphi中编写游戏,但是Delphi是我在中级水平上理解的唯一语言.

如果Delphi可以像我提到的那样创建简单的游戏,我是否正确地认为我需要一些可以帮助我做到这一点的库,例如Direct X?

我正在使用Delphi XE,我希望我已经等待并升级到Delphi XE2,因为它似乎包含一些内置的Drawing库.

我期待听到你对此的回应.

谢谢.

delphi directx delphi-xe

14
推荐指数
2
解决办法
5489
查看次数

如何确定单元是否已编译为Delphi程序?

我希望能够确定某个特定单元是否已编译成Delphi程序,例如,单元SomeUnitName是我的某些程序的一部分而不是其他程序的一部分.我想有一个功能

function IsSomeUnitNameInProgram: boolean;
Run Code Online (Sandbox Code Playgroud)

(当然不会在SomeUnitName中声明,因为在这种情况下它将始终被包含),如果单元已编译到程序中,则在运行时返回true,否则返回false.

到目前为止,我的想法是使用jcl调试信息(从详细的映射文件编译),我基本上添加到我的所有程序来确定这些信息,但我更喜欢它,如果不需要jcl.

添加代码到SomeUnitName不是一个选项.

目前适用于Delphi 2007,但最好也适用于Delphi XE2.

有什么想法吗?

@DavidHeffernan问道:@DavidHeffernan问:

这不仅适用于一个程序,而且适用于100多个不同的程序.其中大部分都是在内部使用,但也有一些是交付给客户的.由于我们使用了相当多的库,有些在各种开源许可下购买了其他库,我希望能够在about框中添加一个"信用"选项卡,它只显示实际编译到程序中的库而不是所有库.感谢TOndrej的回答,现在完全符合我的要求:代码检查一个单元,如果程序使用了库,它总是链接的,如果它在那里,它会添加库名,版权和链接到about框.

delphi delphi-2007

14
推荐指数
2
解决办法
1022
查看次数