小编Del*_*ser的帖子

DUnit GUI测试:我可以强制"应用"到不同的"形式"吗?

我正在尝试使用DUnit对一个应用程序进行GUI单元测试,该应用程序的mainform动态地为自己创建帧.我已经能够在测试用例中创建应用程序到测试的mainform作为表单并访问其菜单项等.

当应用程序尝试动态创建框架时,问题就出现了.框架的资源读取到了需要窗口句柄的位置(在我的例子中,设置标签页的标题).它从TWinControl.GetHandle到TWinControl.CreateWnd和TCustomFrame.CreateParams.

在这个CreateParams中,代码说:

  if Parent = nil then
    Params.WndParent := Application.Handle;
Run Code Online (Sandbox Code Playgroud)

这就是差异发生的地方.当我运行实际的应用程序(不在测试中)时,Application.Handle返回一个非零数字,流程继续正常.但是在DUnit测试应用程序中,Application.Handle在这里返回0.这会导致TWinControl.CreateWnd中的代码引发异常,告知该帧没有父代:

  with Params do
  begin
    if (WndParent = 0) and (Style and WS_CHILD <> 0) then
      if (Owner <> nil) and (csReading in Owner.ComponentState) and
        (Owner is TWinControl) then
        WndParent := TWinControl(Owner).Handle
      else
        raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);
Run Code Online (Sandbox Code Playgroud)

我想尝试解决这个问题(一般来说,所有测试问题)而不是仅仅因为测试而修改"生产"代码.您是否可以提供任何关于我是否可以某种方式强制将"应用程序"强加给其他东西,或以其他方式解决此问题的线索?

查看代码,一个可能的其他解决方案可能是尝试让所有者(我的应用程序测试的"MainForm",即我想要获得的句柄)在执行时处于csReading状态这个框架在测试中创建,但至少最初看起来并不是那么简单.

delphi user-interface dunit

6
推荐指数
1
解决办法
895
查看次数

(如何)我可以将FutureWindows与标准文件打开对话框一起使用吗?

我一直在尝试使用tomazy的FutureWindows基础设施(请参阅他在Delphi GUI测试和模态表单中的答案或https://github.com/tomazy/DelphiUtils上的工具的主页),但是想知道是否以及如何能够它可以与标准的Windows文件打开对话框一起使用吗?他们似乎没有继承TControl,FutureWindows的基础设施似乎假设(除非我误解了它).

我想做的基本上只是在OpenFileDialog中选择一个文件,该文件在我的测试中由命令以模态方式打开,但还没有弄清楚如何做到这一点.

delphi user-interface dunit

5
推荐指数
1
解决办法
485
查看次数

为什么Delphi XE3给出"E2382无法使用实例变量调用构造函数"?

我有一段简单的代码,在Delphi XE2中编译但在XE3中编译,我不知道为什么.我已经将有问题的代码减少到一点点,并且想知道Delphi认为它有什么问题.尝试在Delphi XE 2中编译包含此单元的项目工作正常,但在Delphi XE3(试用版)中,它给出了"[dcc32 Error] AffineTransform.pas(26):E2382无法使用实例变量调用构造函数".我所知道的唯一"古怪"的东西是使用旧式的"对象"类型,其中构造函数与真实对象(基于TObject的类实例)实际上并不完全相同.

如果我用'procedure'替换这个对象中的'constructor',那么它编译好了,但是为什么这样,这是我的代码中的一个好的改变,即它是一个不会对功能?

unit AffineTransform;

interface

type
  { Rectangular area. }
  TCoordRect = object
  public
    Left, Top, Right, Bottom: Real;
    constructor CreatePos(ALeft, ATop, ARight, ABottom: Real);
    procedure   Include(AX, AY: Real);
  end;

implementation

constructor TCoordRect.CreatePos(ALeft, ATop, ARight, ABottom: Real);
begin
  Left := ALeft;
  Top := ATop;
  Right := ARight;
  Bottom := ABottom;
end;

procedure TCoordRect.Include(AX, AY: Real);
begin
  CreatePos(AX, AY, AX, AY)
end;

end.
Run Code Online (Sandbox Code Playgroud)

delphi constructor object

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

标签 统计

delphi ×3

dunit ×2

user-interface ×2

constructor ×1

object ×1