TDelphiTwain组件,破坏delphi表单(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

我已经下载了开源的DelphiTwain组件(TDelphiTwain)。 有趣的是,当放置并保存在表单上时,它会为自己创建错误的dfm条目

  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将结果初始化为
,但事实并非如此。