我已经下载了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文件时,应用程序就开始运行了。
我查了一下互联网,有一个询问这个奇怪的问题,不幸的是它还没有解决。
我认为存在某种内存损坏。在互联网上的帖子中,显示了奇怪的迹象......
有没有人使用过这个组件,或者可以给我一些暗示如何解决这个问题?
答案 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的相当一些检查都会丢失。 :)