小编WeG*_*ars的帖子

指针^与s [1]

在从磁盘读取数据(数据仅指字符串)的函数中,我应该更喜欢哪种?哪个更好?

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.

delphi

19
推荐指数
5
解决办法
890
查看次数

那些想要从Delphi 7(及以下版本)升级到Delphi 2010的人的任何提示?

在更新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相同

Delphi 2010的编译器版本是什么?

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差,我说这不是更好!

delphi unicode

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

我该怎么用?UTF8还是UTF16?

我必须在国际上分发我的应用程序.

假设我有一个用户输入一些文本的控件(如备忘录).用户可以是日语,俄语,加拿大等.我想将字符串保存为磁盘作为TXT文件供以后使用.我将使用MY OWN函数来编写文本而不是TMemo.SaveToFile().

我如何将字符串保存到磁盘?采用UTF8或UTF16格式?

delphi utf-8 utf-16

17
推荐指数
3
解决办法
5773
查看次数

Delphi在构造函数中引发异常

情况

我打算写一个类,构造函数是我自己创建的一个,因为我需要初始化一些值.这是我到目前为止编写的代码:

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)

delphi

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

如何防止我的软件出现误报病毒?

可能重复:
我的可执行文件中的防病毒误报

到目前为止,我的程序有超过15个错误的病毒警报.他们中的大多数来自卡巴斯基,它总是报告相同的病毒:Trojan-GameThief.Win32.Lmir.pcd.有3个问题:

  1. 为什么会出现?
  2. 怎么预防呢?
  3. 怎么检测呢?

对于第一个问题,因为它总是检测到相同的病毒,我想这是因为我在我的所有程序中使用的一个例程.但究竟哪一个,我不知道.对于第二个问题,我正在考虑稍微修改程序并重新编译它,足以改变其代码,以便防病毒软件不再识别它并发布新版本.第三个问题是最困难的问题.如何检查我的所有程序与世界上所有的防病毒程序?


更新:
有没有人知道如何合法处理这个问题?似乎很多Delphi开发人员都有同样的问题.鲁莽的反病毒公司通过展示大量误报警来赚钱,让他们的客户认为在没有危险的情况下他们是安全的.虽然我们正在失去客户 - 但他们正在创造客户.我向防病毒公司通报了这个问题,但他们只针对该特定版本进行了修复.下次我发布更新时,会再次出现误报.他们只是不在乎.

由于粗心的防病毒软件,许多诚实的开发人员都遇到了问题.另请参阅:如何防止我的软件出现误报病毒?

也许我们可以团结起来反对这些防病毒产品,并迫使他们对误报警察更加谨慎,甚至为我们因为它们而失去的销售收回一些收入.我们应该签署某种请愿书,让他们知道我们不再接受这一点.https://docs.google.com/forms/d/1H3_O1z1iEqfh9ZT9u3B0R1tGEj-Hc9o7rAE0LKPr33Y

2017年更新
*上周,我的程序在VirusTotal上的检测率接近50%.我删除了一行代码,神奇地检测到61个中的2个(防病毒).令人惊讶的是,这些防病毒产品的随机性如何.
*当编译程序是'发布模式'(使用编译器优化)然后在'调试模式'下编译时,检测更高.
*使用EurekaLog时检测天空火箭.

结论:在一天结束时将您的exe文件上传到VirusTotal.如果检测率突然跳跃,请检查您在代码中所做的更改并删除"有害"的更改.

delphi antivirus virus-scanning

15
推荐指数
2
解决办法
8572
查看次数

如何将程序与文件类型关联,但仅限于当前用户?

所以,我无法将程序与特定文件类型,而不强迫穷人用户输入的管理员密码关联(它可能是确定为家庭用户,但它是为用户在企业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)

delphi registry windows-vista windows-7

15
推荐指数
1
解决办法
5178
查看次数

如何将对象存储到磁盘?

如何将对象存储到磁盘中的所有荣耀?我的对象派生自TObjectList,因此它包含其他对象.

哪种方式最快最简单?哪种兼容方式?

序列化不是解决方案,因为我想保存非公共属性及其拥有的对象列表!

目前我试图将每个对象独立地保存为二进制文件,然后打包在一起.这是一个漫长的过程,但允许我使用较新版本的程序加载旧版本的对象(与以前保存的项目兼容).无论如何,复杂性开始增长,并且它看起来不再好看了.

delphi

14
推荐指数
1
解决办法
2921
查看次数

需要多线程内存管理器

我将不得不创建一个多线程项目很快我看到实验(delphitools.info/2011/10/13/memory-manager-investigations)显示默认的Delphi内存管理器存在多线程问题.

在此输入图像描述

所以,我找到了这个SynScaleMM.有人可以给它或类似的内存管理器提供一些反馈吗?

谢谢

delphi delphi-xe

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

TMainMenu中的透明PNG图像(带有TImageList)

我想在TImageList中加载具有透明背景的PNG,并在TMainMenu(通过TAction)中使用它.
但是,在Delphi中,背景只是黑色.PNG支持只有一半在Delphi中实现吗?

家伙说它适合他,但有一个按钮而不是主菜单.

我的设置:

  • 我的图像是每种颜色8位加上8位透明通道(我也尝试过1位透明但仍然不起作用).在任何其他程序中,图像看起来都很好.
  • 德尔福XE.
  • 在TImageList的编辑器中,"透明颜色"和"填充颜色"设置为"默认"并被禁用.

注意意外行为:

当用户更改ColorDepth属性的值时,DELPHI将丢失所有图像(仅在TIMAGELIST中的整个表单中).

该bug可以按需复制.丢失的图像可以从之前的DFM文件中恢复,来自'histoy'文件夹.

delphi delphi-xe

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

是否可以有两个同名的属性?

是否可以有两个同名的属性?

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)

好吧,我试过了,编译器不会让我这样做,但也许有一个技巧......?

delphi delphi-xe7

13
推荐指数
1
解决办法
1861
查看次数