1

http://delphitwain.sourceforge.net/の DelphiTwain ファイルを使用すると、奇妙な動作が発生します。

  1. 各スキャンの後、もう少し多くのメモリが保持されます。
  2. 約 1 時間の繰り返しスキャンの後、スキャンされた画像は約 10 倍に拡大され、左上の平方インチだけが保存されます。

誰かが同様の問題を抱えていましたか、またはいくつかの提案がありますか?

以下のコード...

try
  try
    Twain := TDelphiTwain.Create(self);

    Twain.OnTwainAcquire := TwainAcquireHandler; //manually set the event handler
    Twain.OnSourceFileTransfer := TwainSourceFileTransfer;
    Twain.OnSourceSetupFileXfer := TwainSourceSetupFileXfer;

    Twain.LoadLibrary;
    Twain.LoadSourceManager;
    Twain.Source[0].Loaded := TRUE;
    Twain.Source[0].TransferMode := ttmFile;
    Twain.Source[0].EnableSource(false, false);
  except on e : exception do
    showmessage('Error loading Scanner.');
  end;

  try
    while Twain.Source[0].Enabled do
      Application.ProcessMessages;
  except on e : exception do
    showmessage('Error Scanning Packing List.');
  end;
finally
  Twain.Source[0].Loaded := FALSE;
  Twain.UnloadSourceManager(true);
  Twain.UnloadLibrary;
  Twain.Destroy;
end;
4

5 に答える 5

3

TDelphiTwain はコードで作成するコンポーネントのように見えるので、コンストラクターにnilを渡して .Free メソッドまたは (Joseph の提案によると) FreeAndNil を呼び出すことをお勧めします。

Twain := TDelphiTwain.Create(nil);
try
  try
    Twain.OnTwainAcquire := TwainAcquireHandler; //manually set the event handler
    Twain.OnSourceFileTransfer := TwainSourceFileTransfer;
    Twain.OnSourceSetupFileXfer := TwainSourceSetupFileXfer;

    Twain.LoadLibrary();
    Twain.LoadSourceManager();
    Twain.Source[0].Loaded := True;
    Twain.Source[0].TransferMode := ttmFile;
    Twain.Source[0].EnableSource(False, False);
  except on e : exception do
    showmessage('Error loading Scanner.');
  end;

  try
    while Twain.Source[0].Enabled do
      Application.ProcessMessages;
  except on e : exception do
    showmessage('Error Scanning Packing List.');
  end;
  Twain.Source[0].Loaded := False;
  Twain.UnloadSourceManager(True);
  Twain.UnloadLibrary();
finally
  FreeAndNil(Twain);
end;

また、より良い例外処理をお勧めしますが、あなたが尋ねた質問とは関係ありません。ユーザーがあなた (またはさらに悪いことに、ユーザーから説明のないエラーを受け取るのが大好きな、IT サポートを担当する部屋の隅にいる物静かな男) が表示して報告する唯一のことは、「何かをしているときにエラーが発生しました」ということです。

幸運を

確認すべきもう 1 つの領域は、スキャナーが WIA (Windows Image Acquisition) をサポートしているかどうかです。

var
  DevMgr: IDeviceManager;
  Scanner: Idevice;
  Picture: IItem;
  Image: OleVariant;
  AImage: IImageFile;
begin
  DevMgr := CreateOleObject('WIA.DeviceManager') as IDeviceManager;

  // Figure out which device is the scanner
  Scanner:= DevMgr.DeviceInfos.Item[1].Connect;

  //Command: Figure out which command scans..
  Picture := Scanner.ExecuteCommand(Scanner.Commands.Item[1].CommandID);

  //Transfer as JPG
  Image := Picture.Transfer(Picture.Formats.Item[1]);

  //Save the image
  AImage := IImageFile(Image);
  AImage.SaveFile('c:\wia_viaScanner\image.' + AImage.FileExtension);
end;

WIA ライブラリの詳細については、こちらを参照してください。 http://msdn.microsoft.com/en-us/library/ms629859(VS.85).aspx

于 2009-04-06T17:46:03.310 に答える
0

KevinRF へ:
Delphi 7 プロジェクトで WIA 自動化を使用する必要があります。システムに WIAAut.dll を登録し、このライブラリを Delphi にインポートして、プログラム コードをプロジェクトに貼り付けたところ、いくつかのエラーが発生しました。

Scanner:= DevMgr.DeviceInfos.Item[1].Connect;


"Item" は Item[var Index: OleVariant] である必要がありますが、"1" は整数である必要があります。

何が問題なのですか、それを機能させるには何が必要ですか?

于 2009-05-06T06:54:54.957 に答える