我编写了一组通过已发布的接口属性相互链接的组件.它们已注册并安装在设计包中.
使用已发布的接口属性在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) 我是开发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?
我正在使用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.
我使用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)
所以它似乎解决了这个代码应该重构.但这不是这个问题的范围.
背景 我在一个由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吗?
编辑:关于手动测试的当前测试方法只是"敲打它并尝试打破它" 克里斯称之为.
我承认我几乎没有单元测试经验.我刚才尝试使用DUnit,但放弃了,因为我的应用程序中的类之间存在很多依赖关系.它是一个相当大的(大约150万个源代码行)Delphi应用程序,我们是一个维护它的团队.
现在的测试是由一个人在发布之前使用它并报告错误.我还在TestComplete 6中设置了一些GUI测试,但由于应用程序的更改,它经常失败.
Bold for Delphi用作数据库的持久性框架.我们都同意单元测试是要走的路,我们计划在DotNet中编写一个新的应用程序,ECO作为持久性框架.
我只是不知道从哪里开始进行单元测试...任何好书,网址,最佳实践等?
我是一个团队中的成员,该团队维护着一个非常大的内部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++.
对此有何评论和建议?
我对用于在列表中存储对象的内容感到有点困惑.到目前为止,我已经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仅用于项目类或我可以存储记录?
我们是一个使用Gnostice和RaveReports使用D2007查看,打印,邮寄和生成报告PDF的团队.D2009在路线图中,但由于Gnostice不支持D2009,我们必须等待.在过去,报告是在代码中完成的,然后查看,打印等.现在我们已经开始评估Ravereports设计师,并用它来报告.
但现在我们犹豫不决.Nevrona似乎或多或少死了.我们还没有设法购买Ravereports的来源和webmaster@nevrona.com反弹.嗯......它们是Delphi的默认组件......
还有其他报告解决方案,如数字隐喻和快速报告.我毫不怀疑他们既善良又干练,但我们必须做点什么.有人知道Codegear是否因为某些麻烦而放弃了Ravereports?
关于数字隐喻和快速报告的评论表示赞赏.我们需要一个好的报表组件,可以使用代码和设计时间构建报表.报告文件应保存为文本,xml与rave-files不同.设置默认打印机的简单方法很不错,因为我们使用的Citrix环境有时会因此而失败.
delphi ×9
delphi-2007 ×5
bold-delphi ×2
dunit ×2
unit-testing ×2
design-time ×1
google-maps ×1
ide ×1
interface ×1
orm ×1
report ×1
sql ×1
sql-server ×1
tlist ×1
twebbrowser ×1
win64 ×1