Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Элегантные способы обработки `EInOutError` в Delphi XE3

Delphi , Синтаксис , Ошибки и Исключения

Вопрос, поднятый пользователем, заключается в необходимости обработки исключения EInOutError в приложении Delphi XE3 при неожиданном удалении USB-Serial порта. Приложение используется в тестовой среде, и ожидается, что оно будет автоматически обрабатывать ошибку без участия оператора. Попытки использовать стандартные методы обработки исключений, такие как "try .. except", а также компонент "ApplicationEvents" и глобальный обработчик исключений, не привели к желаемому результату.

Решение проблемы

Для решения проблемы обработки исключений, связанных с удалением USB-Serial порта, необходимо использовать механизмы операционной системы для отслеживания событий, связанных с устройствами. В Windows такое событие можно перехватить, обрабатывая сообщение WM_DEVICECHANGE. Это сообщение включает в себя информацию о том, было ли устройство подключено или удалено, и позволяет приложению реагировать на эти изменения.

Пример кода на Object Pascal (Delphi)

const
  DBT_DEVICEARRIVAL = $8000;
  DBT_DEVICEREMOVECOMPLETE = $8004;
  DBT_DEVICEQUERYREMOVE = $8001;
  DBT_DEVTYP_PORT = 3;

type
  PDevBroadcastHdr = ^TDevBroadcastHdr;
  TDevBroadcastHdr = packed record
    dbcd_size: DWORD;
    dbcd_devicetype: DWORD;
    dbcd_reserved: DWORD;
  end;

  PDEV_BROADCAST_PORT = ^TDEV_BROADCAST_PORT;
  TDEV_BROADCAST_PORT = packed record
    dbcp_size: DWord;
    dbcp_devicetype: DWord;
    dbcp_reserved: DWord;
    dbcp_name: array[0..MAX_PATH] of Char;
  end;

procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var
  prt: PDEV_BROADCAST_PORT;
  s: string;
begin
  if Msg.wParam = DBT_DEVICEREMOVECOMPLETE then
    if PDevBroadcastHdr(Msg.LParam)^.dbcd_devicetype = DBT_DEVTYP_PORT then
    begin
      // Порт был удален, устанавливаем флаг для последующей проверки
      b_PortRemoved := True;
      // Получаем имя порта для дальнейшего использования
      prt := PDEV_BROADCAST_PORT(PDevBroadcastHdr(Msg.LParam) + SizeOf(TDevBroadcastHdr));
      s := prt.dbcp_Name;
      // Выводим сообщение об удалении порта
      ShowMessage('ComPort ' + s + ' has been removed.');
    end;
  else if Msg.wParam = DBT_DEVICEARRIVAL then
    if PDevBroadcastHdr(Msg.LParam)^.dbcd_devicetype = DBT_DEVTYP_PORT then
    begin
      // Порт был подключен, можно выполнить переинициализацию
      // ...
    end;
end;

Комментарии по коду

Этот пример кода позволяет перехватить сообщение о том, что USB-Serial порт был удален, и установить соответствующий флаг, который можно проверить перед выполнением операций с портом. Если порт подключается снова, можно выполнить его переинициализацию.

Важно отметить, что в некоторых случаях может потребоваться дополнительная настройка библиотеки компонентов, используемых в приложении, для предотвращения возникновения ошибок при удалении порта.

Альтернативный подход

В качестве альтернативного подхода можно использовать глобальный обработчик исключений, предоставляемый библиотекой AsyncPro. Он позволяет перехватить исключение и обработать его самостоятельно, избегая показа диалога с ошибкой.

uses AwUser;

type
  TReaderException = procedure(ExceptObject: TObject; ExceptAddr: Pointer) of object;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Установка глобального обработчика исключений для AsyncPro
  GShowExceptionHandler := @OnReaderException;
end;

procedure TMainWin.OnReaderException(ExceptObject: TObject; ExceptAddr: Pointer);
begin
  // Здесь можно выполнить свою обработку исключения
end;

Использование глобального обработчика исключений позволяет более гибко реагировать на ошибки, возникающие в работе с портами. Однако, важно понимать, что такой подход требует тщательной настройки и может потребовать изменения поведения компонентов библиотеки.


Эти методы позволяют элегантно обработать исключение EInOutError в Delphi XE3, минимизируя риск возникновения диалогов с ошибками и обеспечивая более стабильную работу приложения в условиях изменения доступности USB-Serial портов.

Создано по материалам из источника по ссылке.

Вопрос связан с обработкой исключения `EInOutError` в приложении Delphi XE3 при неожиданном удалении USB-Serial порта в тестовой среде.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 12:40:49/0.003554105758667/0