标签: delphi-10.2-tokyo

StrToFloat无法在Delphi 64位中报告无效的浮点数

以下代码尝试将值转换为远超出双精度范围

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中找到

delphi 64-bit delphi-10.2-tokyo

22
推荐指数
1
解决办法
949
查看次数

是delphi TQueue越野车吗?使用TQueue <Tbytes>返回nil with dequeue

我不明白为什么这个非常简单的代码失败了?我在德尔福东京发布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上正常工作,但在柏林也失败.

delphi delphi-10.2-tokyo

18
推荐指数
2
解决办法
825
查看次数

为什么例外没有被尝试抓住...除了结束;?

我有这个代码(在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 firemonkey delphi-10.2-tokyo

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

Delphi - 用10.2.1重新编译应用程序会导致内存泄漏?

我刚刚安装了Delphi 10.2 Release 1.当我重新编译我的应用程序并运行它们时,我得到了很多内存泄漏.10.2没有内存泄漏(没有更新).我也没有对代码进行任何更改.

为了验证,我创建了一个简单的空白应用程序并在表单上放置了一些组件.没有代码.跑了应用程序并报告了内存泄漏. 内存泄漏来自示例应用程序

我想强调这一点(如果仅在升级之前作为警告).

我的问题:

  1. 还有其他人看过这个问题吗?
  2. 有什么我需要或可能正在做的事情摆脱这个问题?

注:我已经登录门户网站的质量问题,以防万一,这是一个真正的问题:https://quality.embarcadero.com/browse/RSP-18774.在这张票中,我还附上了示例应用程序.

delphi memory-leaks delphi-10.2-tokyo

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

H2077内部尝试最终阻止与goto - 它是东京的编译器缺陷?

在升级到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)

将编译器选项中的优化设置为

  • True(发布配置的默认值) - foo(1)返回False
  • False(Debug配置的默认值) - foo(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)

delphi delphi-10.2-tokyo

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

嵌套通用记录

我在尝试定义嵌套通用记录时遇到了一个奇怪的编译器错误.

嵌套适用于类和接口,但不能以某种方式记录.

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 generics delphi-10.1-berlin delphi-10.2-tokyo

10
推荐指数
1
解决办法
257
查看次数

Delphi 10.3 Rio减少了支持的Android设备数量?

我的Delphi 10.2.3应用程序已经提交给Google Play,并提供了以下答案:Delphi Android app API level 26? Google Play报道此版本支持400多种设备.

同一个项目是使用10.3 Rio构建的,但在提交时,Google Play警告说这个新版本仅支持223个设备.

导致支持设备减少的原因是什么?

delphi android delphi-10.2-tokyo delphi-10.3-rio

10
推荐指数
1
解决办法
588
查看次数

Delphi接口不参考计数

阅读德尔福专家书,我发现了一些我无法理解的东西.作者使用以下代码创建了一个单元:

 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)

delphi delphi-10.2-tokyo

9
推荐指数
1
解决办法
420
查看次数

Firemonkey android read_phone_state运行时权限要求获取IMEI

如何在运行时获取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)

delphi permissions android firemonkey delphi-10.2-tokyo

9
推荐指数
1
解决办法
1638
查看次数

如何比较枚举类型的集合

从某一点来说,我厌倦了编写设置条件(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)

delphi delphi-10.2-tokyo

8
推荐指数
2
解决办法
249
查看次数