Ir al contenido


Foto

Asignar evento a objetos creado en tiempo de ejecuión.


  • Por favor identifícate para responder
5 respuestas en este tema

#1 martinartaza

martinartaza

    Advanced Member

  • Miembros
  • PipPipPip
  • 159 mensajes
  • LocationArgentina, Tucuman

Escrito 12 octubre 2011 - 08:40

Hola que tal querida comunidad.
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:
Imagen Enviada

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
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, Menus, StdCtrls, ToolWin, ComCtrls, ImgList;
  8.  
  9. type
  10.   TMovible = class( TControl );
  11.   TForm1 = class(TForm)
  12.     ImageList1: TImageList;
  13.     ToolBar1: TToolBar;
  14.     BNodo: TButton;
  15.     MainMenu1: TMainMenu;
  16.     Archivos1: TMenuItem;
  17.     Nuevo1: TMenuItem;
  18.     Abrir1: TMenuItem;
  19.     Guardar1: TMenuItem;
  20.     Cerrar1: TMenuItem;
  21.     N1: TMenuItem;
  22.     Salir1: TMenuItem;
  23.     Ver1: TMenuItem;
  24.     Edicion1: TMenuItem;
  25.     NHoja: TButton;
  26.     BUnir: TButton;
  27.     procedure ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
  28.     procedure ControlMouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer );
  29.     procedure ControlMouseUp( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
  30.  
  31.     procedure BNodoClick(Sender: TObject);
  32.     procedure NHojaClick(Sender: TObject);
  33.     procedure BUnirClick(Sender: TObject);
  34.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  35.       Shift: TShiftState; X, Y: Integer);
  36.   private
  37.     BanNodo, BanHoja, BanUnir: Boolean;
  38.     UltimoID: integer;
  39.  
  40.     iComponenteX, iComponenteY: Integer; // para moverlo
  41.     bMoviendo: Boolean; // para moverlo
  42.   public
  43.     { Public declarations }
  44.   end;
  45.  
  46. var
  47.   Form1: TForm1;
  48.  
  49. implementation
  50.  
  51. {$R *.dfm}
  52.  
  53. procedure TForm1.BNodoClick(Sender: TObject);
  54. begin
  55.   BanNodo:= True;
  56.   BanHoja:= False;
  57.   BanUnir:= False;
  58. end;
  59.  
  60. procedure TForm1.NHojaClick(Sender: TObject);
  61. begin
  62.   BanNodo:= False;
  63.   BanHoja:= True;
  64.   BanUnir:= False;
  65. end;
  66.  
  67. procedure TForm1.BUnirClick(Sender: TObject);
  68. begin
  69.   BanNodo:= False;
  70.   BanHoja:= False;
  71.   BanUnir:= True;
  72. end;
  73.  
  74. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  75.   Shift: TShiftState; X, Y: Integer);
  76. begin
  77. if BanNodo then
  78.   begin
  79.   with TButton.Create(self) do
  80.   begin
  81.     Parent := self;
  82.     Left := X;
  83.     Top := Y;
  84.     Inc(UltimoID);
  85.     Tag := UltimoID;
  86.     Caption := 'Nodo' + IntToStr(UltimoID);
  87.     Name := 'BNodo' + IntToStr(UltimoID);
  88.     BanNodo:= False;
  89.     //OnMouseDown:= ControlMouseDown();
  90.     //OnMouseMove:= ControlMouseMove();
  91.     //OnMouseUp:= ControlMouseUp();
  92.     end;
  93.   end;
  94.  
  95. if BanHoja then
  96.   begin
  97.   with TButton.Create(self) do
  98.   begin
  99.     Parent := self;
  100.     Left := X;
  101.     Top := Y;
  102.     Inc(UltimoID);
  103.     Tag := UltimoID;
  104.     Caption := 'Hoja' + IntToStr(UltimoID);
  105.     Name := 'BHoja' + IntToStr(UltimoID);
  106.     BanHoja:= False;
  107.     //OnMouseDown:= ControlMouseDown();
  108.     //OnMouseMove:= ControlMouseMove();
  109.     //OnMouseUp:= ControlMouseUp();
  110.     end;
  111.   end;
  112.  
  113.  
  114.  
  115. end;
  116.  
  117.  
  118. procedure TForm1.ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
  119. begin
  120.   iComponenteX := X;
  121.   iComponenteY := Y;
  122.   bMoviendo := True;
  123.   TMovible( Sender ).MouseCapture := True;
  124. end;
  125.  
  126. procedure TForm1.ControlMouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer );
  127. begin
  128.   if bMoviendo then
  129.     with Sender as TControl do
  130.     begin
  131.       Left := X - iComponenteX + Left;
  132.       Top  := Y - iComponenteY + Top;
  133.     end;
  134. end;
  135.  
  136. procedure TForm1.ControlMouseUp( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
  137. begin
  138.   if bMoviendo then
  139.   begin
  140.     bMoviendo := False;
  141.     TMovible( Sender ).MouseCapture := False;
  142.   end;
  143. 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.


  • 0

#2 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 12 octubre 2011 - 09:23

Bueno, aunque no aclaras muy bien qué problema se te presenta, voy a suponer que estamos hablando de Lazarus.

En tal caso, para asignar un evento por código se hace de la siguiente manera.



delphi
  1.   OnMouseDown:= @ControlMouseDown();
  2.   OnMouseMove:= @ControlMouseMove();
  3.   OnMouseUp:= @ControlMouseUp();



Para crear un diseñador, te puedo recomendar que revises estos componentes para Delphi

http://www.delphiare...ts/simplegraph/

Te pueden servir como base para tener un área de diseño y objetos que puedes manipular.

Saludos

  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 12 octubre 2011 - 09:37




Para asignar eventos a controles creados en tiempo de ejecución (en Delphi), la  condición es crear previamente el procedimiento con exactamente los mismos parámetros que se crearían en tiempo de diseño, y luego asignarlos después después de crearlos.




delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   miBoton: TButton;
  4. begin
  5.   miBoton := TButton.Create(self);
  6.   miBoton.Parent := Form1;
  7.   MiBoton.Top := 0;
  8.   MiBoton.Left:= 0;
  9.   miBoton.OnMouseDown := ControlMouseDown ;
  10. end;


  • 0

#4 martinartaza

martinartaza

    Advanced Member

  • Miembros
  • PipPipPip
  • 159 mensajes
  • LocationArgentina, Tucuman

Escrito 12 octubre 2011 - 09:59

Muchas gracias wilson, yo ponia
    OnMouseDown:= ControlMouseDown() y no me andaba.
Por otro lado, voy a tener en cuenta tu código Héctor Randolph, cuando llegue a casa y lo implemente en lazarus.

Me acabo de dar cuentas que las imagenes que subo en mi site de gmail no la ven todos, así que vuelvo a subir la imagen de lo que estoy haciendo.
[img]http://http://www.alertaenelcamino.org.ar/cursos/Mover.JPG[/img]
Ahora los botones que voy creando en tiempo de ejecución se mueven.

En este momento me voy a poner a ver como hago para unirlo atraves de una linea, no se bien como plantearlo pero voy a investigar al respecto y luego voy a poner mis inquietudes.

PD:  Héctor Randolph, ese componente vos lo usaste, porque yo en delphi 6.0 no logro hacerlo.



  • 0

#5 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 12 octubre 2011 - 11:19

Si he usado los componentes TSimpleGraph, los instalé en Delphi 7 sin problemas.
 
  Si no puedes instalarlos, también puedes probar con las JEDI, existen componentes dentro de la paleta "jvRuntimeDesign".
 
  Tienes un inspector de objetos y área de diseño. Puedes registrar las  clases que deseas manipular cambiando su posición y tamaño.  Estos  componentes fueron hechos para Delphi y pienso que sería un poco más  complicado llevarlo a Lazarus.


Archivos adjuntos


  • 0

#6 martinartaza

martinartaza

    Advanced Member

  • Miembros
  • PipPipPip
  • 159 mensajes
  • LocationArgentina, Tucuman

Escrito 13 octubre 2011 - 08:57

Gracias Randolph, parecen muy prometedor, pero como no si lograre hacerlo andar en lazarus, hasta que no encuentre otra solución tratare de seguir dándome mania. Ahora posteo en otro tema como hacer para unir 2 botones con una linea.

  • 0




IP.Board spam blocked by CleanTalk.