Veja como habilitar os controles de arrastar e redimensionar (em um formulário Delphi) com o mouse enquanto o aplicativo está em execução.
Editor de formulários em tempo de execução
Depois de colocar um controle (componente visual) no formulário, você pode ajustar sua posição, tamanho e outras propriedades em tempo de design. Porém, existem situações em que você precisa permitir que um usuário do seu aplicativo reposicione controles de formulário e altere seu tamanho em tempo de execução.
Para habilitar o movimento do usuário em tempo de execução e redimensionar os controles em um formulário com um mouse, três eventos relacionados ao mouse precisa de tratamento especial: OnMouseDown, OnMouseMove e OnMouseUp.
Em teoria, digamos que você queira permitir que um usuário mova (e redimensione) um controle de botão, com um mouse, em tempo de execução. Primeiramente, você lida com o evento OnMouseDown para permitir que o usuário "agarre" o botão. Em seguida, o evento OnMouseMove deve reposicionar (mover, arrastar) o botão. Finalmente, o OnMouseUp deve concluir a operação de movimentação.
Arrastando e redimensionando controles de formulário na prática
Em primeiro lugar, descarte vários controles em um formulário. Tenha uma caixa de seleção para ativar ou desativar os controles de movimentação e redimensionamento em tempo de execução.
Em seguida, defina três procedimentos (no interface seção da declaração do formulário) que manipulará os eventos do mouse conforme descrito acima:
tipo TForm1 = classe(TForm)... procedimento ControlMouseDown (Remetente: TObject; Botão: TMouseButton; Shift: TShiftState; X, Y: Inteiro); procedimento ControlMouseMove (Remetente: TObject; Shift: TShiftState; X, Y: Inteiro); procedimento ControlMouseUp (Remetente: TObject; Botão: TMouseButton; Shift: TShiftState; X, Y: Inteiro); privado inReposition: booleano; oldPos: TPoint;
Nota: São necessárias duas variáveis no nível do formulário para marcar se o movimento de controle está ocorrendo (inReposition) e para armazenar a posição antiga de controle (oldPos).
No evento OnLoad do formulário, atribua procedimentos de manipulação de eventos do mouse aos eventos correspondentes (para os controles que você deseja arrastar / redimensionar):
procedimento TForm1.FormCreate (Remetente: TObject); início Button1.OnMouseDown: = ControlMouseDown; Button1.OnMouseMove: = ControlMouseMove; Button1.OnMouseUp: = ControlMouseUp; Edit1.OnMouseDown: = ControlMouseDown; Edit1.OnMouseMove: = ControlMouseMove; Edit1.OnMouseUp: = ControlMouseUp; Panel1.OnMouseDown: = ControlMouseDown; Panel1.OnMouseMove: = ControlMouseMove; Panel1.OnMouseUp: = ControlMouseUp; Button2.OnMouseDown: = ControlMouseDown; Button2.OnMouseMove: = ControlMouseMove; Button2.OnMouseUp: = ControlMouseUp; fim; (* FormCreate *)
Nota: o código acima permite a reposição em tempo de execução do Botão1, Edição1, Painel1 e Botão2.
Finalmente, aqui está o código mágico:
procedimentoTForm1.ControlMouseDown ( Remetente: TObject; Botão: TMouseButton; Shift: TShiftState; X, Y: Inteiro);inícioE se (chkPositionRunTime. Verificado) E (Remetente é TWinControl) entãoinício inReposition: = True; SetCapture (TWinControl (Sender) .Handle); GetCursorPos (oldPos); fim; fim; (* ControlMouseDown *)
ControlMouseDown em resumo: quando um usuário pressiona um botão do mouse sobre um controle, se a reposição em tempo de execução estiver ativada (caixa de seleção chkPositionRunTime está marcado) e o controle que recebeu o mouse para baixo é derivado do TWinControl, marca que o reposicionamento do controle está ocorrendo (inReposition: = True) e verifique se todo o processamento do mouse foi capturado para o controle - para impedir que eventos padrão de "clique" sejam processado.
procedimentoTForm1.ControlMouseMove ( Remetente: TObject; Shift: TShiftState; X, Y: Inteiro);const minWidth = 20; minHeight = 20; var newPos: TPoint; frmPoint: TPoint; inícioE se inReposition entãoiníciocom TWinControl (Remetente) Fazinício GetCursorPos (newPos); E se ssShift dentro Mudança entãoinício//resize Tela. Cursor: = crSizeNWSE; frmPoint: = ScreenToClient (Mouse. CursorPos); E se frmPoint. X> minWidth então Largura: = frmPoint. X; E se frmPoint. Y> minHeight então Altura: = frmPoint. Y; fimoutro//moveinício Tela. Cursor: = crSize; Esquerda: = Esquerda - antigaPos. X + newPos. X; Top: = Principal - oldPos. Y + newPos. Y; oldPos: = newPos; fim; fim; fim; fim; (* ControlMouseMove *)
ControlMouseMove em resumo: altere o Cursor da tela para refletir a operação: se a tecla Shift for pressionada, permita redimensionar o controle ou simplesmente mova o controle para uma nova posição (para onde o mouse está indo). Nota: minWidth e minHeight constantes fornecem uma espécie de restrição de tamanho (largura e altura mínimas de controle).
Quando o botão do mouse é liberado, o arraste ou redimensionamento termina:
procedimentoTForm1.ControlMouseUp ( Remetente: TObject; Botão: TMouseButton; Shift: TShiftState; X, Y: Inteiro);inícioE se inReposition entãoinício Tela. Cursor: = crDefault; ReleaseCapture; inReposition: = False; fim; fim; (* ControlMouseUp *)
ControlMouseUp em resumo: quando um usuário terminar de mover (ou redimensionar o controle), solte a captura do mouse (para ativar o processamento padrão de cliques) e marque a reposição.
E é isso! Faça o download do aplicativo de amostra e tente você mesmo.
Nota: Outra maneira de mover controles em tempo de execução é usar o Delphi arraste e solte propriedades e métodos relacionados (DragMode, OnDragDrop, DragOver, BeginDrag, etc.). Arrastar e soltar pode ser usado para permitir que os usuários arrastem itens de um controle - como uma caixa de listagem ou exibição em árvore - para outro.
Como se lembrar da posição e tamanho do controle?
Se você permitir que um usuário mova e redimensione os controles do formulário, você deve garantir que o posicionamento do controle seja de alguma forma salvo quando o formulário é fechado e que a posição de cada controle é restaurada quando o formulário é criado / carregado. Veja como armazenar as propriedades Left, Top, Width e Height, para cada controle em um formulário, em um INI Arquivo.
Como cerca de 8 alças de tamanho?
Quando você permite que um usuário mova e redimensione controles no formulário Delphi, em tempo de execução usando o mouse, para imitar completamente o ambiente de tempo de design, você deve adicionar oito alças de tamanho ao controle que está sendo redimensionado.