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

"Прерывание импорта файлов при перетаскивании из Outlook в Virtual Tree View"

Delphi , Синтаксис , Деревья

Прерывание импорта файлов при перетаскивании из Outlook в Virtual Tree View

При перетаскивании вложений из Outlook в Virtual Tree View, импорт файлов может занять некоторое время, что приводит к замораживанию приложения Outlook до завершения функции импорта. В этой статье мы рассмотрим, как прервать операцию перетаскивания в середине функции импорта.

Проблема

При перетаскивании файлов из Outlook в Virtual Tree View, импорт файлов занимает некоторое время, что приводит к замораживанию приложения Outlook до завершения функции импорта. Нужно уметь прерывать операцию перетаскивания в середине функции импорта.

Код

Вот пример кода, который демонстрирует проблему:

procedure TForm.vstItemsDragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  fileList          : IStringList;
  drop              : IOleDrop;
begin
  fileList:= TIStringList.Create;

  drop := COleDrop.Create.def(DataObject);
  fileList := drop.GetDroppedFileList(fileWarnings);

  // Хотим прервать операцию перетаскивания здесь, так как уже получили нужные данные
  // Функция импорта занимает много времени, поэтому хотим прервать операцию перетаскивания
  // Outlook все еще замораживается, курсор остается в состоянии "копирования" и не отвечает на щелчки или клавишу ESC
  ImportParts( fileList)
end;

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

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

Подтвержденный ответ

Обычно информация из события перетаскивания извлекается (но не обрабатывается), а затем отправляется сообщение обратно на форму о наличии новой информации для обработки. Событие перетаскивания таким образом выходит довольно быстро, и обработчик сообщений затем обрабатывает все, что было перетащено.

В вашем случае можно сделать следующее:

  1. Определить константу для пользовательского сообщения:
CONST
  WM_PROCESS_DROPPED_FILES = WM_USER+42;
  1. Сделать переменную fileList членом класса формы:
TYPE
  TMainForm = CLASS(TForm)
    .
    .
  PRIVATE
    fileList : IStringList;
    PROCEDURE ProcessFiles(VAR MSG : TMessage); MESSAGE WM_PROCESS_DROPPED_FILES;
    .
    .
  END;
  1. В событии перетаскивания удалить объявление fileList (теперь это член класса формы, а не локальная переменная) и заменить вызов ImportParts(fileList) на PostMessage(Handle, WM_PROCESS_DROPPED_FILES).
procedure TForm.vstItemsDragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
var
  drop              : IOleDrop;
begin
  drop := COleDrop.Create.def(DataObject);
  fileList := drop.GetDroppedFileList(fileWarnings);

  // Отправляем сообщение, чтобы обработать файлы
  PostMessage(Handle, WM_PROCESS_DROPPED_FILES);
end;
  1. Реализовать процедуру ProcessFiles:
PROCEDURE TMainForm.ProcessFiles(VAR MSG : TMessage);
BEGIN
  ImportParts(fileList)
END;

Примечание: Возможно, придется сделать переменную fileList типа TStringList и скопировать информацию туда, чтобы убедиться, что ссылка на IStringList не заканчивается, когда событие перетаскивания выходит. Но общий принцип остается прежним - не обрабатывайте данные в событии перетаскивания, отложите это на потом, после того, как событие перетаскивания выйдет.

При использовании этого подхода обработка данных начнется позже в цикле сообщений. Пользователь все еще не сможет отменить обработку, но по крайней мере, приложение Outlook не будет заблокировано.

Если блокировка tanto получающего, как и отправляющего приложения является проблемой, то следует рассмотреть возможность внедрения очереди и/или фонового потока. Суть в том, чтобы выйти из события перетаскивания как можно скорее, чтобы освободить "блокировку" от отправляющего приложения.

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

При перетаскивании вложений из Outlook в Virtual Tree View, импорт файлов может занять некоторое время, что приводит к замораживанию приложения Outlook до завершения функции импорта, и требуется возможность прерывать операцию перетаскивания в середине фун


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

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




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


:: Главная :: Деревья ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:59:48/0.0055491924285889/1