Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-06-2003
esquerda21 esquerda21 is offline
Miembro
 
Registrado: may 2003
Posts: 51
Poder: 21
esquerda21 Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 12-06-2003
Bacterion Bacterion is offline
Miembro
 
Registrado: may 2003
Posts: 91
Poder: 21
Bacterion Va por buen camino
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).
Responder Con Cita
  #3  
Antiguo 16-06-2003
esquerda21 esquerda21 is offline
Miembro
 
Registrado: may 2003
Posts: 51
Poder: 21
esquerda21 Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 16-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
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
  #5  
Antiguo 16-06-2003
esquerda21 esquerda21 is offline
Miembro
 
Registrado: may 2003
Posts: 51
Poder: 21
esquerda21 Va por buen camino
Gracias .Lo implemento en mi Prog. y te cuento.
Responder Con Cita
  #6  
Antiguo 18-06-2003
esquerda21 esquerda21 is offline
Miembro
 
Registrado: may 2003
Posts: 51
Poder: 21
esquerda21 Va por buen camino
Sobre el Sender he observado que es mejor así.

Procedure tform1.onmousedown(......)

with (sender as tform1) do

begin
// lalala
end;
Responder Con Cita
  #7  
Antiguo 18-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 18-06-2003
esquerda21 esquerda21 is offline
Miembro
 
Registrado: may 2003
Posts: 51
Poder: 21
esquerda21 Va por buen camino
oK. Lo pruevo a ver q tal.
Responder Con Cita
  #9  
Antiguo 18-06-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Posteado originalmente por andres1569
Código:
if Sender is TForm then
  with (Sender as TForm1) do ...
De hecho aquí hay una redundancia. El operador as lleva implícito al operador is y ya que lleva unos cuantos ciclos más de cpu sería mejor poner:

Código:
if Sender is TForm then
  with TForm1(Sender) do ...
// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:44:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi