小编Rol*_*son的帖子

为什么TestComplete这么慢?

我们正在使用AQTime的TestComplete来测试客户端的GUI和我们的客户端/服务器应用程序.它是使用Delphi 2007编译的.客户端源大约有140万个源代码.硬件是采用Windows XP Pro的Intel双核2.13 Mhz,2 GB RAM.

我使用所有调试选项编译应用程序,并且还链接到TCOpenApp,tcOpenAppClasses,tcPublicInfo,tcDUnitSupport,如文档中所述,以使其成为Open Application.生成的exe文件大约为50 MB.

现在,当运行testscript并且它工作,但运行非常慢.CPU运行速度为100%,由于速度慢,更改测试脚本有点令人沮丧.我已经关闭所有桌面效果,如圆角窗口.没有桌面背景.

其他任何有相同经验甚至解决方案的人?

delphi testcomplete gui-testing

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

在Delphi中检测VMT或堆损坏的正确工具是什么?

我是一个使用Delphi 2007用于更大应用程序的团队的成员,我们怀疑堆损坏,因为有时会有奇怪的错误,没有其他解释.我相信编译器的Rangechecking选项仅适用于数组.我想要一个工具,当存储器地址没有被应用程序分配时,它会发出异常或日志.

问候

编辑:错误类型:

错误:模块"BoatLogisticsAMCAttracsServer.exe"中地址00404E78处的访问冲突.读取地址FFFFFFDD

EDIT2:感谢所有建议.不幸的是,我认为解决方案比这更深.我们使用补丁版本的Bold for Delphi,因为我们拥有源代码.可能在Bold框架中引入了一些错误.是的,我们有一个带有由JCL处理的callstack的日志以及跟踪消息.所以带异常的callstack可以像这样锁定:

20091210 16:02:29 (2356) [EXCEPTION] Raised EBold: Failed to derive ServerSession.mayDropSession: Boolean
OCL expression: not active and not idle and timeout and (ApplicationKernel.allinstances->first.CurrentSession <> self)
Error: Access violation at address 00404E78 in module 'BoatLogisticsAMCAttracsServer.exe'. Read of address FFFFFFDD. At Location BoldSystem.TBoldMember.CalculateDerivedMemberWithExpression (BoldSystem.pas:4016)

Inner Exception Raised EBold: Failed to derive ServerSession.mayDropSession: Boolean
OCL expression: not active and not idle and timeout and (ApplicationKernel.allinstances->first.CurrentSession <> self)
Error: Access violation at address 00404E78 in …
Run Code Online (Sandbox Code Playgroud)

delphi heap memory-corruption vmt bold-delphi

5
推荐指数
2
解决办法
2361
查看次数

如何避免两次调用Application.CreateForm?

我偶然发现了这个页面为什么我不应该调用Application.CreateForm.现在我有一些像这样的代码:

SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
SplashForm.Update; // force update
Application.Initialize;
Application.CreateForm(TClientData, ClientData);
SplashForm.Update; // force update
Application.CreateForm(TClientMainForm, ClientMainForm);
Application.ShowHint := True;

Application.Run;
ClientMainForm.ServerConnected := false;
FreeAndNil(ClientMainForm);
FreeAndNil(ClientData);
Run Code Online (Sandbox Code Playgroud)

首先创建一个splashform,然后创建一个datamodule并持续主窗体.页面说不应该调用Application.CreateForm两次.上面的代码应该改变吗?

delphi delphi-2007

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

如何在不使用引发异常的情况下使用JCL记录callstack

背景

我们遇到一个问题,有时Devexpress中的网格会引发异常"引发的EConvertError:无法为TFont分配nil".

但是为了追踪这个的真正原因,我们已经将cxEdit中的Font更改为公共属性,而不是使用get和set方法.在这里,我想记录callstack.

我的问题

通常,JCL用于在出现异常时记录callstack.但是,如何在不使用raise异常的情况下记录callstack并为用户显示关于此的对话框?

我找到了这些台词:

var
  GlobalStackList: TJclGlobalStackList;
Run Code Online (Sandbox Code Playgroud)

在JclDebug但我没有使用它.如果有人有一个例子如何获得callstack我会很高兴.

关心Roland Bengtsson

delphi callstack jedi-code-library

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

Delphi VCL中的Bug拖放?

我使用Delphi 2007编译的应用程序在网格之间拖放,并且它在大多数情况下都能正常工作.但有时我会随机获得Access违规.我在VCL中将它调试为Controls.pas方法DragTo.

它开始是这样的:

begin
  if (ActiveDrag <> dopNone) or (Abs(DragStartPos.X - Pos.X) >= DragThreshold) or
    (Abs(DragStartPos.Y - Pos.Y) >= DragThreshold) then
  begin
    Target := DragFindTarget(Pos, TargetHandle, DragControl.DragKind, DragControl);
Run Code Online (Sandbox Code Playgroud)

异常发生在最后一行,因为DragControl为零.DragControl是TControl类型的全局变量.我尝试使用assigncheck修补此方法,如果DragControl = nil则调用CancelDrag,但这也失败,因为DragObject也是nil.

procedure CancelDrag;
begin
 if DragObject <> nil then DragDone(False);
 DragControl := nil;
end;
Run Code Online (Sandbox Code Playgroud)

为了找出为什么DragControl为零,我检查了DragInitControl.如果DragControl为零,则有两行刚刚退出.

procedure DragInitControl(Control: TControl; Immediate: Boolean; Threshold: Integer);
var
  DragObject: TDragObject;
  StartPos: TPoint;
begin
  DragControl := Control;
  try
    DragObject := nil;
    DragInternalObject := False;    
    if Control.FDragKind = dkDrag then
    begin
      Control.DoStartDrag(DragObject);
      if DragControl = nil then …
Run Code Online (Sandbox Code Playgroud)

delphi drag-and-drop delphi-2007 bold-delphi

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

VCL for Delphi中的命名空间兼容性

如何在Delphi 7到Delphi XE7之间的使用中最好地保持名称空间的兼容性?

Delphi 7使用SysUtils而Delphi XE7使用System.SysUtils.

它使用许多ifdef使代码混乱很多,所以我想尽可能避免使用它.

delphi delphi-7 delphi-xe6

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

在TFrame里面的EventHandler?

我有一个TForm(TVehicleEditForm)里面有3个相同的TFrames(TVehicleUnitFrame).

这个想法是框架的每个实例都通过框架eventhandler内部处理自己的事件.问题是eventhandler没有调用.

我试图eventhandler通过覆盖Create方法在框架内分配by代码,但在这种情况下也不会调用处理程序.

但是如果我eventhandler从表单中指定框架外部它可以正常工作.像这样:

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick;
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick;
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick;
Run Code Online (Sandbox Code Playgroud)

这只适用于一个按钮!因为我在框架内有许多组件,这将导致许多分配...当这应该直接在对象检查器中完成时,相当丑陋的代码.

我正在使用D2007.对原因有什么看法?

关心罗兰

delphi event-handling delphi-2007 tframe

4
推荐指数
1
解决办法
2096
查看次数

如何清洗/验证字符串以将其分配给组件名称?

我有一个列出部门的子菜单.在这个背后,每个部门都有一个名为"actPlan"+ department.name的行动.

现在我意识到这是一个坏主意,因为名称可以包含世界上任何奇怪的字符,但action.name不能包含国际字符.显然Delphi IDE本身调用一些方法来验证字符串是否是有效的组件名.谁知道更多关于这个?

我也有一个想法

Action.name := 'actPlan' + department.departmentID;
Run Code Online (Sandbox Code Playgroud)

代替.优点是departmentID是一种已知格式,'xxxxx-x'(其中x是1-9),所以我只需要用例如下划线替换' - '.这里的问题是那些旧的动作名已经存在于个人文本文件中.如果我突然从使用部门名称更改为ID,那将是例外.

我当然可以第一次吃掉异常然后调用一个方法来搜索用正确的数据替换该文本文件并重新加载它.

所以基本上我搜索最优雅和未来的方法来解决这个问题:)我使用D2007.

delphi

4
推荐指数
2
解决办法
3057
查看次数

如何记录源代码行导致异常并添加自定义信息?

我们的应用程序使用JCL记录导致异常的源代码行,并且它运行良好.我用的是D2007.我有一个执行实际日志记录的TApplicationEvents.OnException事件.考虑一下:

function MyFunc: String;
begin
  // Codelines that may raise exception.
  // Call functions that also may raise exception  
end;

procedure ComplexFunc(aVariable: String);
begin
  // also here can it be exceptions....
  // Code here that is the cause of exception
end;

procedure foo;
var
  myVar: String;
begin
  myvar := MyFunc;
  ComplexFunc(myvar);  
end;

procedure TMainForm.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
  LogLastException(E, 'Unhandled Exception (%s)', [E.Message], 20);
end;
Run Code Online (Sandbox Code Playgroud)

我有3个方法和我的onException事件.LogLastException在发生异常时记录callstack.问题是我无法在没有松散导致异常的源代码的情况下向E.Message添加信息.假设它是ComplexFunc中引发异常的第二行.我还想记录myvar变量的值.所以我将代码更改为:

function MyFunc: String;
begin
  // Codelines that may raise exception.
  // Call functions that …
Run Code Online (Sandbox Code Playgroud)

delphi exception-handling delphi-2007

4
推荐指数
1
解决办法
1229
查看次数

从functionpointer获取functionname?

我有一个指向这样的函数的指针.

TTestEvent = function(): Boolean;

procedure ExecuteTest(aTest: TTestEvent; aType: String);
begin
  if aTest then
    NotifyLog(aType + ' success')
  else
    TestError(aType + ' failed');
end;

// Call the test
procedure TestAll;
begin
  ExecuteTest(LoadParcels, 'LoadParcel');
end;
Run Code Online (Sandbox Code Playgroud)

但是从functionpointer aTest中提取函数的名称会更好.

而不是

aType + ' success'
Run Code Online (Sandbox Code Playgroud)

我想要类似的东西

ExtractName(aTest) + ' success'
Run Code Online (Sandbox Code Playgroud)

这可以在Delphi 2007中完成吗?

delphi function-pointers delphi-2007

4
推荐指数
1
解决办法
511
查看次数