Finalizando ou cancelando uma operação de arrastar e soltar em um aplicativo Delphi

MBass

Estou arrastando e soltando anexos de e-mail do Outlook. Os arquivos são colocados em uma visualização em árvore virtual.

Minha função de importação no final do evento drag over demora um pouco para processar os arquivos e congela o aplicativo do Outlook até que a função termine.

Desejo poder encerrar a operação de arrastar no meio da função.

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);

  //I want to terminate the drag operator here because I already have what I need

  //This imports parts takes a while to run so I want to end the drag and drop operation
  //Outlook freezes still has cursor state on copy and doesn't respond to clicks or ESC
  ImportParts( fileList)    
end;
HeartWare

Normalmente, apenas pego as informações no evento Drop (ou seja, não as processo) e, em seguida, envio uma mensagem de volta para o meu formulário de que há novas informações a serem processadas. O evento Drop é encerrado rapidamente, e o manipulador de mensagens então pega e trata o que quer que tenha sido descartado.

No seu caso, você deve fazer algo assim:

CONST
  WM_PROCESS_DROPPED_FILES = WM_USER+42;

TYPE
  TMainForm = CLASS(TForm)
                .
                .
              PRIVATE
                fileList : IStringList; // Ie. move the declaration here...
                PROCEDURE ProcessFiles(VAR MSG : TMessage); MESSAGE WM_PROCESS_DROPPED_FILES;
                .
                .
              END;

e em seu evento drop, remova a declaração de fileList (você a tornou um membro privado do formulário em vez de uma variável local) e substitua

ImportParts(fileList)

com

PostMessage(Handle,WM_PROCESS_DROPPED_FILES)

então implemente

PROCEDURE TMainForm.ProcessFiles(VAR MSG : TMessage);
  BEGIN
    ImportParts(fileList)
  END;

Pode ser necessário transformar a variável fileList em TStringList e copiar as informações lá, caso a referência à IStringList seja encerrada quando o evento Drop sair, mas o princípio geral é o mesmo - não processe os dados no Drop evento, adie-o após a saída do evento Drop.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como voltar programaticamente de uma operação de arrastar e soltar em um QListWidget?

diretório de trabalho atual em um vbscript invocado por uma operação de arrastar e soltar

diretório de trabalho atual em um vbscript invocado por uma operação de arrastar e soltar

É possível verificar se a origem / destino são os mesmos para uma operação de arrastar e soltar (em java)?

iOS - como arrastar uma subvisualização de uma visão para uma nova visão (ou seja, arrastar e soltar)?

iOS - como arrastar uma subvisualização de uma visão para uma nova visão (ou seja, arrastar e soltar)?

Como faço para arrastar e soltar de um aplicativo Swing para um Windows Explorer?

Não existe um comportamento padrão de arrastar e soltar em um aplicativo e4 criado por e (fx) clipse?

Envolvendo um componente em forwardRef () (experimentando uma biblioteca de arrastar e soltar para React)

Por que não consigo arrastar e soltar uma classe em um pacote no Eclipse?

Como faço para arrastar e soltar uma linha em um JTable?

Executando uma operação de arrastar e soltar como o Windows Explorer

Encontre o nome de listBox ou objeto typeOf em WPF C # arrastar e soltar

Adotando arrastar e soltar em uma visualização de tabela / coleção não funciona no iPhone

Como adicionar uma função reset () a um HTML de arrastar e soltar?

Arrastar e soltar QML em uma grade

Como instalar o Google Play Services em uma VM Genymotion (sem suporte de arrastar e soltar)?

Habilite arrastar e soltar de uma linha apenas se arrastar for feito em uma coluna específica

Arrastar e soltar em um elemento dimensionado

Como arrastar e soltar em um gráfico de dispersão

Crie uma boa função de soltar e arrastar

Como simular uma ação de arrastar e soltar no transferidor?

Arrastar e soltar iOS 11: soltar no aplicativo Agenda padrão

C # WindowsForms Como alternar a operação de arrastar e soltar

Salvando posição de arrastar e soltar em javascript

startActivityForResult () de um Fragment e finalizando uma Activity filha, não chama onActivityResult () em Fragment

Como lidar com várias quedas para vários componentes ao arrastar e soltar, em uma função ou classe?

Pasta arrastar e soltar em um lote para ser lida no aplicativo java

Arrastar e soltar um botão?