Ver Mensaje Individual
  #4  
Antiguo 16-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Reputación: 22
andres1569 Va por buen camino
Hola:

Contestando a tu primer mensaje:
Cita:
procedure pinta();
begin
//lalala
end;

end.

Me da un herror de incopatible TNotifyEvent an Procedure.
Siguiendo lo que dice Bacterion, se trataría de que el procedure Pinta perteneciera al Form1, es decir, no puede ser un procedure independiente sino un método de una clase:

Código:
procedure TForm1.pinta();
begin
//lalala
end;
Ahora sí que te dejará asignarle este método al OnActivate.


En tu segundo mensaje:
Cita:
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?
Cuando asignas un método a un evento (sin importar donde hayas hecho esa asignación, en este caso dentro del BotonClick), cada vez que se dispare ese evento se ejecutará el código que le asignaste. Es decir, en esa asignación le estás diciendo lo que tiene que hacer cada vez que Pepe dispare el evento. Si quieres que deje de ejecutar alguna acción, puedes ponerlo a nil: pepe.onMousedown := nil;

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:
Y luego, Que quiere deci esto:?

(sender as Tform1). canvas. lineto(200,200);
La expresión (Sender as TForm1) es lo que se llama un cast o moldeado de tipo, es decir tratamos un objeto como si fuera otro. El parámetro Sender que reciben todos los eventos de tipo TNotifyEvent, es del tipo TObject. Como el TObject no tiene ninguna propiedad Canvas, si hiciéramos:

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
Responder Con Cita