在从磁盘读取数据(数据仅指字符串)的函数中,我应该更喜欢哪种?哪个更好?
A) DiskStream.Read(Pointer(s)^, Count)
or
B) DiskStream.Read(s[1], Count)
Run Code Online (Sandbox Code Playgroud)
注意:
我知道两者都有相同的结果.
我知道在调用Read之前我必须使用S的SetLength.
UPDATE
S是AnsiString.
这是完整的功能:
{从文件中读取一堆字符.为什么'ReadChars'而不是'ReadString'?此函数读取C++字符串(字符串的长度也未写入磁盘).所以,我必须给出作为参数读取的字符数.}
function TMyStream.ReadChars(out s: AnsiString; CONST Count: Longint): Boolean;
begin
SetLength(s, Count);
Result:= Read(s[1], Count)= Count;
end;
Run Code Online (Sandbox Code Playgroud)
速度测试
在我的速度测试中,第一种方法比第二种方法快一点.我使用了一个400MB的文件,我从中读取了大约200000次字符串.该过程设置为高优先级.
有史以来最好的阅读时间是:
变体B为1.35,变体A为1.37.
平均:
平均而言,B得分也比A好20ms.
对于每种变体,测试重复15次.
差别很小.它可能落入测量误差范围.如果我更频繁地从更大的文件中读取字符串,那么可能会很重要.但就目前而言,我们可以说两行代码都表现相同.
ANSWER
Variant A - 可能是一点点微小的变种B - (显然)更容易阅读,它更像是Delphi-ish.我的首选.
注意:
我在TStreamReadBuffer示例中看到了Embarcadero使用变量A,但是使用TBytes而不是String.
在更新4和5之后,我有兴趣重新评估Delphi 2010.这次我打算移植一些我的代码(小规模)以查看在大规模上执行它有多困难.
主要问题似乎是ascii到unicode的转换.您发现有用的任何提示或资源有用吗?
非常感谢.
编辑:
此时,我对其他人(想要升级)的推荐将是:
http://www.embarcadero.com/images/dm/technical-papers/delphi-in-a-unicode-world-updated.pdf
WideString与Delphi 2009中的String相同
http://chee-yang.blogspot.com/2008/10/delphi-2009-unicode.html
请注意,Gif(由Melander提供)和Png(通过Martijn Saly?)图像现已合并到Delphi 2010中.您必须使用条件才能使用正确的GIF单元:
USES Windows, SysUtils, Graphics, blabla
{$IFDEF VER150}
, GIFImage, {Delphi 7}
{$ELSE}
GIFImg {Delphi 2010}
{$ENDIF};
Run Code Online (Sandbox Code Playgroud)
您还需要"修复"Embarcadero提供的PNG:http: //talkdelphi.blogspot.com/2009_03_01_archive.html
您需要了解的其他事项是,在Delphi 2010中打开项目之前,您必须备份项目.即使您没有按"保存"按钮,Delphi 2010也会更改您的DFM文件.表单将丢失数据,不会在D7中编译.
UPDATE
我终于升级了.Delphi XE有一些新功能.不幸的是,很少有人根本不工作(例如,后台编译,UML建模,代码洞察),其他人已经降级(例如帮助).IDE也不像Delphi 7那样稳定和快速,并且工具栏存在实际问题(最好不要自定义IDE).还有一个令人讨厌的错误,IDE具有100%的CPU利用率(请参阅我关于所有这些问题的其他帖子).我希望在更新2和3中,他们将解决一些最严格的问题.
无论如何,我认为我升级太快,因为现在Embarcadero宣布了64位编译器,所以我可能需要再花很多钱才能升级到Delphi的下一个版本以获得该编译器.对于那些仍在考虑升级到Delphi XE的人,我建议在购买之前先试用Delphi XE,看看它是否提供了一些其他功能无法提供的功能.我不是说Delphi XE比Delphi 7差,我说这不是更好!
我必须在国际上分发我的应用程序.
假设我有一个用户输入一些文本的控件(如备忘录).用户可以是日语,俄语,加拿大等.我想将字符串保存为磁盘作为TXT文件供以后使用.我将使用MY OWN函数来编写文本而不是TMemo.SaveToFile().
我如何将字符串保存到磁盘?采用UTF8或UTF16格式?
情况
我打算写一个类,构造函数是我自己创建的一个,因为我需要初始化一些值.这是我到目前为止编写的代码:
type
TCombinatorio = class(TObject)
private
valN, valK: integer;
result: double;
public
property K: integer read valK;
property N: integer read valN;
constructor Create(valN: integer; valK: integer);
end;
constructor TCombinatorio.Create(valN: Integer; valK: Integer);
begin
inherited Create;
Self.valN := valN;
Self.valK := valK;
if ((valN < 0) or (valK < 0)) then
begin
raise Exception.Create('N and K must be >= 0');
end;
end;
Run Code Online (Sandbox Code Playgroud)
由于我要做一些数学计算,我需要避免负数.
题
我可以用这种方式在构造函数中调用异常吗?我正在以这种方式运行代码:
procedure TForm1.Button1Click(Sender: TObject);
var a: TCombinatorio;
b: string;
begin
a := TCombinatorio.Create(5,-2);
try
//some …Run Code Online (Sandbox Code Playgroud) 可能重复:
我的可执行文件中的防病毒误报
到目前为止,我的程序有超过15个错误的病毒警报.他们中的大多数来自卡巴斯基,它总是报告相同的病毒:Trojan-GameThief.Win32.Lmir.pcd.有3个问题:
对于第一个问题,因为它总是检测到相同的病毒,我想这是因为我在我的所有程序中使用的一个例程.但究竟哪一个,我不知道.对于第二个问题,我正在考虑稍微修改程序并重新编译它,足以改变其代码,以便防病毒软件不再识别它并发布新版本.第三个问题是最困难的问题.如何检查我的所有程序与世界上所有的防病毒程序?
更新:
有没有人知道如何合法处理这个问题?似乎很多Delphi开发人员都有同样的问题.鲁莽的反病毒公司通过展示大量误报警来赚钱,让他们的客户认为在没有危险的情况下他们是安全的.虽然我们正在失去客户 - 但他们正在创造客户.我向防病毒公司通报了这个问题,但他们只针对该特定版本进行了修复.下次我发布更新时,会再次出现误报.他们只是不在乎.
由于粗心的防病毒软件,许多诚实的开发人员都遇到了问题.另请参阅:如何防止我的软件出现误报病毒?
也许我们可以团结起来反对这些防病毒产品,并迫使他们对误报警察更加谨慎,甚至为我们因为它们而失去的销售收回一些收入.我们应该签署某种请愿书,让他们知道我们不再接受这一点.https://docs.google.com/forms/d/1H3_O1z1iEqfh9ZT9u3B0R1tGEj-Hc9o7rAE0LKPr33Y
2017年更新
*上周,我的程序在VirusTotal上的检测率接近50%.我删除了一行代码,神奇地检测到61个中的2个(防病毒).令人惊讶的是,这些防病毒产品的随机性如何.
*当编译程序是'发布模式'(使用编译器优化)然后在'调试模式'下编译时,检测更高.
*使用EurekaLog时检测天空火箭.
结论:在一天结束时将您的exe文件上传到VirusTotal.如果检测率突然跳跃,请检查您在代码中所做的更改并删除"有害"的更改.
所以,我无法将程序与特定文件类型,而不强迫穷人用户输入的管理员密码关联(它可能是确定为家庭用户,但它是为用户在企业ENV一个巨大的问题).在这种情况下,唯一的解决方案是仅为当前用户建立关联.
我试过了,但有些东西不起作用.
如果我理解正确,我必须在ctCurUserFileExt中写一个像(例如)'.mp3'这样的密钥并写入类似'my_file'的东西.然后在ctCurUserClases中我添加一个这样的键:
WriteReg_String(RootKey, ctCurUserClases+ 'my_file\shell\open\command', '', Application.ExeName+ ' "%L"', TRUE)
Run Code Online (Sandbox Code Playgroud)
但是,当我双击该文件时,Windows会询问我应该打开它的应用程序.
这是常数:
CONST
RootKey= 'HKEY_CURRENT_USER';
ctCurUserFileExt= '\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\';
ctCurUserClases = '\Software\Classes\';
Run Code Online (Sandbox Code Playgroud) 如何将对象存储到磁盘中的所有荣耀?我的对象派生自TObjectList,因此它包含其他对象.
哪种方式最快最简单?哪种兼容方式?
序列化不是解决方案,因为我想保存非公共属性及其拥有的对象列表!
目前我试图将每个对象独立地保存为二进制文件,然后打包在一起.这是一个漫长的过程,但允许我使用较新版本的程序加载旧版本的对象(与以前保存的项目兼容).无论如何,复杂性开始增长,并且它看起来不再好看了.
我将不得不创建一个多线程项目很快我看到实验(delphitools.info/2011/10/13/memory-manager-investigations)显示默认的Delphi内存管理器存在多线程问题.

所以,我找到了这个SynScaleMM.有人可以给它或类似的内存管理器提供一些反馈吗?
谢谢
我想在TImageList中加载具有透明背景的PNG,并在TMainMenu(通过TAction)中使用它.
但是,在Delphi中,背景只是黑色.PNG支持只有一半在Delphi中实现吗?
这家伙说它适合他,但有一个按钮而不是主菜单.
我的设置:
注意意外行为:
当用户更改ColorDepth属性的值时,DELPHI将丢失所有图像(仅在TIMAGELIST中的整个表单中).
该bug可以按需复制.丢失的图像可以从之前的DFM文件中恢复,来自'histoy'文件夹.
是否可以有两个同名的属性?
property Cell [Cl, Rw: Integer]: string read getCell write setCell;
property Cell [ColName: string; Rw: Integer]: string read getCellByCol write setCellByCol;
Run Code Online (Sandbox Code Playgroud)
好吧,我试过了,编译器不会让我这样做,但也许有一个技巧......?