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]

考えられる要素は次の 3 つだけです。

tgControl, tgImage and tgAudio

フォームを保存するたびに MinorVersion が追加されます。アプリを実行すると、Info.Groups に無効なプロパティがあるというエラーが表示されます。dfmファイルを残さずに悪い部分を手動で削除すると、アプリは正常に起動します。

インターネットで調べたところ、これらの奇妙な問題に関する問い合わせが 1 件ありましたが、残念ながら解決されていません。

ある種のメモリ破損があると思います。インターネットの投稿では、奇妙な兆候が表示されていました...

誰かがそのコンポーネントで作業したことがありますか、またはこれを修正する方法のヒントを教えてくれますか?

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 にはガベージが含まれている可能性があり、必ずしも空のセットであるとは限りません。このメソッドを次のように変更します。

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 に答える