Movendo e redimensionando controles em tempo de execução

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.

instagram viewer

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.

instagram story viewer