我在安装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开发人员怎么样?
我试图自动弄清楚哪个Delphi版本(我的计算机上安装的Delphi 5到XE2)用于打开给定项目而不会错误地升级该项目.
直到Delphi 7,每个项目都有.ini格式的.dof文件.Delphi 5没有任何可能有用的条目,但是从Delphi 6开始有一个[FileVersion]部分,其中包含以下值:
所以我想这就解决了,因为较旧的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版本是唯一的?
不知怎的,我怀疑它,我担心GUID可能代表不同的SKU(专业/建筑师等).但也许你可以验证一下?
从Delphi 2007开始,有一个不同XML格式的.dproj文件.Delphi 2007格式不包含我能找到的任何版本条目,但是从Delphi 2009开始,似乎有以下条目:
\project\PropertyGroup\ProjectVersion
这些是我在.dproj文件中找到的值:
如果这些是正确的,我可以可靠地确定Delphi 2007,XE和XE2.但我如何区分Delphi 2009和2010?
而且,这些数字对我来说很奇怪.有没有人知道Delphi的各种更新之间是否有任何差异,例如原始的Delphi XE2版本是否可以从13.0开始并且每次更新都会增加点后面的数字?但如果是这样的话,德尔福XE如何获得12.3?
(有一个类似的问题我怎么能告诉用什么版本的Delphi来创建一个项目,但单一的答案非常有限.)
以防万一其他人需要这个:我刚刚在Delphi Wiki中添加了一个页面,它总结了所有答案,并为更新的Delphi版本添加了信息(目前直到Delphi 10.1).
我预计结果将是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) 我要寻找一个函数来扭转任何字符串(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) 我一直在摆弄周围与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 XE2在线帮助(以及Embarcadero DocWiki)在文档上非常精简TObjectDictionary(或者我找不到它太愚蠢).
据我所知,它可以用来存储可以通过字符串键访问的对象实例(基本上可以通过排序TStringList但类型安全来访问).但我对如何实际申报和使用它感到茫然.
有什么指针吗?
这是一个非常特殊的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:
这是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
我想为个人/学习目的制作一些简单的游戏.简单的游戏我指的是平台,迷宫,街机游戏等游戏.我有一天也想用一个简单的编辑器创建一个平台游戏,让其他人可以编辑和设计他们自己的游戏关卡.
我不确定Delphi是否可行,但我没有看到或听到很多人在Delphi中编写游戏,但是Delphi是我在中级水平上理解的唯一语言.
如果Delphi可以像我提到的那样创建简单的游戏,我是否正确地认为我需要一些可以帮助我做到这一点的库,例如Direct X?
我正在使用Delphi XE,我希望我已经等待并升级到Delphi XE2,因为它似乎包含一些内置的Drawing库.
我期待听到你对此的回应.
谢谢.
我希望能够确定某个特定单元是否已编译成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 ×10
delphi-2007 ×3
delphi-2009 ×3
delphi-2010 ×2
delphi-2006 ×1
delphi-xe ×1
delphi-xe2 ×1
directx ×1
events ×1
generics ×1
string ×1