Я использую компонент TDelphiTwain для сканирования. Когда я запускаю сканирование из устройства подачи, все сканирование выполняется асинхронно, и событие OnTwainAcquire запускается, когда новое изображение доступно для обработки. Но я не могу найти, как проверить, что сканирование всех документов уже завершено. Когда лоток податчика пуст, сканирование останавливается, и если я помещаю новые бумаги в податчик, он не обрабатывает их. Поэтому мне нужно знать, что он закончен, и я могу обрабатывать полученные изображения. Я могу проверить, что фидер пуст, но я могу легко пропустить (моим чеком) момент, когда трей был пуст, поэтому приложение будет думать, что приходят новые изображения, но это не так. Я предполагал, что для такой задачи должны быть какие-то события (StartSession/StopSession), но я не могу их найти.
в коде это выглядит так:
procedure TFormDemo.FormShow(Sender: TObject);
begin
Twain := TTwainScanner.Create;
Twain.OnTwainAcquire := Acquire;
Twain.Source[SelectedDevice].SetFeederEnabled(True);
Twain.Source[SelectedDevice].Enabled := True; // start
end;
procedure TFormDemo.Acquire(Sender: TObject; const Index: Integer;
Bitmap: TBitmap; var Cancel: Boolean);
begin
// some processing
Cancel := False;
end;
Я также перехватываю событие OnAcquireProgress, но это ход текущего сканирования изображения, и это не помогает узнать, когда сканирование было остановлено.
ОБНОВЛЕНИЕ: я почти нашел решение. Когда TTwainSource завершает обработку событий TWAIN, он устанавливает ENABLED=false для TTwainsource. К сожалению, внутри OnTwainAcquire это все еще True, позже оно стало False, и нет события, где я мог бы это проверить. Как обходной путь, я могу проверить его по таймеру.