FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
El evento OnActivate
Hola de nuevo Forereos.
He creado ventanas DMIChild mediante codigo osea: var Form1: TForm1; rafa: tform1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin rafa:= tform1.CreateNew(self); rafa.FormStyle:= fsMDIChild; rafa.OnActivate:= pinta(); end; procedure pinta(); begin //lalala end; end. Me da un herror de incopatible TNotifyEvent an Procedure. Como lo puedo hacer? Gracias de antemano |
#2
|
|||
|
|||
Muy facil. Mira la ayuda del TNotifyEvent...
verás que su definición es algo así como: TNotifyEvent: procedure (Sender: TObject) of Object; La coletilla "of Object" lo que significa es que es una referencia a procedimiento de un objeto, no a procedimiento normal. Luego tu procedure pinta; (los parentesis no hacen falta, al contrario que en C que se requieren siempre) debes declararlo dentro de un objeto (por ejemplo, tu TForm1). |
#3
|
|||
|
|||
Si yo hago:
pepe: tform1; Procedure BotoonClick.... begin pepe:= tform1.createnew(self), pepe.parent:= form1; pepe.show; pepe.onMousedown:= Esto el lo que no tengo claro Este donde este el onMouseDown se activa.Como es posible si esta dentro del evento botoonClick? OnMouseDown lo puedo igualar a otra cosa que no sea un procedimiento como un ACTION o algo asi? Y luego, Que quiere deci esto:? (sender as Tform1). canvas. lineto(200,200); Gracias de antemano |
#4
|
|||
|
|||
Hola:
Contestando a tu primer mensaje: Cita:
Código:
procedure TForm1.pinta(); begin //lalala end; En tu segundo mensaje: Cita:
Sólo puedes asignarle a un evento un método del mismo tipo que el evento en cuestión, es decir con los mismos parámetros. Como decía Bacteriorn en su respuesta, los eventos están definidos como procedures of Object, eso significa que no son procedures "normales" sino métodos que pertenecen a una clase. Luego sólo puedes asignarle métodos con los mismos parámetros que dicho evento. El tipo de evento más común es el TNotifyEvent, que está definido como: TNotifyEvent = procedure (Sender: TObject) of Object; Es el evento más común por lo que se permite muchas veces asignar a cualquier método que sólo reciba un parámetro de tipo TObject. No lo le puedes asignar un Action directamente porque són dos cosas diferentes, un Evento y un Objeto. Lo que sí puedes hacer es asignarle el OnActivate al evento OnExecute de un Action. Pongamos que tienes un TActionList con un Action1 al que le has asignado algo en su evento OnExecute. Si quieres que tu componente Rafa, al activarse haga lo mismo que esa Action, puedes hacer: Rafa.OnActivate := Action1.OnExecute; La pega con el evento OnMouseDown es que no es del tipo TNotifyEvent, sino que envía algunos parámetros más y no podrías asignarle directamente el OnExecute de un TAction. Con el evento OnClick sí es posible esa asignación. Como ves, debe haber coincidencia de parámetros. Cita:
Sender.Canvas.LineTo(200, 200); esto daría un error de compilación. En cambio, si creemos estar seguros de que dicho Sender SÍ es un TForm1 (bastaría con poner TForm en realidad), lo tratamos como tal, de esta forma le decimos al compilador que trate el Sender como un TForm1, que SÍ tiene Canvas, y la instrucción no da error al compilar y además funciona al ejecutarse.
__________________
Guía de Estilo |
#5
|
|||
|
|||
Gracias .Lo implemento en mi Prog. y te cuento.
|
#6
|
|||
|
|||
Sobre el Sender he observado que es mejor así.
Procedure tform1.onmousedown(......) with (sender as tform1) do begin // lalala end; |
#7
|
|||
|
|||
Sobre el uso del casting o moldeado de tipos sucede que no es una operación tan rápida de ejecutar, así que si vas a hacer varias operaciones con ese objeto moleado, es mejor utilizar el with, tal como dices:
with (sender as tform1).Canvas do begin MoveTo (3, 3); LineTo (8, 9); Rectangle ( ...); ... end; Otra forma de moldear tipos es así: with TForm1(sender) do ... y para asegurarte siempre de que no metes la pata y que el objeto que moldeas es realmente de dicho tipo, puedes utilizar el operador is: Código:
if Sender is TForm then with (Sender as TForm1) do ...
__________________
Guía de Estilo |
#8
|
|||
|
|||
oK. Lo pruevo a ver q tal.
|
#9
|
||||
|
||||
Cita:
Código:
if Sender is TForm then with TForm1(Sender) do ... |
|
|
|