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;
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.
deixe-me dizer algumas palavras