TDelphiTwain组件,破坏delphi表单(dfm文件)
我已经下载了开源的DelphiTwain组件(TDelphiTwain)。 有趣的是,当放置并保存在表单上时,它会为自己创建错误的dfm条目TDelphiTwain组件,破坏delphi表单(dfm文件),delphi,delphi-7,twain,Delphi,Delphi 7,Twain,我已经下载了开源的DelphiTwain组件(TDelphiTwain)。 有趣的是,当放置并保存在表单上时,它会为自己创建错误的dfm条目 object DelphiTwain: TDelphiTwain OnSourceDisable = DelphiTwainSourceDisable OnSourceSetupFileXfer = DelphiTwainSourceSetupFileXfer TransferMode = ttmMemory Sourc
object DelphiTwain: TDelphiTwain
OnSourceDisable = DelphiTwainSourceDisable
OnSourceSetupFileXfer = DelphiTwainSourceSetupFileXfer
TransferMode = ttmMemory
SourceCount = 0
Info.MajorVersion = 1
Info.MinorVersion = 0
Info.Language = tlDanish
Info.CountryCode = 1
Info.Groups = [tgControl, tgImage, tgAudio, MinorVersion]
Info.VersionInfo = 'Application name'
Info.Manufacturer = 'Application manufacturer'
Info.ProductFamily = 'App product family'
Info.ProductName = 'App product name'
LibraryLoaded = False
SourceManagerLoaded = False
Left = 520
Top = 136
end
问题在于线路:
Info.Groups = [tgControl, tgImage, tgAudio, MinorVersion]
只有三个可能的要素:
tgControl, tgImage and tgAudio
每次我保存表单时,它都会添加MinorVersion。
当应用程序运行时,我得到一个错误,即Info.Groups的属性无效。
当我手动移除坏零件并且不离开dfm文件时,应用程序启动正常
我在网上查了一下,有一个关于这些奇怪问题的询问,不幸的是,它还没有得到解决
我认为存在某种内存损坏。在互联网上的帖子里,奇怪的标志被显示出来
是否有人使用过该组件,或者可以给我一些提示如何解决此问题?错误似乎出现在结果未初始化的TTwainIdentity.GetGroups中。您可以尝试通过替换来更改代码
Include(Result, tgControl);
与
您必须重新编译包才能在IDE中进行此更改。我不知道组件,但我认为问题在于TTwainIdentity.GetGroups方法。它是这样开始的:
begin
Include(Result, tgControl);
function TTwainIdentity.GetGroups(): TTwainGroups;
{Convert from Structure.SupportedGroups to TTwainGroups}
begin
Result := [tgControl];
if DG_IMAGE AND Structure.SupportedGroups <> 0 then
Include(Result, tgImage);
if DG_AUDIO AND Structure.SupportedGroups <> 0 then
Include(Result, tgAudio);
end;
这意味着它假设结果被初始化为一个空集。然而,结果可能包含垃圾,而不一定是空集。将此方法更改为如下所示:
begin
Include(Result, tgControl);
function TTwainIdentity.GetGroups(): TTwainGroups;
{Convert from Structure.SupportedGroups to TTwainGroups}
begin
Result := [tgControl];
if DG_IMAGE AND Structure.SupportedGroups <> 0 then
Include(Result, tgImage);
if DG_AUDIO AND Structure.SupportedGroups <> 0 then
Include(Result, tgAudio);
end;
函数TTwainIdentity.GetGroups():ttwainigroups;
{从Structure.SupportedGroups转换为ttwainggroups}
开始
结果:=[tgControl];
如果DG_IMAGE AND Structure.SupportedGroups为0,则
包括(结果、图像);
如果DG_AUDIO AND Structure.SupportedGroup为0,则
包括(结果,tgAudio);
结束;
某些结果类型不会引发编译器关于未初始化的警告,但这并不意味着它们是空的。例如,字符串也是如此。
另见:
但是,这种情况发生还是很奇怪的。显然,Delphi试图在集合中查找给定项的名称,却意外地找到了另一个属性的名称。在我看来,如果发生这种情况,dfm中的许多书面检查就会丢失。:) 你有其他查询的链接吗?或者更好的是,
Result:=[];如果DG_CONTROL和Structure.SupportedGroups为0,则包括(Result,tgControl)
(对于集合组
),它解决了这个问题。我勾选你的答案,因为你是第一个。谢谢“在我看来,如果发生这种情况,编写dfm时会丢失很多检查:”--Delphi假定但不检查属性的值是否是属性类型的有效值,可能是因为在一般情况下,它无法检查。如果读取字符串属性会给您提供string(-1)
,则在保存时看到访问冲突不会让您感到意外,是吗?:)您可以轻松地在集合中设置集合所基于的枚举中不存在的项。一个集合毕竟只是一个序数。我不知道Delphi在编写dfm文件时是否能够正确地检查这一点,也许它不是检查它的正确位置。但同样奇怪的是,集合的结果变量没有初始化,并且在默认情况下可能包含无效值,而编译器不会抱怨。这本身并不是一个错误,但有一些松散的结尾,这显然造成了一个容易的陷阱。除非你真的努力,否则字符串不会是-1。:)<代码>结果是局部变量,局部变量未初始化。这意味着Result
最初指向随机内存内容,这显然是造成问题的原因。引用的代码行基本上是这样写的:“将随机内存放在结果
指向的任何地方,将其视为tWaingGroups
集,并将tgControl
值包含在其中”。+1,顺便说一句。您的答案将完全解决问题,因为它正确地初始化了结果
:-)@肯怀特:谢谢!出现这种错误的原因是某些类型被初始化,例如数组和接口。其他类型则不是,但通常会生成编译器警告。还有第三种没有初始化,也不会产生警告。字符串是这种类型最常见的示例。许多人认为Delphi将结果初始化为”
,但事实并非如此。