小编Lüb*_*ken的帖子

包含带有"隐式"类运算符的动态数组的Delphi记录的初始化

我试图弄清楚是否可以使用Delphi中的"隐式"类运算符初始化包含动态数组的记录(柏林10.1 upd 1)

附加的程序产生以下输出:

ci iA r1 r2 r3
1  1  1  1  49694764491115752
2  2  2  2  11570520
3  3  3  3  0
4  4  4  4  0
5  5  5  5  0
Run Code Online (Sandbox Code Playgroud)
  • TRec是包含我想要初始化的动态数组的记录类型.
  • ci是一个常数的整数数组.
  • ia是一个动态的整数数组.
  • r1,r2,r3是TRec类型的记录,它们以不同的方式初始化.

从输出中可以看出,前两个赋值(r1,r2),使用常量按预期工作.第三个赋值r3 := iArray被编译器接受,但结果被破坏了.调试器显示vin 的值TRec.Implicit已经错误.

这里出了什么问题?这有可能吗?

program Project5;

{$APPTYPE CONSOLE}

{$R *.res}

type
  TRec = record
    iArray: array of UInt64;
    class operator Implicit(const v: array of UInt64): TRec;
  end;

{ TRec }

class …
Run Code Online (Sandbox Code Playgroud)

arrays delphi initialization record dynamic

21
推荐指数
1
解决办法
916
查看次数

我可以将一个集合传递给DUnitX中的测试用例吗?

我正在尝试在运行测试后检查对象的状态.该状态包含在一组中.是否可以使用DUnitX属性将预期状态传递给测试用例,以便我可以对所有不同的输入使用相同的测试?

我试图将集合作为常量或集合传递,但在我的测试例程中,它总是以空集的形式到达.

  • 这有可能使用属性吗?
  • 你如何测试集合是否相同?

示例代码:

type
  TResult = (resOK,resWarn,resError);
  TResultSet = set of TResult;

const
  cErrWarn : TResultSet = [resWarn];

type
  [TestFixture]
  TMyTest = class(TBaseTest)
    [Test]
    [TestCase('Demo1','InputA,[resWarn]')] // <-- tried as a set
    [TestCase('Demo2','InputB,cErrWarn')]  // <-- tried as a constant

    procedure Test(Input:string; ExpectedResult: TResultSet);
  end;

procedure TMyTest.Test(Input:string; ExpectedResult: TResultSet);
begin
  // ExpectedResult is always the empty set []
  RunTests(MyObject(Input));
  Assert.AreEqual(ExpectedResult, MyObject.ResultSet);
end;
Run Code Online (Sandbox Code Playgroud)

我还试图将Expected结果定义为数组,但是DUnitX甚至不再调用测试.可能那只是"太多"

    procedure Test(Input:string; ExpectedResult: array of TResult);
Run Code Online (Sandbox Code Playgroud)

到目前为止我能想出的最好的方法是使用以下方法.获取最多三个样本(在此处插入您喜欢的整数...)预期状态并单独检查这些状态.这并不是我所希望的,但它确实可以解决问题.

    procedure Test(Input:string; R1,R2,R3: TResult);
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助.:)

delphi unit-testing dunitx

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

Delphi XE8在应用程序启动时正常处理ETetheringException

Delphi应用程序网络共享管理器保留2020-2039范围内的20个端口,以启动其通信线程.我想知道当第21个应用程序在同一台计算机上启动时会发生什么.事实证明,这个应用程序只是挂起无响应,直到它被杀死,我还没有找到一种方法来优雅地终止它.

要重现,只需将TTetheringManager和TTetheringProfile放在空表单上,将配置文件连接到Manager,编译,在IDE外部启动应用程序20次,最后在IDE中启动第21个实例.

这是我到目前为止所发现的:

System.Tether.NetworkAdapter:procedure TTetheringNetworkManagerCommunicationThread.Execute ; 一个ETetheringException.Create(SManagerNetworkCreation)时,无论是TCP或UDP的通信服务器不能启动被升高.到现在为止还挺好.

此异常显示在调试器中.当我继续并逐步执行以下代码时,应用程序最终挂起在System:function AcquireExceptionObject中,并且永远不会返回.

由于在Application.Run期间引发了应用程序,我试图通过以下方式捕获异常:

try
  Application.Run;
except
  ShowMessage('Something went terribly wrong!');
end;
Run Code Online (Sandbox Code Playgroud)

但这没用.有关我如何捕获(或阻止)此异常的任何建议?

delphi exception tethering delphi-xe8

8
推荐指数
1
解决办法
514
查看次数