9.2 Etapas gerais para o desenvolvimento de funções de arrastar e soltar
Arrastar e soltar é uma função que facilita a operação de objetos fornecidos pelo Windows e pode ser facilmente desenvolvida em Delphi.
sair. De acordo com o processo de operação de arrastar e soltar, as etapas de desenvolvimento podem ser divididas em quatro etapas, a saber:
● Inicie a operação de arrasto
● Receba itens de arrasto
● Largue o item de arrasto
● Pare de arrastar a operação
Durante o processo de introdução, combinaremos um exemplo de operação de arrastar e soltar e soltar. O design da interface é mostrado na figura.
Quando o usuário arrasta uma tag para a posição de outra etiqueta em tempo de execução, a tag se moverá para esse local e causa
Rearranjo do conjunto de tags.
9.2.1 Comece a arrastar
Quando o Dragmode estiver definido como DMAutomatic, arraste automaticamente quando o usuário pressionar o mouse no controle de origem
Comece; Se você quiser começar a arrastar
Use o método Begindrag.
No Tabset arrastar e soltar, usamos o processamento de eventos Mousedown abaixo para começar a arrastar uma tag.
Primeiro, determine se o botão esquerdo pressionado é o botão esquerdo e, em seguida, determine se o item é legal.
Procedimento tform1.tabset1MouDown (remetente: TObject; botão: tmouseButton;
Turno: tshiftState;
var
Dragitem: Inteiro;
Começar
se botão = mbleft então
Começar
DragItem: = tabset1.itematPos (ponto (x, y));
if (dragitem> -1) e (dragitem <tabset1.tabs.count) então
Tabset1.begindrag (false);
fim;
fim;
9.2.2 Receba itens arrastados
Se um controle pode receber itens de arrasto é determinado pelo evento OnDragover do controle. No arrasto do Tabset, o principal é usar a posição do mouse para julgar.
Procedimento TForm1.TABSET1DRAGOVER (remetente, fonte: TOBJECT; X, Y: INTEGER;
Estado: tdragstate;
var
Droppos: Inteiro;
Começar
Se fonte = tabset1 então
Começar
Droppos: = tabset1.itematpos (ponto (x, y));
Aceitar: = (Droppos> -1) e (Droppos <> tabset1.tabindex) e
(Droppos <tabset1.tabs.count);
fim;
outro
Aceitar: = false;
fim;
9.2.3 Coloque o item de arrasto
Quando o processamento de eventos OnDragover retorna aceita true e o item é descartado, o evento ONDRAGDROP
O processo de arrastar e soltar a resposta. Na instância do TabSet Draw and Drop, é alterar a posição da tag.
Procedimento TForm1.TABSET1DRAGDROP (remetente, fonte: TOBJECT; X, Y: Inteiro);
var
Oldpos: número inteiro;
Newpos: número inteiro;
Começar
Se fonte = tabset1 então
Começar
Oldpos: = tabset1.tabindex;
Newpos: = tabset1.itematpos (ponto (x, y));
if (newpos> -1) e (newpos <> oldpos) então
Tabset1.tabs.move (Oldpos, newpos);
fim;
fim;
9.2.4 Operação de arrasto final
Existem duas maneiras de encerrar a operação de arrasto: o usuário libera a tecla do mouse ou o programa usa o método final.
Arrasto de aborto forçado. Há duas consequências para encerrar a operação de arrasto: a queda é aceita ou a queda é ignorada.
Após a conclusão da operação de arrasto, o controle de origem receberá uma mensagem para responder ao evento de drag end Onenddrag.
9.3 Exemplo de aplicação de arrastar e soltar: arraste e soltar suporte para gerenciador de arquivos
Embora o exemplo do aplicativo do Gerenciador de Arquivos desenvolvido no capítulo 6 tenha começado a tomar forma em função, ele está operacional
Comparado com o gerenciador de arquivos do Windows, ainda existem muitas deficiências. A maior desvantagem é que ele não suporta movimentos de arrastar e soltar de arquivos
e arraste e soltar cópia. No final deste capítulo, podemos compensar essa falha.
O movimento de arrastar e soltar de arquivo refere -se ao arquivo quando o usuário arrasta um arquivo para um diretório na árvore do diretório e o solta.
Ele se moverá automaticamente para este diretório;
Quando você o coloca e solta, o arquivo será copiado automaticamente para o diretório atual da unidade. Caixa de lista de arquivos como controle de origem e
A árvore do diretório e o rótulo de acionamento do controle de destino podem estar localizados em diferentes subtidificadores. O diretório atual da unidade é qualquer submarino
O resultado da operação mais recente da janela, independentemente de essa sub-janela ter um relacionamento com a fonte de arrasto e o alvo de arrasto.
Para implementar as funções acima, existem dois problemas que devem ser resolvidos primeiro:
1.Como registrar o diretório atual de cada unidade?
Para isso, definimos uma variável global:
Var CurrentDirlist: Array [0 ... 25] de String [70];
No evento OnChange of DirectoryOutline:
procedimento tfmform.directoryoutlineChange (remetente: tabject);
Começar
CreateCaption;
FileList.clear;
Filelist.directory: = DirectoryOutline.Directory;
Filelist.Update;
CurrentDirlist [driveTabset.tabindex]: = diretoryoutline.directory;
FileManager.DirectoryPanel.CAPTION: = DirectoryOutline.Directory;
fim;
Porque o DriveTabset responde ao evento OnClick antes de responder ao evento ONDRAGDROP e é ativado pelo evento
Envie o evento OnChange of DirectoryOutline, para que seja garantido que seja usado no evento ONDRAGDROP a qualquer momento
O item CurrentDirlist Array para não ser uma string vazia.
2. Como garantir a irrelevância do movimento e da cópia com as sub-janelas?
Uma questão importante aqui é que, quando julgamos o controle da fonte, usamos o operador IS para executar a verificação do tipo:
Se a fonte for tfilelist, então…
Se usarmos a seguinte declaração:
Se fonte = filel da lista
...
Em seguida, as operações de movimento e cópia serão limitadas ao escopo desta sub-janela.
Quando resolvemos a pergunta acima, nosso trabalho estava seguindo as etapas gerais de desenvolvimento de arrastar e soltar, e a concluímos passo a passo.
1.Filelist começa a arrastar a operação
procedimento tfmform.FileListMouDown (remetente: TObject; botão: tmouseButton;
Turno: tshiftState;
Começar
se botão = mbleft então
com remetente como tfilelistbox
Começar
Se Itematpos (ponto (x, y), verdadeiro)> = 0 então
Begindrag (falso);
fim;
fim;
O ItemATPOS é usado para verificar se atualmente existe um arquivo. O método Begindrag passa o parâmetro false, permitindo que a lista de fileiras lida com os eventos do mouse separadamente sem começar a arrastar. De fato, essa situação existe em grandes quantidades.
2. DirectoryOutline e DriveTabset Decidam se aceitará o arrastar e colocá -lo no local.
procedimento tfmform.directoryoutLinedRagover (remetente, fonte: tabject; x,
Y: Inteiro;
Começar
Se a fonte for tfilelistbox, então
Aceitar: = true;
fim;
procedimento tfmform.driveTabsetDragover (remetente, fonte: tabject; x,
Y: Inteiro;
var
Proppos: número inteiro;
Começar
Se a fonte for tfilelistbox, então
com o driveTabset fazer
Começar
Proppos: = itemAtPos (ponto (x, y));
Aceitar: = (Proppos> -1) e (Proppos <tabs.count);
fim;
fim;
O DirectoryOutline é uma aceitação incondicional, enquanto o DriveTabset precisa verificar se é uma etiqueta legal.
3. Resposta de arrastar e soltar
DirectoryOutline Draw and Drop é usado para implementar a função de movimento do arquivo. Chamando o Evento Confirmchange no programa
Durante o processo de processamento, o caminho alvo é obtido pelo DirectoryOutline.Items [getItem (x, y)]. Fullpath.
procedimento tfmform.directoryoutLinedRagdrop (remetente, fonte: tabject; x,
Y: número inteiro);
Começar
Se a fonte for tfilelistbox, então
com o diretoryoutline fazer
Começar
ConfirmChange ('move', filelist.filename, itens [getItem (x, y)]. Fullpath);
fim;
fim;
DriveTabset arrastar e soltar é usado para implementar a função de cópia de arquivos. Converter a posição atual no driver correspondente no programa
A letra do atuador, o caminho alvo é obtido pelo CurrentDirlist [driveTabset.tabindex].
procedimento tfmform.driveTabSetDragdrop (remetente, fonte: tabject; x, y: inteiro);
var
Apoint: TPOint;
Começar
APOINT.X: = X;
DriveTabset.tabindex: = driveTabset.itematpos (apoint);
Se a fonte for tfilelistbox, então
com o driveTabset fazer
Começar
Se CurrentDirlist [Tabindex] <> '' então
ConfirmChange ('cópia', thefileName, currentDirlist [tabindex]);
fim;
fim;
4. Resposta do Filelista à arrastar pontas e atualizar a lista de arquivos
procedimento tfmform.FilElistendDrag (remetente, destino: TObject; x, y: inteiro);
Começar
se alvo <> nil então filelist.update;
fim;