TDelphiTwain组件,破坏delphi格式(dfm文件)

时间:2012-12-27 14:57:05

标签: delphi delphi-7 twain

我已经下载了opensource delphi twain组件(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文件时,应用程序就开始运行了。

我查了一下互联网,有一个询问这个奇怪的问题,不幸的是它还没有解决。

我认为存在某种内存损坏。在互联网上的帖子中,显示了奇怪的迹象......

有没有人使用过这个组件,或者可以给我一些暗示如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

错误似乎在TTwainIdentity.GetGroups中,其中结果未初始化。您可以尝试通过替换

来更改代码
Include(Result, tgControl);

Result := [tgControl]; 

您必须重新编译程序包才能在IDE中进行此更改。

答案 1 :(得分:4)

我不知道该组件,但我认为问题在于TTwainIdentity.GetGroups方法。它是这样开始的:

begin
  Include(Result, tgControl);

这意味着它假定Result初始化为空集。但是,Result可能包含垃圾,而不一定是空集。将此方法更改为如下所示:

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;

某些结果类型不会抛出有关未初始化的编译器警告,但这并不意味着它们是空的。例如,对于字符串也是如此。 另见:http://qc.embarcadero.com/wc/qcmain.aspx?d=894

但是,这种情况很奇怪。显然,Delphi试图在集合中找到给定项目的名称,并意外地找到另一个属性的名称。在我看来,如果发生这种情况,写入dfm的相当一些检查都会丢失。 :)