小编Rol*_*son的帖子

已发布的界面属性错误和变通方法

我编写了一组通过已发布的接口属性相互链接的组件.它们已注册并安装在设计包中.

使用已发布的接口属性在Delphi中并不常见,因此,不出所料,似乎效果不佳.

当组件驻留在同一表单上时,它工作正常,但不同表单上的组件之间的接口属性链接会导致问题.

与指向另一个表单上的组件的对象链接不同,IDE似乎无法识别接口链接.我的意思最好用一个例子来描述,当你在IDE中打开2个表单,并在它们之间有组件之间的链接,然后尝试切换到表单视图时,文本(Alt + F12)将导致IDE正确地抱怨:

Module 'UnitXXX.pas' has open descendents or linked modules. Cannot close.

但是如果属性是一个接口,那么这不会发生,而是发生的事情是链接被切断(当你使用Notification机制清除引用时这是最好的情况,否则你会留下无效的指针)

另一个问题,可能是同一个错误的结果是,当您在IDE中打开项目时,表单将重新打开的顺序是未定义的,因此IDE可以尝试打开包含具有到组件的接口链接的组件的表单另一种形式,但其他形式尚未重新创建.因此,这有效地导致AV或切断链接.

早在90年代,我使用时Datasets,Datasources我记得表格之间的链接消失的类似问题,所以这有点类似.

作为临时解决方法,我添加了重复的已发布属性,对于每个Interface属性,我添加了另一个声明为的属性TComponent.这使得Delphi意识到表单之间存在联系,但至少可以说这是一个丑陋的解决方法.

所以我想知道我能做些什么来解决这个问题?这是一个IDE错误,可能无法直接修复,但也许我可以覆盖某些内容或以其他方式挂接到流机制,以更有效地解决此错误.

我从未如此深入到流机制,但我怀疑Fixup机制应该处理这个问题.有一个,csFixups TComponentState所以我希望可以解决方法.

编辑:使用D2007.

更新:

上传到http://www.filedropper.com/fixupbugproject2的新更新的可重现示例

添加后property ComponentReference: TComponent,可以轻松比较和跟踪界面与组件流.

我将问题缩小到汇编级别,这有点超出我的深度.

在单位的程序GlobalFixupReferences中,classes它调用:

(GetOrdProp(FInstance, FPropInfo) <> 0)

最终执行:

function TInterfacedComponent.GetInterfaceReference: IInterface;
begin
// uncomment the code bellow to avoid exception
{  if (csLoading in ComponentState) and (FInterfaceReference = nil) then
  // leave result unassigned …
Run Code Online (Sandbox Code Playgroud)

ide delphi design-time interface delphi-2007

44
推荐指数
1
解决办法
1039
查看次数

ORM for DELPHI win32

有没有人知道ORM或类似的Delphi Win32.

delphi orm bold-delphi

32
推荐指数
6
解决办法
2万
查看次数

为什么在64位Windows中运行时2 GB内存限制?

我是开发Delphi应用程序的团队的成员.内存需求量很大.500 MB是正常的,但在某些情况下它会出现内存异常.在这种情况下分配的内存通常在1000 - 1700 MB之间.

我们当然需要64位编译器,但现在不会发生(如果它发生,我们也必须转换为unicode,但这是另一个故事......).

我的问题是为什么在64位环境中运行时每个进程有2 GB的内存限制.指针是32位,所以我认为4 GB是正确的限制.我使用Delphi 2007.

编辑: 所以如果我使用以下方法在Delphi中设置IMAGE_FILE_LARGE_ADDRESS_AWARE标志:

{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Run Code Online (Sandbox Code Playgroud)

并在Windows Server 2003 x64上运行生成的Exe文件,然后该应用程序可以处理4 GB?

  • 我应该在boot.ini中设置/ 3GB开关吗?
  • 我们尝试了这个但是在32位Windows Server 2003上它似乎限制了Windows资源.在日志中使用GDIError的"Out of memory"有更多例外.但是在64位操作系统中运行时可能会消失吗?

delphi win64 delphi-2007

31
推荐指数
3
解决办法
1万
查看次数

Try_Convert for SQL Server 2008 R2

我正在使用SQL Server 2008 R2并且有一个VARCHAR我想要转换为DECIMAL(28,10)使用的列CONVERT.但是其中许多行格式错误,因此无法将它们解析为数字.在这种情况下,我只想通过将结果设置为0或NULL来跳过这些.

我知道SQL Server 2012(TRY_CONVERT())中有一个新的语句会很方便.

这可能是在2008年还是我必须等到我们更新到下一个版本的SQL 2012?

编辑

不幸的ISNUMERIC()是,在这种情况下不可靠.我试过了

ISNUMERIC(myCol) = 1
Run Code Online (Sandbox Code Playgroud)

对于CONVERT无法转换为的行,返回true DECIMAL.

sql sql-server sql-server-2008 sql-server-2012

31
推荐指数
5
解决办法
3万
查看次数

在一个单独的线程中更新TWebBrowser?

我使用TWebBrowser来显示Google地图.问题是它在加载地图时会阻塞主ui线程.是否可以在单独的线程中更新地图?

编辑: RRUZ你是对的TWebBrowser有URL的异步加载.但是我发现了阻止呼叫的问题:

if WaitWhileProcessing and (MapQueryResult.Count > 0) then 
  Result := MapQueryResult[0] as TMapQuery;
Run Code Online (Sandbox Code Playgroud)

和方法:

function TMapItemCollection.WaitWhileProcessing: Boolean;
var
  vMaxSleepCnt: Integer;
begin
  Result := True;
  vMaxSleepCnt := 0;
  while Processing or Loading do
  begin
    inc(vMaxSleepCnt);
    Application.ProcessMessages;
    Sleep(100);
    if vMaxSleepCnt = 100 then
    begin
      Result := False;
      Break;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

所以它似乎解决了这个代码应该重构.但这不是这个问题的范围.

delphi multithreading delphi-2007 twebbrowser

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

当使用Bold编写Delphi框架时,提高可测试性

背景 我在一个由7名开发人员和2名测试人员组成的团队中工作,这些团队负责物流系统.我们使用Delphi 2007和模拟驱动开发与Bold for Delphi作为框架.该系统现已投入生产约7年,拥有约1,700万行代码.我们在4-5周后发布到生产,几乎每次发布后我们都要为我们没有找到的bug做一些补丁.这对我们和客户来说当然都很烦人.

当前测试 解决方案当然是更自动化的测试.目前我们有手动测试.一个Testdbgenerator,以空数据库开头,并从建模方法中添加数据.我们还有Testcomplete,它运行一些非常基本的脚本来测试GUI.缺乏时间阻止我们添加更多测试,但脚本对应用程序中的更改也很敏感.几年前我真的尝试用DUnit进行单元测试,但是几天后我放弃了.这些单位的联系太紧.

单元测试前提条件 我认为我知道单元测试的一些前提条件:

  • 编写做一件事的小方法,但做得好.
  • 不要重复自己.
  • 首先编写失败的测试,然后编写代码以便测试通过.
  • 单位之间的联系是松散的.他们对彼此不太了解.
  • 使用依赖注入.

使用的框架 我们可能会升级到Delphi XE2,主要是因为64位编译器.我看了一下Spring,但这需要D2007的更新,现在不会发生.或许明年.

问题 大多数代码仍然没有自动测试.那么提高旧代码可测试性的最佳途径是什么?或者也许最好只开始为新方法编写测试?我不确定增加自动测试的最佳方法是什么,欢迎提出意见.我们现在可以使用D2007 + DUnit,然后轻松更改为Delphi XE2 + Spring吗?

编辑:关于手动测试的当前测试方法只是"敲打它并尝试打破它" 克里斯称之为.

delphi unit-testing dunit delphi-2007 bold-delphi

19
推荐指数
1
解决办法
750
查看次数

如何开始单元测试新旧代码?

我承认我几乎没有单元测试经验.我刚才尝试使用DUnit,但放弃了,因为我的应用程序中的类之间存在很多依赖关系.它是一个相当大的(大约150万个源代码行)Delphi应用程序,我们是一个维护它的团队.

现在的测试是由一个人在发布之前使用它并报告错误.我还在TestComplete 6中设置了一些GUI测试,但由于应用程序的更改,它经常失败.

Bold for Delphi用作数据库的持久性框架.我们都同意单元测试是要走的路,我们计划在DotNet中编写一个新的应用程序,ECO作为持久性框架.

我只是不知道从哪里开始进行单元测试...任何好书,网址,最佳实践等?

delphi unit-testing dunit

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

从我的Delphi应用程序中使用Googlemap?

我是一个团队中的成员,该团队维护着一个非常大的内部Delphi应用程序.现在我们开始关注mapsupport.我们认为与某些地图组件相比,Googlemap似乎是最物有所值的.当前的解决方案(非常糟糕)通过从ShellExecute启动Internet Explorer,加载Googlemap URL中的一些坐标来工作.然后谷歌地图显示通过坐标驾驶的最佳方向.

它的工作原理,但如果坐标的数量高于10,它可能会很慢.除此之外,IE中似乎有很大的内容......

另一个选择是使用TWebBrowser组件,并加载一个Googlemap html文件来显示相同​​的内容.是的我知道Googlemaps许可政策,我们准备在实际使用解决方案时向Google支付价格.

现在我已经为我自己的网站注册了一个API密钥,仅供测试.我还发现它可以加载本地html文件.从Javascript我可以根据Googlemap文档调用GUnload来消除memleaks.由于API密钥绑定到域或本地文件,我想我必须保存带坐标的javascript文件,然后在每次调用地图时将其加载到TWebBrowser中.我发现这很笨拙,但我没有别的办法......?

还有其他选项可以使用Google地图吗?由于糟糕的性能和内存管理,我不知道Delphi的其他html组件而不是TWebBrowser.我想使用Mozilla组件,但它似乎只适用于C++.

对此有何评论和建议?

delphi internet-explorer google-maps

15
推荐指数
2
解决办法
2万
查看次数

清除TList或TObjectList

我对用于在列表中存储对象的内容感到有点困惑.到目前为止,我已经TList在循环中使用和释放了每个项目.然后我发现TObjectList自动执行此操作Free.然后我从以下文档中看到了这个TList.Clear:

调用Clear清空Items数组并将其设置Count为0. Clear还释放用于存储Items数组的内存并将其设置Capacity为0.

所以它基本相同.所以

对于 TList

mylist.Clear;
myList.Free;
Run Code Online (Sandbox Code Playgroud)

是一样的TObjectList吗?

myList.Free;
Run Code Online (Sandbox Code Playgroud)

TObjectList仅用于项目类或我可以存储记录?

delphi delphi-2007 tlist

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

Delphi最好的报告组件?

我们是一个使用Gnostice和RaveReports使用D2007查看,打印,邮寄和生成报告PDF的团队.D2009在路线图中,但由于Gnostice不支持D2009,我们必须等待.在过去,报告是在代码中完成的,然后查看,打印等.现在我们已经开始评估Ravereports设计师,并用它来报告.

但现在我们犹豫不决.Nevrona似乎或多或少死了.我们还没有设法购买Ravereports的来源和webmaster@nevrona.com反弹.嗯......它们是Delphi的默认组件......

还有其他报告解决方案,如数字隐喻快速报告.我毫不怀疑他们既善良又干练,但我们必须做点什么.有人知道Codegear是否因为某些麻烦而放弃了Ravereports?

关于数字隐喻快速报告的评论表示赞赏.我们需要一个好的报表组件,可以使用代码和设计时间构建报表.报告文件应保存为文本,xml与rave-files不同.设置默认打印机的简单方法很不错,因为我们使用的Citrix环境有时会因此而失败.

delphi report

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