在开始之前,我想指出的是,我已经通过谷歌进行了这样的事情,并且无法找到一个,我已经诚实而真实地搜索过.
我要求(对于我正在开发的项目)列出所有Delphi(2007年到最新发布的版本,我不再支持2007年以前的任何版本)"语言功能",以及它们被引入的版本和(在适用的情况下)弃用,改进或删除.
我之前已经在Stack Overflow上注意到类似的问题,尽管其中大部分是以"哪个特征最好"的形式表达的,并且被认为是不合适的.
如果有人知道这样的清单(或有足够的业余时间来编制一个清单),我将非常感激.
接受的答案将包含指向此类列表的链接或列表本身.
我在安装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似乎无法识别接口链接.我的意思最好用一个例子来描述,当你在IDE中打开2个表单,并在它们之间有组件之间的链接,然后尝试切换到表单视图时,文本(Alt + F12)将导致IDE正确地抱怨:
Module 'UnitXXX.pas' has open descendents or linked modules. Cannot close.
但是如果属性是一个接口,那么这不会发生,而是发生的事情是链接被切断(当你使用Notification机制清除引用时这是最好的情况,否则你会留下无效的指针)
另一个问题,可能是同一个错误的结果是,当您在IDE中打开项目时,表单将重新打开的顺序是未定义的,因此IDE可以尝试打开包含具有到组件的接口链接的组件的表单另一种形式,但其他形式尚未重新创建.因此,这有效地导致AV或切断链接.
早在90年代,我使用时Datasets,Datasources我记得表格之间的链接消失的类似问题,所以这有点类似.
作为临时解决方法,我添加了重复的已发布属性,对于每个Interface属性,我添加了另一个声明为的属性TComponent.这使得Delphi意识到表单之间存在联系,但至少可以说这是一个丑陋的解决方法.
所以我想知道我能做些什么来解决这个问题?这是一个IDE错误,可能无法直接修复,但也许我可以覆盖某些内容或以其他方式挂接到流机制,以更有效地解决此错误.
我从未如此深入到流机制,但我怀疑Fixup机制应该处理这个问题.有一个,csFixups TComponentState所以我希望可以解决方法.
编辑:使用D2007.
更新:
上传到http://www.filedropper.com/fixupbugproject2的新更新的可重现示例
添加后property ComponentReference: TComponent,可以轻松比较和跟踪界面与组件流.
我将问题缩小到汇编级别,这有点超出我的深度.
在单位的程序GlobalFixupReferences中,classes它调用:
(GetOrdProp(FInstance, FPropInfo) <> 0)
最终执行:
function TInterfacedComponent.GetInterfaceReference: IInterface;
begin
// uncomment the code bellow to avoid exception
{ if (csLoading in ComponentState) and (FInterfaceReference = nil) then
// leave result unassigned …Run Code Online (Sandbox Code Playgroud) 我是开发Delphi应用程序的团队的成员.内存需求量很大.500 MB是正常的,但在某些情况下它会出现内存异常.在这种情况下分配的内存通常在1000 - 1700 MB之间.
我们当然需要64位编译器,但现在不会发生(如果它发生,我们也必须转换为unicode,但这是另一个故事......).
我的问题是为什么在64位环境中运行时每个进程有2 GB的内存限制.指针是32位,所以我认为4 GB是正确的限制.我使用Delphi 2007.
编辑: 所以如果我使用以下方法在Delphi中设置IMAGE_FILE_LARGE_ADDRESS_AWARE标志:
{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Run Code Online (Sandbox Code Playgroud)
并在Windows Server 2003 x64上运行生成的Exe文件,然后该应用程序可以处理4 GB?
Delphi 2009使用构建配置.创建新项目时,您有两个默认构建配置"Debug"和"Release".
现在我问自己如何使用MSBuild自动化构建(自2007版以来Delphi支持).
您可以在某个Delphi项目目录中的"RAD Studio命令提示符"中启动"msbuild"命令,它将构建默认的构建配置(Delphi IDE中最后一个激活的构建配置).
现在,我想通过命令行参数指定某个(非默认)构建配置.
Delphi帮助断言参数是[/ p:configuration = <configuration name>],这是错误的(Delphi 2009,Help Update 1)!
什么是正确的方法?
最近我被一位声誉卓着的SO用户告知,它TStringList有分裂错误,导致它无法解析CSV数据.我没有被告知这些错误的性质,在互联网上搜索包括Quality Central没有产生任何结果,所以我问.什么是TStringList拆分错误?
请注意,我对没有根据意见的答案感兴趣.
我知道的:
并不多......其中一个就是,这些错误很少出现在测试数据中,但在现实世界中却很少见.
另一方面,如上所述,它们阻止了对CSV的正确解析.认为很难用测试数据重现错误,我(可能)寻求帮助,他们尝试在生产代码中使用字符串列表作为CSV解析器.
无关紧要的问题:
我获取了有关'Delphi-XE'标记问题的信息,因此由于"空格字符被视为分隔符" 功能而无法解析,因此不适用.因为StrictDelimiterDelphi 2006 引入的属性解决了这个问题.我,我自己,正在使用Delphi 2007.
此外,由于字符串列表只能包含字符串,因此它只负责拆分字段.涉及由区域差异等引起的字段值(fi日期,浮点数......)的任何转换难度都不在范围内.
基本规则:
CSV没有标准规范.但是从各种规范中可以推断出基本规则.
下面演示TStringList如何处理这些.规则和示例字符串来自维基百科.括号([ ])叠加在字符串周围,以便能够通过测试代码查看前导或尾随空格(相关).
空间被认为是一个领域的一部分,不应该被忽视.
Test string: [1997, Ford , E350] Items: [1997] [ Ford ] [ E350]
带嵌入逗号的字段必须包含在双引号字符中.
Test string: [1997,Ford,E350,"Super, luxurious truck"] Items: [1997] [Ford] [E350] [Super, luxurious truck]
具有嵌入式双引号字符的字段必须包含在双引号字符中,并且每个嵌入的双引号字符必须由一对双引号字符表示.
Test string: [1997,Ford,E350,"Super, ""luxurious"" truck"] Items: [1997] [Ford] [E350] [Super, "luxurious" truck]
嵌入换行符的字段必须包含在双引号字符中.
Test string: [1997,Ford,E350,"Go get one …
我刚刚调试了一个函数,它返回一个让我担心的字符串.我一直认为返回字符串的函数的隐式Result变量在函数调用开始时将为空,但以下(简化)代码产生了意外的结果:
function TMyObject.GenerateInfo: string;
procedure AppendInfo(const AppendStr: string);
begin
if(Result > '') then
Result := Result + #13;
Result := Result + AppendStr;
end;
begin
if(ACondition) then
AppendInfo('Some Text');
end;
Run Code Online (Sandbox Code Playgroud)
多次调用此函数导致:
"Some Text"
Run Code Online (Sandbox Code Playgroud)
第一次,
"Some Text"
"Some Text"
Run Code Online (Sandbox Code Playgroud)
第二次,
"Some Text"
"Some Text"
"Some Text"
Run Code Online (Sandbox Code Playgroud)
第三次等
要修复它,我必须初始化结果:
begin
Result := '';
if(ACondition) then
AppendInfo('Some Text');
end;
Run Code Online (Sandbox Code Playgroud)
是否需要初始化字符串函数结果?为什么(技术上)?为什么编译器不会发出警告"W1035函数的返回值'xxx'可能是未定义的"字符串函数?我是否需要遍历所有代码以确保设置值,因为如果未明确设置结果,则期望函数中的空字符串不可靠?
我在一个新的测试应用程序中对此进行了测试,结果是一样的.
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
S: string;
begin
for i := 1 to 5 do
S := GenerateInfo;
ShowMessage(S); // 5 …Run Code Online (Sandbox Code Playgroud) 是否存在任何RTL Delphi函数来确定字符串中最后一次出现char的位置?
我想做这样的事情:
Result = 'MyString' in [string1, string2, string3, string4];
Run Code Online (Sandbox Code Playgroud)
这不能用于字符串,我不想做这样的事情:
Result = (('MyString' = string1) or ('MyString' = string2));
Run Code Online (Sandbox Code Playgroud)
另外我认为创建一个StringList来做这件事太复杂了.
有没有其他方法来实现这一目标?
谢谢.
在Delphi 2007中是否有例程可以根据区域设置(代码页)将ANSI表(> 127)的高范围内的字符转换为纯ASCII(<= 127)中的等效字符?
我知道有些字符不能很好地翻译,但大多数字符都可以,尤其是.在192-255范围内:
delphi ascii character-encoding delphi-2007 non-ascii-characters
delphi ×10
delphi-2007 ×10
delphi-2009 ×2
ascii ×1
csv ×1
delphi-2006 ×1
delphi-2010 ×1
design-time ×1
ide ×1
interface ×1
msbuild ×1
string ×1
tstringlist ×1
win64 ×1