以下代码尝试将值转换为远超出双精度范围
StrToFloat('1e99999999')
Run Code Online (Sandbox Code Playgroud)
使用Windows 32位编译器在Delphi 10.2r3中正确报告错误的浮点值,但是当使用Window 64位编译器编译时,它会静默返回0(零).
当浮点值不正确时,有没有办法让StrToFloat报告错误?
我已经尝试过TArithmeticException.exOverflow,但在这种情况下这没有效果.
我也尝试过TArithmeticException.exPrecision,但它在许多通常的近似情况下触发(在转换'1e9'时触发它).
Delphi 10.2 update 3注意到了这个问题
附录:要解决这个问题,我已经启动了一个洁净室替代实现字符串到双重转换,初始版本带有测试可以在dwscript commit 2ba1d4a中找到
我不明白为什么这个非常简单的代码失败了?我在德尔福东京发布2号.
{$APPTYPE CONSOLE}
uses
System.SysUtils,
System.Generics.Collections;
procedure Main;
var
aQueue: TQueue<TBytes>;
aBytes: TBytes;
begin
aQueue := TQueue<TBytes>.create;
aBytes := TEncoding.UTF8.GetBytes('abcd');
aQueue.Enqueue(aBytes);
aBytes := aQueue.Dequeue;
Writeln(Length(aBytes)); // outputs 4 as expected
aBytes := TEncoding.UTF8.GetBytes('abcd');
aQueue.Enqueue(aBytes);
aBytes := aQueue.Dequeue;
Writeln(Length(aBytes)); // outputs 0
end;
begin
Main;
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?
注意:代码在XE4上正常工作,但在柏林也失败.
我有这个代码(在iOS下使用Delphi Tokyo运行):
procedure TMainForm.Button1Click(Sender: TObject);
var aData: NSData;
begin
try
try
aData := nil;
finally
// this line triggers an exception
aData.release;
end;
except
on E: Exception do begin
exit;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
通常,异常应该在except end块中捕获,但在这种情况下,它不会被处理程序捕获并且会传播到Application.OnException处理程序.
地址0000000100EE9A8C的访问冲突,访问地址0000000000000000
我错过了什么?
我刚刚安装了Delphi 10.2 Release 1.当我重新编译我的应用程序并运行它们时,我得到了很多内存泄漏.10.2没有内存泄漏(没有更新).我也没有对代码进行任何更改.
为了验证,我创建了一个简单的空白应用程序并在表单上放置了一些组件.没有代码.跑了应用程序并报告了内存泄漏.

我想强调这一点(如果仅在升级之前作为警告).
我的问题:
注:我已经登录门户网站的质量问题,以防万一,这是一个真正的问题:https://quality.embarcadero.com/browse/RSP-18774.在这张票中,我还附上了示例应用程序.
在升级到10.2东京之后,第三方组件之一开始抛出很多例外.调试显示有问题的代码部分,可以用这个(希望)最小代码表示:
function foo(i: Integer): Boolean;
label bar;
begin
try
if i=1 then goto bar;
Result:=False;
EXIT;
bar:
Result:=True; //<~~ H2077 Value assigned to 'foo' never used with Optimization on
finally
end;
end;
Run Code Online (Sandbox Code Playgroud)
将编译器选项中的优化设置为
foo(1)返回Falsefoo(1)返回True在XE7中不会发生这样的问题.这个答案解释了东京编译器的变化可能是相关的 - 但也许修复了一些新引入的问题.
我的问题是: 东京的编译器存在缺陷吗?我很确定它是,但我是Delphi编程的新手,很高兴得到更有经验的用户的确认.
如果是编译器的缺陷,那么我有一个跟进问题:是否有任何快速方法来修复此代码?我知道如何goto用简单的if then else语句删除我的MCVE ,但真正的代码更复杂:
if cond1 then goto bar;
if cond2 then goto bar;
if cond3 then goto bar; …Run Code Online (Sandbox Code Playgroud) 我在尝试定义嵌套通用记录时遇到了一个奇怪的编译器错误.
嵌套适用于类和接口,但不能以某种方式记录.
type
TRec<T> = record
Value: T;
end;
TCls = class
public
Rec: TRec<TRec<Integer>>;
end;
Run Code Online (Sandbox Code Playgroud)
这不是在Delphi Berlin 10.1.2上编译的,在东京10.2.3也没有运气.这是语言或编译器问题的限制吗?
错误消息是:
[dcc32错误] Project1.dpr(22):E2564未定义类型'TRec <T>'
我只想要一次嵌套Spring.Nullable<>类型,但是没有用.之后我用一个简单的通用记录快速复制了它.
我的Delphi 10.2.3应用程序已经提交给Google Play,并提供了以下答案:Delphi Android app API level 26? Google Play报道此版本支持400多种设备.
同一个项目是使用10.3 Rio构建的,但在提交时,Google Play警告说这个新版本仅支持223个设备.
导致支持设备减少的原因是什么?
阅读德尔福专家书,我发现了一些我无法理解的东西.作者使用以下代码创建了一个单元:
IToDoData = interface //CRUD
function ToDoCreate(aValue: TToDo): integer;
function ToDoRead(id: integer; out aValue: TToDo): boolean;
function ToDoUpdate(aValue: TToDo): boolean;
function ToDoDelete(id: integer): boolean;
procedure ToDoList(aList: TToDos);
end;
Run Code Online (Sandbox Code Playgroud)
然后他决定使用a DataModule并以这种方式实现上面的接口:
type
TDMToDo = class(TDataModule, IToDoData)
// ... other code ...
public
// IToDoData
function ToDoCreate(aValue: TToDo): integer;
function ToDoRead(id: integer; out aValue: TToDo): boolean;
function ToDoUpdate(aValue: TToDo): boolean;
function ToDoDelete(id: integer): boolean;
procedure ToDoList(aList: TToDos);
end;
Run Code Online (Sandbox Code Playgroud)
到目前为止这么好,但请注意,他没有这么说TInterfacedObject,我们没有AddRef之类的方法等等.我的猜测是上面的代码很好,但它必须包含在try ... finally块中.
在主窗体中(数据模块单元当然是uses子句),有一个这样的函数:
function TFormToDo.GetToDoData: IToDoData;
begin
if …Run Code Online (Sandbox Code Playgroud) 如何在运行时获取read_phone_state权限以获取IMEI号?
if not HasPermission('android.permission.READ_PHONE_STATE') then
begin
//ASK AND GET PERMISSION ?
end;
function TForm1.HasPermission(const Permission: string): Boolean;
begin
//Permissions listed at http://d.android.com/reference/android/Manifest.permission.html
{$IF RTLVersion >= 30}
Result := TAndroidHelper.Context.checkCallingOrSelfPermission(
{$ELSE}
Result := SharedActivityContext.checkCallingOrSelfPermission(
{$ENDIF}
StringToJString(Permission)) =
TJPackageManager.JavaClass.PERMISSION_GRANTED;
end;
Run Code Online (Sandbox Code Playgroud) 从某一点来说,我厌倦了编写设置条件(and,or),因为对于更多条件或更长的变量名称,它开始变得笨拙并且令人讨厌再次写入.所以我开始写助手,所以我可以写ASet.ContainsOne([ceValue1, ceValue2])而不是(ceValue1 in ASet) or (ceValue2 in ASet).
type
TCustomEnum = (ceValue1, ceValue2, ceValue3);
TCustomSet = set of TCustomEnum;
TCustomSetHelper = record helper for TCustomSet
function ContainsOne(ASet: TCustomSet): Boolean;
function ContainsAll(ASet: TCustomSet): Boolean;
end;
implementation
function TCustomSetHelper.ContainsOne(ASet: TCustomSet): Boolean;
var
lValue : TCustomEnum;
begin
for lValue in ASet do
begin
if lValue in Self then
Exit(True);
end;
Result := False;
end;
function TCustomSetHelper.ContainsAll(ASet: TCustomSet): Boolean;
var
lValue : TCustomEnum;
begin
Result := …Run Code Online (Sandbox Code Playgroud)