Hola
para mover componentes dinamicamente debes usar los siguientes eventos:
OnMouseDown: aqui debes almacenar en dos variables (raton_x, raton_y) la posición actual del ratón, que
se pasa como parámetro en el evento y poner a cierto una variable booleana que indica cuando se debe mover.
Código Delphi
[-]
mover := true;
raton_x := X
raton_Y := Y
OnMouseMove: sumar la diferencia, entre la posicion actual y la posición guardada del ratón, a las propiedades
Top y Left de la componente.
Código Delphi
[-]
if mover then
begin
with shape do
begin
top := top + (Y-raton_Y);
left := left + (X-raton_X);
end;
end;
OnMouseUp: poner a falso la variable mover.
Para redimiensionar seria muy parecido pero en lugar de modificar las propiedades Top y Left debes
modificar Heigth y Width.
Como los shapes los creas dinámicamente, no puedes acceder a los eventos como cuando las componentes se
crean dinamicamente, por eso, tendrás que crear tres procedimientos, uno para cada evento anterior, que
tengan los parámetros de entrada y salida igual que los de los eventos. Para ver que parametros son pue
des crear un shape de prueba y haz doble click en estos eventos y copias la cabecera.
Código Delphi
[-]
procedure TForm1.IniciarMovimiento(...procedure TForm1.MoverShape(...procedure TForm1.FinalizarMovimiento(...
y en el lugar donde creas los shapes le asignas estro procedimiento al shape creado
Código Delphi
[-]
...
onmousedowm := iniciarmovimiento;
onmousemove := movershape;
onmouseup := finalizarmovimiento;
...
Para seleccionar una componente puedes usar la clase Canvas para dibujar un rectangulo alrededor del
shape ,al hacer click sobre el, para indicar de alguna manera que está seleccionado.
Espero que te haya sido útil.