BotonMenu
BotonIndice

Visita : conoce3000.com
Paypal : https://www.paypal.com/donate/?hosted_button_id=XY8TZ3MGN64GE

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


12. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS III.
12.4. EVENTOS. PUNTEROS A MÉTODOS.
12. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS III.
12.4. EVENTOS. PUNTEROS A MÉTODOS.
12. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS III.
12.4. EVENTOS. PUNTEROS A MÉTODOS.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Eventos. Punteros a métodos.

Los objetos o instancias de una clase tienen que comunicarse de alguna manera, los eventos son las respuestas a la manera en que se comunican los objetos. Los eventos pueden ser ocasionados por un cambio de estado en el objeto. Cuando hablo de un cambio de estado me refiero a que de repente alguno de los atributos del objeto a tomado un valor distinto del anterior. Como por ejemplo en una lista de números enteros, se puede decir que en un momento dado este puede estar lleno, vació o asignando un valor numérico a uno de sus elementos. Esos tres estados pueden ocasionar un evento para cada situación.

Además de los eventos de cambio de estado existen otros tipos de eventos como los de señal y los de tiempo, un claro ejemplo de eventos de señal, son las excepciones que se implementa de otro modo, tal como se vio en el capitulo 11.01. Los eventos de tiempo son eventos que se activan con la ayuda de un temporizador, un ejemplo es el programador de tareas de un antivirus.

Al suceder un evento, sea cual sea se debe implementar una respuesta por parte del objeto que lo recibe esto se hace con el uso de los punteros a métodos, que son punteros a procedimientos o funciones al que se les añade al final de su declaración las siguientes palabras reservadas of object. Ejemplo:

Type
   PunteroAMetodo01 = procedure (n : integer) of object;
   PunteroAMetodo02 = procedure of object;

Hay que entender que el evento es el Puntero a un método, y el método asignado a ese puntero es la respuesta al evento.

A continuación se muestra un ejemplo de una lista de números reales, que es el mismo que se vio en el capitulo anterior, pero con la diferencia de que en este ejemplo, se implementa un evento de cambio, que será activado o ejecutado cuando se asignan valores a los elementos de la lista.


Descargar
{$codepage utf8}
{$mode objfpc}
Unit ListaReales02;
Interface
Type
  TEvento = Procedure of object;
  TListaReales = class
    private
     Elementos:array of double;
     //Evento
     EvCambios:TEvento;

     Procedure Pon(indice:integer;r:double);
     Function Obt(indice:integer):double;
    Protected
     //El que llama al evento
     Procedure Cambios;virtual;
    public
     cantidad:integer;
     Constructor Crear(n:integer=100);
     Property Elemento[i:integer]:double read Obt write Pon;default;
     //Propiedad del evento para acceder EvCambios
     Property ECambios: TEvento read EvCambios write EvCambios;
  End;

Implementation

  Procedure TListaReales.Cambios;
    Begin
      //Si es asignado o diferente de nil llama al evento
      if Assigned(EvCambios) then EvCambios
    End;

  Procedure TListaReales.Pon(indice:integer;r:double);
    Begin
      Elementos[indice]:=r;
      //LLama al evento asociado
    Cambios
    End;

 Function TListaReales.Obt(indice:integer):double;
    Begin
     Obt:=Elementos[indice]
    End;

 Constructor TListaReales.Crear(n:integer=100);
    Begin
      SetLength(Elementos,n);
      cantidad:=n
    End;
End.
Código fuente 12: TListaReales con el evento ECambios.
Descargar

Esta clase que implementa una lista de números reales, hace uso de las propiedades para que se comporte de una manera parecida a un arreglo, el atributo EvCambios es el puntero a un método , es decir el evento, que después cualquier clase lo podrá implementar con un método de respuesta a través de su propiedad Ecambios. La mayoría de las clases que implementan eventos, generalmente declaran los eventos en una sección privada que luego se debe acceder a través de una propiedad. Esto es una buena practica que nos permite encapsular los eventos hacia otras clases que lo heredan. En esta clase existe un método Cambios que se encargará de ejecutar el método de respuesta asignado al puntero de métodos EvCambios, para verificar si hay un método asignado a EvCambios se usa la función Assigned. La función Assigned devuelve verdadero, si EvCambios es diferente de nil y falso en caso contrario. Lo mismo se puede hacer comprobando, si EvCambios es diferente de nil del siguiente modo:

if EvCambios<>nil then EvCambios

El siguiente es un programa que implementa una clase TTablaFrecuencias, que hace uso de la clase TListaReales. La clase TTablaFrecuencias es la misma que se vio en el capitulo anterior pero con la salvedad que implementa dos métodos de respuesta Cambiosni y Cambioshi, que se encargarán de obtener el total de las frecuencias correspondientes, cada vez que se ingrese un valor a uno de los elementos de las listas ni o hi (ni=frecuencias absolutas, hi frecuencias relativas). Recuerde que cada vez que se asigna un elemento a una lista se activa el evento EvCambios.


Descargar
{$codepage utf8}
{$mode objfpc}
Uses ListaReales02;
Type
  TTablaFrecuencias = class    
    class var
      i:longint;
    var
  
    ni,hi,NiMenorQ:TListaReales; 
    Tni,Thi:double;
    cantidad:longint;
    
    Constructor Crear(n:longint);
    Procedure Lectura;
    Procedure Calculos;
    Procedure Mostrar;	
    //Eventos
    Procedure Cambiosni;
    Procedure Cambioshi;
  End; 
  
  Constructor TTablaFrecuencias.Crear(n:longint);
   Begin
     ni:=TListaReales.Crear(n);
     //Se asigna el evento Cambiosni
     ni.ECambios:=@Cambiosni; 	 
     hi:=TListaReales.Crear(n);
     //Se asigna el evento Cambioshi
     hi.ECambios:=@Cambioshi; 
     NiMenorQ:=TListaReales.Crear(n);	 
     cantidad:=n;
   End;
   
  Procedure TTablaFrecuencias.Lectura;
   Var aux:double;  
   Begin   
    for i:=0 to  cantidad-1 do     
	  Begin
       Write('ni[',i,'] ');
	   readln(aux);	   
	   //Cada vez que se asigna una frecuencia absoluta
         //se ejecuta el evento Cambiosni	  
	   ni[i]:=aux; 
	  End; 
   End;   

  Procedure TTablaFrecuencias.Calculos;
   Begin   
     //Frecuencia Relativa hi
     //Cada vez que se asigna una frecuencia
     //relativa se ejecuta el evento Cambioshi
     for i:= 0 to cantidad-1 do  hi[i]:=ni[i]/Tni;     
   End;   

  Procedure TTablaFrecuencias.Mostrar;
   Begin
     Writeln('        ni        hi        Ni');
     for i:=0 to cantidad-1 do 
       Writeln(' ',ni[i]:10:2,hi[i]:10:2,NiMenorQ[i]:10:2);
     Writeln;
	 Writeln('Total ',tni:5:2,thi:10:2)
   End;   
  
  //implementacion de los eventos
  
  Procedure  TTablaFrecuencias.Cambiosni;
   Begin
    Tni:=Tni+ni[i];
    if i=0 then NiMenorQ[i]:=ni[i]
       else NiMenorQ[i]:=NiMenorQ[i-1]+ni[i]  
   End;
   
   Procedure  TTablaFrecuencias.Cambioshi;
   Begin
    Thi:=Thi+hi[i]; 	
   End;

Var TablaFrecuencias:TTablaFrecuencias;   
    n:longint;
Begin
  Write('Ingrese numero de datos : ');readln(n);
  TablaFrecuencias:=TTablaFrecuencias.Crear(n);
  TablaFrecuencias.Lectura;
  TablaFrecuencias.Calculos;
  TablaFrecuencias.Mostrar
End.
Código fuente 13: Ejemplo del uso del Evento ECambios.
Descargar

Como se puede observar en este ejemplo el constructor de la clase TTablaFrecuencias, es el encargado de colocar los métodos de respuesta a los eventos de las listas de reales ni y hi. Estos se asignan a su propiedad ECambios. A diferencia del ejemplo anterior los totales de las frecuencias se obtienen usando los métodos de respuesta Cambiosni y Cambioshi, ya que estos se ejecutarán cada vez que se asigne un elemento a la lista.

También se puede observar en este cambio que el cálculo de las frecuencias NiMenorQ se hacen dentro del método de respuesta Cambiosni.




SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo a través de , que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado. Para clases particulares contactame por whatsapp al 📲 (+51) 999 264 073








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.