Resulta que estoy probando un tema que siempre dejo pendiente en mi aprendizaje de Delphi/Lazarus, el cual es poder crear un programa cad, en este momento estoy probando como crear un diseñador de esquema de Arbol y estoy empezando.
Por el momento hice lo siguiente:
Lo que deseo hacer es asignar evento onmousedown, onmouseup, onmousemove a los botones que voy creando en tiempo de ejecución. Los eventos que deseo asignarle son de un ejemplo sacado de delphiallimite http://delphiallimit...informes-i.html
El código de programa es el siguiente:
delphi
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ToolWin, ComCtrls, ImgList; type TMovible = class( TControl ); TForm1 = class(TForm) ImageList1: TImageList; ToolBar1: TToolBar; BNodo: TButton; MainMenu1: TMainMenu; Archivos1: TMenuItem; Nuevo1: TMenuItem; Abrir1: TMenuItem; Guardar1: TMenuItem; Cerrar1: TMenuItem; N1: TMenuItem; Salir1: TMenuItem; Ver1: TMenuItem; Edicion1: TMenuItem; NHoja: TButton; BUnir: TButton; procedure ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer ); procedure ControlMouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer ); procedure ControlMouseUp( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer ); procedure BNodoClick(Sender: TObject); procedure NHojaClick(Sender: TObject); procedure BUnirClick(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private BanNodo, BanHoja, BanUnir: Boolean; UltimoID: integer; iComponenteX, iComponenteY: Integer; // para moverlo bMoviendo: Boolean; // para moverlo public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.BNodoClick(Sender: TObject); begin BanNodo:= True; BanHoja:= False; BanUnir:= False; end; procedure TForm1.NHojaClick(Sender: TObject); begin BanNodo:= False; BanHoja:= True; BanUnir:= False; end; procedure TForm1.BUnirClick(Sender: TObject); begin BanNodo:= False; BanHoja:= False; BanUnir:= True; end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if BanNodo then begin with TButton.Create(self) do begin Parent := self; Left := X; Top := Y; Inc(UltimoID); Tag := UltimoID; Caption := 'Nodo' + IntToStr(UltimoID); Name := 'BNodo' + IntToStr(UltimoID); BanNodo:= False; //OnMouseDown:= ControlMouseDown(); //OnMouseMove:= ControlMouseMove(); //OnMouseUp:= ControlMouseUp(); end; end; if BanHoja then begin with TButton.Create(self) do begin Parent := self; Left := X; Top := Y; Inc(UltimoID); Tag := UltimoID; Caption := 'Hoja' + IntToStr(UltimoID); Name := 'BHoja' + IntToStr(UltimoID); BanHoja:= False; //OnMouseDown:= ControlMouseDown(); //OnMouseMove:= ControlMouseMove(); //OnMouseUp:= ControlMouseUp(); end; end; end; procedure TForm1.ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer ); begin iComponenteX := X; iComponenteY := Y; bMoviendo := True; TMovible( Sender ).MouseCapture := True; end; procedure TForm1.ControlMouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer ); begin if bMoviendo then with Sender as TControl do begin Left := X - iComponenteX + Left; Top := Y - iComponenteY + Top; end; end; procedure TForm1.ControlMouseUp( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer ); begin if bMoviendo then begin bMoviendo := False; TMovible( Sender ).MouseCapture := False; end; end;
Bueno, eso no puedo encontrar la forma que los botones que voy creando en tiempo de ejecución, tenga los eventos ControlMouseMove ControlMouseUP y ControlMouseDown.
Si puediera hacer eso, los botones se podrian mover por pantalla.
Desde ya muchas gracias.
Busque en el foro, y por ahí los temas son demasiados viejos y hablan sin poner código quería reiniciar la discusión más enfocado a lo que yo necesito.
PD: Si alguien conoce algún tutorial con un programa para diseñar grafo o algo por el estilo, seria bienvenido, en estos momentos no tengo que hacer nada con esto, no es para la facu, ni para un trabajo ni nada por el estilo, pero pasa que si puedo hacer este tipo de cosas, podre presentar mejores soluciones a mis clientes, por ejemplo un programa de bar donde se puedan mover las mesas o cosas por el estilo.