标签: delphi

BcdDivide函数在Delphi XE和XE2中表现不同

FmtBcd.pas已经在Delphi XE2中进行了大量修改.在我的一个项目中,我有一个案例对两个Bcd值使用除法运算,但这两个版本产生不同的结果.在最坏的情况下,Delphi XE2可能会抛出一个Bcd overflow error.

示例:在Delphi XE2控制台应用程序中运行以下代码:

var A, B, C, D: TBcd;
begin
  A := StrToBcd('1');
  B := StrToBcd('3');
  BcdDivide(A, B, C);
  WriteLn(BcdToStr(C));

  try
    BcdMultiply(C, C, D);
    WriteLn(BcdToStr(D));
  except
    on E: Exception do
      WriteLn(E.Message);
  end;

  ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)

以上输出将是:

0.333333333333333333333333333333333333333333333333333333333333333
BCD overflow
Run Code Online (Sandbox Code Playgroud)

该变量C包含一个Bcd值,具有63个小数位的特异性.BcdMultiply对变量执行第二次操作C将导致a Bcd overflow error.

但是,要在Delphi XE中运行相同的代码,会产生以下结果,而不会出现任何异常提示:

0.3333333333
0.11111111108888888889
Run Code Online (Sandbox Code Playgroud)

有人可以建议一个解决这个问题的最佳实践方法吗?

delphi delphi-xe delphi-xe2

67
推荐指数
1
解决办法
1518
查看次数

在XE3中使用自动更新进行实时绑定(无需像在XE2中那样调用Notify())

我目前正在使用Delphi XE2,并听说他们在XE3中使用自动更新进行新的Live Binding(无需像XE2那样调用Notify()).

在C#或Delphi XE2中我们必须实现INotifyPropertyChanged(Notify();在Delphi中),这种方法确实有意义,因为我们可以完全控制要更新的内容以及何时更新它,这样我们就可以轻松调整性能并实现虚拟化.

但我只是想知道它是如何工作的,它们为实现它做了什么样的机制,我不知道它们是如何做到的,以下是可能用于实现自动更新的假设.

  1. 计时器:计时器经常打勾并刷新所有数据

    性能非常慢没有虚拟化

  2. 编译器级别功能:notify() events编译器自动执行的所有相关代码

    很多头脑

  3. 索姆其他方法:

请帮助我确定他们是如何实现它的.

我目前正在使用XE3试用版,因此我无法访问源代码,您的答案将帮助我决定是否切换到新功能.
我有一个类(集合项)有400个属性要绑定(并非所有时间都是这样),所以性能确实在我的应用程序的稳定性中发挥了重要作用.

delphi data-binding virtualization performance delphi-xe3

64
推荐指数
1
解决办法
1755
查看次数

如何在Delphi中以各种方式选择线程?

看来我终于要在我的Delphi 2009程序中实现某种线程.如果只有一种方法可以做到这一点,我就会开始跑步.但我看到了几种可能性.

任何人都可以解释这些之间的差异以及为什么我选择一个而不是另一个.

  1. Delphi中的TThread类

  2. AsyncCalls安德烈亚斯Hausladen

  3. OmniThreadLibrary by Primoz Gabrijelcic(gabr)

  4. ......还有其他人吗?


编辑:

我刚读了Gabr在2010年3月(第10期)Blaise Pascal杂志上发表的一篇精彩文章,名为"创造线索的四种方法".你必须订阅获取杂志的内容,所以根据版权,我不能在这里重现任何实质性的内容.

总之,Gabr描述了使用TThreads,直接Windows API调用,Andy的AsyncCalls和他自己的OmniThreadLibrary之间的区别.他的结论是:

"我不是说你必须选择除了经典的德尔福方式(TThread)以外的任何东西,但是你知道你拥有的选择仍然很好"

Mghie的答案非常透彻,暗示OmniThreadLibrary可能更可取.但是我仍然对每个人关于我(或任何人)应该如何为他们的应用选择他们的线程方法的意见感兴趣.

您可以添加到列表中:

.4.直接调用Windows API

.5. 米莎Charrett的 CSI分布式应用程序框架,通过LachlanG在答复建议.


结论:

我可能会选择OmniThreadLibrary.我喜欢加布尔的作品.我多年前使用过他的探查器GPProfile,而我现在正在使用他的GPStringHash,它实际上是OTL的一部分.

一旦Embarcadero将该功能添加到Delphi中,我唯一关心的可能就是升级它以使用64位或Unix/Mac处理.

delphi multithreading asynchronous

63
推荐指数
4
解决办法
6698
查看次数

德尔福的单元测试 - 你是怎么做到的?

我想知道这里的几个Delphi用户是如何做单元测试的,如果有的话?是否存在与您发现的IDE集成的任何内容?如果没有,你使用什么工具,你是否拥有或知道示例小工程如何运作?

更新:

我忘了提到我正在使用BDS 2006 Pro,虽然我偶尔会使用Delphi 7,当然其他人可能正在使用其他版本.

delphi unit-testing delphi-7 delphi-2006

60
推荐指数
5
解决办法
3万
查看次数

我应该如何为最终的64位编译器准备我的32位Delphi程序?

可能重复:
迁移到Delphi 2010和Unicode时如何准备64位

由于我相信64位 Delphi编译器很快就会出现,我很好奇是否有人知道现在32位的程序将在使用64位编译器时编译和工作而不做任何更改.

如果有一般规则,我们应该在旧程序中系统地进行哪些更改以编译为64位

64位编译器突然出现时,做好准备是很好的 ...

任何建议将不胜感激.

delphi unicode 32bit-64bit delphi-2010

59
推荐指数
5
解决办法
9809
查看次数

研究不同语言的发展相对成本

有没有人看到最近(并且相当平衡)研究使用不同语言进行软件开发的相对成本?我特别想看看Java V的相对成本.C#Vs. 德尔福.

c# java delphi

58
推荐指数
4
解决办法
4588
查看次数

使用XE2进行远程调试 - 显示字符串

我正在远程调试DElphi XE2(更新#4)和Windows XP目标之间的大型应用程序.PAServer正在目标上运行,应用程序正常工作并在断点处停止(您不会相信这个成就有多么难 - 提示 - 删除您的DPROJ并在XE之前通过任何IDE时再次启动).

我注意到局部变量和监视器的显示以一种奇怪的格式显示我的字符串,而在本地调试时通常会显示"某些字符串"格式.我知道了:

在此输入图像描述

任何人都可以告诉我为什么字符串以这种方式显示?我还得到{NULL}和{}之间的垃圾和未分配的输出变量之间的垃圾.谢谢.

.我看到这种格式表示宽字符串.我在Windows 7上尝试了一个简单的应用程序并获得了以下结果.我的应用程序在一个断点:

在此输入图像描述

显示的本地字符串变量:

在此输入图像描述

注意截断的'Hello'.似乎XE2有时会遇到远程unicode字符串的问题.我的PaServer是版本1.0.2.任何人都可以检查这是最新的吗?'来自更新#4的Twas ......

delphi string debugging remote-debugging delphi-xe2

58
推荐指数
1
解决办法
1786
查看次数

在比较Delphi表单文件的版本时,如何使Beyond Compare忽略某些差异

我使用Beyond Compare(版本3.1.10)来比较不同版本的Delphi表单文件,但我不希望看到有关ExplicitTop,ExplicitLeft,ExplicitHeight和ExplicitWidth的差异.

细节:这些行总是以许多空白字符开头,然后是"ExplicitXXX ="和一个数字.旧版本的Delphi没有这些行,所以我想忽略这些行添加到最新版本的差异,我也想忽略数字发生变化的差异.

有谁知道如何做到这一点?

编辑:复制(或多或少):

如何配置BeyondCompare忽略评论中的SCM替换文本?

delphi version-control beyondcompare beyondcompare3

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

为什么在访问对象之前我不应该使用"if Assigned()"?

这个问题是stackoverflow上人们特别评论的延续,我现在已经看过几次不同的时间了.我和教我Delphi的开发人员一样,为了保证安全,if assigned()在释放对象之前,以及在做其他各种事情之前总是先做检查.但是,我现在被告知我应该添加此支票.我想知道如果我这样做,应用程序编译/运行的方式是否存在任何差异,或者它是否会对结果产生影响...

if assigned(SomeObject) then SomeObject.Free;
Run Code Online (Sandbox Code Playgroud)

假设我有一个表单,我在表单创建时在后台创建一个位图对象,并在完成后释放它.现在我想我的问题是,当我试图访问可能在某些时候可能已经免费的对象时,我已经习惯了对我的很多代码进行检查.即使没有必要,我也一直在使用它.我喜欢彻底......

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FBitmap: TBitmap;
  public
    function LoadBitmap(const Filename: String): Bool;
    property Bitmap: TBitmap read FBitmap;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FBitmap:= TBitmap.Create;
  LoadBitmap('C:\Some Sample Bitmap.bmp');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if assigned(FBitmap) then begin //<-----
    //Do some routine to close file …
Run Code Online (Sandbox Code Playgroud)

delphi

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

"var"和"out"参数之间有什么区别?

声明的参数与var声明的参数之间的区别是什么out?编译器如何区别对待它们(例如,通过生成不同的代码,或通过更改它发出的诊断)?或者,不同的修饰符是否只允许程序员记录参数的预期用途?做了什么样的影响类型的参数对此事?

delphi parameters pass-by-reference

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