3

我已经下载了开源的 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 文件时,应用程序启动正常。

我在网上查了一下,有一个关于这些奇怪问题的询问,不幸的是它还没有解决。

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

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

4

2 回答 2

5

该错误似乎在 TTwainIdentity.GetGroups 中,结果未初始化。您可以尝试通过替换来更改代码

Include(Result, tgControl);

Result := [tgControl]; 

您必须重新编译包以使此更改在 IDE 中起作用。

于 2012-12-27T15:29:00.827 回答
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 时会缺少一些检查。:)

于 2012-12-27T15:33:59.287 回答