Académique Documents
Professionnel Documents
Culture Documents
2
PROGRAMACION ORIENTADA A OBJETOS (POO)
Introducción:
La POO es una evolución de los lenguajes estructurados hacia una simplificación del
mantenimiento de código, así como unas mayores posibilidades de reutilización de
este.
Todos los componentes visuales y no visuales de una aplicación DELPHI son objetos.
Object Pascal cuenta con todos los componentes básicos de un lenguaje orientado a
objetos como son la encapsulación, la herencia y el polimorfismo.
Clase
Un tipo objeto o clase es un tipo definido por el usuario, cuya declaración efectúa de
forma muy parecida a la de un registro, con la diferencia de que, además de campos
incluye subprogramas a los que se denomina métodos. A los atributos de una clase se
les llama campo datos y a las operaciones de una clase se les llama métodos.
En la definición del tipo objeto únicamente se especificará la cabecera de dichas
rutinas, mientras que su declaración completa se efectuará fuera de dicha definición.
Método
Es una rutina asociada a un tipo de objeto y disponible en cualquier objeto
descendiente. El nombre del método consistirá en el nombre del objeto seguido por un
punto y el nombre del procedimiento o función.
Ejemplo1:
type
NombreClase = class
Campos1: Tipo1;
……..
CamposN: TipoN;
Porcedure IdProc(Lista Parametros)
Function IdFuncion(Lista Parametros): tipoRetorno
…….
end;
Procedure NombreClase.IdProc(Lista Parametros);
…….
Begin
…..
end,
1
Ejemplo2:
type
TPunto= Class
x,y: integer;
color: byte;
procedure dibuja
end;
Métodos Estáticos
Un método es estático o de ligadura temprana cuando las referencias al mismo se
resuelven en tiempo de ejecución. Requieren menos memoria y se ejecutan mas
rápidamente pero no pueden cambiar después de la compilación.
Métodos virtuales
Un método es Virtual o de ligadura tardía cuando dichas referencias se resuelven en
tiempo de ejecución mediante la consulta de una tabla de métodos virtuales que
contiene punteros a las instrucciones reales que implementan el método. Para crear un
método virtual se debe poner la palabra virtual reservada virtual después de la
cabecera en la definición del objeto.
Los métodos virtuales permiten la extensión del código, esto es, añadir nuevas
funcionalidades, sin disponer del código fuente y después que ha sido compilado.
Objeto
Es una variable que tiene una clase como tipo y se declara de la siguiente forma:
Var
NombreObjeto: NombreClase;
Las variables de tipo objeto también se denominan instancias. Se puede acceder a los
campos de datos mediante la sentencia with o el signo punto.
Para llamar a un método también se utilizan el signo punto o la sentencia with. Cuando
se llama a un método se dice que se pasa un mensaje al objeto.
La declaración de los tipo objeto se podrá efectuar en la sección interface, pero los
cuerpos de los métodos de los objetos deberán ser definidos en la sección
implementation.
Ejemplo.
2
Objeto Clase
Humboldt Colegio
Guadalupe Colegio
Calculo Curso
Física Curso
Convención:
Se utilizara la letra T como prefijo para el nombre de las clases que se escriben y
cualquier otro tipo (T significa tipo).
Encapsulamiento
Consiste en que los objetos mantienen unidos sus características y comportamiento, es
decir se combinan datos y subprogramas en un tipo objeto o clase. Solo un conjunto de
funciones restringidas (métodos) deben tener acceso a los datos, mientras que los
datos deben estar ocultos a cualquier otro código en el sistema.
Ejemplo:
Herencia
Es la capacidad de crear nuevos tipos objetos (descendientes) que se construyen sobre
otros existentes. Para definir tipos objetos descendientes se debe incluir entra
paréntesis, tras la palabra class, el tipo ascendiente o antepasado. La propiedad de la
herencia hace las tareas de programación mucho mas fáciles y flexibles, no siendo
3
necesario describir cada una de las características explícitamente para cada elemento,
ya que los elementos pueden heredar características de otros.
Formato:
type
TipoObjeto= class(NombreAntepasado)
ListaCampos
end;
Ejemplo:
type
TCoordenadas = Class
x, y: integer;
end;
TPìxel= class (Tcoordenadas)
Visible; boolean
end;
Ejemplo:
Declare un tipo objeto TEscrito con los campos Autor, Titulo, Código, Año de
publicación, Numero de paginas, y genere los objetos descendientes TLibro. TArticulo
(de periódico) y TFolleto.
type
TEscrito = class
Autor.titulo.codigo:string[80];
Anio,paginas :integer;
end;
TLibro = class(TEscrito)
Editorial:string[80];
Precio :real;
end;
TArticulo = class(TEscrito)
Periodico.Seccion:String[80];
Fecha:string[10];
end;
TFolleto = class(TEscrito)
Tema: string[80]
end;
4
Privado, Protegido y Publico
Object Pacal tiene tres especificadores básicos de acceso:
La directiva prívate
Indica campos y métodos de una clase que no es accesible desde afuera de la unidad
(el archivo de código fuente) que declara la clase.
La directiva public
Indica campos y métodos a los que se puede acceder libremente desde cualquier parte
del programa, así como en la unidad en que están definidos.
La directiva protected
Se utiliza para indicar campos y métodos con visibilidad limitada. Solamente la clase
actual y sus subclases pueden acceder a elementos que estén protegidos con esta
directiva.
Polimorfismo
Un método polimórfico es aquel que, compartido por distintos niveles en la jerarquía de
objetos, se comporta con cada objeto de la forma apropiada al mismo. Los métodos
virtuales constituyen una herramienta para el polimorfismo.
Constructor
Un constructor es similar a un procedimiento. Puede inicializar los campos de una
variable objeto específico. Este constructor puede ser utilizado por otros objetos que se
definan como casos especiales del objeto con el cual se asoció el constructor.
Ejemplo
type
TBuque = class
Blindaje: integer;
Flanco: char;
Constructor Initx(x: integer)
end;
Destructor
Es un método de limpieza que debe ser virtual y se define con los restantes métodos
del objeto en la declaración del tipo. Este limpia y dispone de objetos asignados
dinámicamente. El destructor se llama siempre que una instancia de la clase se
destruye.
5
type
TPunto = class
Visible: boolean;
constructor Init( x, y; integer);
destructor Terminado; virtual;
procedure Visualizar; virtual;
function EsVisible:boolean
end;
Declarar el tipo objeto TEstudiante con los campos Nombre, Nota1 y Nota2, una función
que calcule la media de ambas notas y un procedimiento que informe de dicha media.
program poo1;
uses
Dialogs,SysUtils;
type testudiante=class
procedure iniciar(n:string;n1,n2:real);
function media:real;
procedure mostrar;
private
nombre:string;
nota1,nota2:real;
end;
procedure testudiante.iniciar;
begin
nombre:=n;nota1:=n1;nota2:=n2
end;
function testudiante.media;
begin
media:=(nota1+nota2)/2
end;
procedure testudiante.mostrar;
begin
ShowMessage(nombre+ ' ha obtenido '+FloatToStr(media))
end;
var e1,e2:testudiante;
begin
e1:=testudiante.Create;
6
e2:=testudiante.Create;
e1.iniciar('Juan',14,15);e1.mostrar;
e2.iniciar('Carlos',16,16);e2.mostrar;
end.
Programa ejecutándose:
Definir los siguientes tipos objeto: TEscrito, TLibro, TFolleto cuyos campos se indican a
continuación:
No incluir métodos. Tener en cuenta que Libro y Folleto son descendientes de Escrito y
Libro Técnico de Libro.
program poo2;
uses
Dialogs, SysUtils;
type
TEscrito = class
Autor,titulo,codigo:string[80];
Anio,paginas :integer
end;
TLibro = class(TEscrito)
Editorial:string[80];
Precio :real
end;
TTecnico = class(TLibro)
especialidad:string[80];
end;
TFolleto = class(TEscrito)
Tema:string[80]
end;
7
var e:tescrito;l:tlibro;f:tfolleto;
begin
l:=tlibro.Create;
f:=tfolleto.Create;
l.Autor:=InputBox('Autor','Libro','');
f.Autor:=InputBox('Autor','Folleto','');
ShowMessage('Autor del Libro: '+l.Autor
+#13+'Autor del Folleto: '+f.Autor);
l.free;
f.Free
end.
Programa ejecutándose:
program poo3;
uses
Dialogs, SysUtils;
type
cad80=string[80];
TEmpleado= class
8
Nombre,Direccion:cad80;
AnioNacimiento :integer;
procedure Inicializar(N,D:cad80;A:integer);
procedure Mostrar;
end;
TAdministrativo=class(TEmpleado)
Salario :real;
procedure Inicializar(N,D:cad80;A:integer;S:real);
procedure Mostrar;
end;
procedure TEmpleado.Inicializar(N,D:cad80;A:integer);
begin
Nombre:=N;Direccion:=D;AnioNacimiento:=A
end;
procedure TEmpleado.Mostrar;
begin
ShowMessage(Nombre+' vive en: '+Direccion+IntToStr(AnioNacimiento))
end;
procedure TAdministrativo.Inicializar(N,D:cad80;A:integer;S:real);
begin
inherited Inicializar(N,D,A);
Salario:=S
end;
procedure TAdministrativo.Mostrar;
begin
ShowMessage(Nombre+' vive en: '+Direccion+#13
+'Nació el '+IntToStr(AnioNacimiento)+#13
+'Su sueldo es '+FloatTostr(salario))
end;
var
e:templeado;f:tadministrativo;
nn,dd:string;aa:integer;ss:real;
begin
e:=templeado.Create;
f:=tadministrativo.Create;
nn:=InputBox('Empleado','Nombre','');
dd:=InputBox('Empleado','Dirección','');
aa:=StrToInt(InputBox('Empleado','Nacimiento',''));
e.Inicializar(nn,dd,aa);
ss:=StrToFloat(InputBox('Administrativo','Sueldo',''));
f.Inicializar(nn,dd,aa,ss);
9
f.Mostrar;
e.free;
f.free
end.
Programa ejecutándose:
TFigura
Dato Campo: Forma
Metodos : ObtenerForma; CálculoArea, CalculoPerimetro,
MostrarFromaAreaPerimetro
TCirculo
DatoCampo: Radio
Metodos : CalculoArea, CalculoPerimetro
TRectangulo
10
DatosCampo: Base, Altura
Métodos : CalculoArea, CalculoPerimetro
unit uFiguras;
interface
uses Dialogs,SysUtils;
type
TFigura= object
constructor obtenerforma;
function calculoarea:real; virtual;
function calculoperimetro:real;virtual;
procedure MostrarFormaAreayPerimetro;
private
forma:string;
end;
TRectangulo=object(TFigura)
constructor iniciar(alt,bas:real);
function calculoarea:real; virtual;
function calculoperimetro:real;virtual;
private
base,altura:real;
end;
TCirculo =object(TFigura)
constructor iniciar(r:real);
function calculoarea:real; virtual;
function calculoperimetro:real;virtual;
private
radio:real;
end;
implementation
constructor Tfigura.obtenerforma;
begin
forma:=''
end;
function TFigura.calculoarea;
begin
calculoarea:=0
end;
function TFigura.calculoperimetro;
begin
11
calculoperimetro:=0
end;
procedure TFigura.MostrarFormaAreayPerimetro;
begin
ShowMessage('El tipo de figura es: '+forma+#13+
'el area es: '+FloatToStr(calculoarea)+#13+
'El perímetro es: '+FloatToStr(calculoperimetro));
end;
constructor TRectangulo.iniciar(alt,bas:real);
begin
inherited ObtenerForma;
forma:='Rectángulo';altura:=alt;base:=bas
end;
function TRectangulo.calculoarea;
begin
calculoarea:=base*altura
end;
function TRectangulo.calculoperimetro;
begin
calculoperimetro:=2*(altura+base)
end;
constructor TCirculo.iniciar(r:real);
begin
inherited ObtenerForma;
forma:='Círculo';radio:=r
end;
function TCirculo.calculoarea;
begin
calculoarea:=pi*sqr(radio)
end;
function TCirculo.calculoperimetro;
begin
calculoperimetro:=2*pi*radio
end;
end.
5) Ejemplo 4 POO4: Los objetos TCirculo y TRectangulo
12
Implementar un programa que utilice la unidad creada anteriormente para mostrar el
área y perímetro de un círculo de radio uno, así como los de un rectángulo de5 de alto
por 3 de ancho.
program poo4;
uses
uFiguras,Dialogs,SysUtils;
var
radio,l1,l2:real;
c:TCirculo;r:TRectangulo;
begin
radio:=1;
c.iniciar(radio);c.MostrarFormaAreayPerimetro;
l1:=5;l2:=3;
r.iniciar(l1,l2);
r.MostrarFormaAreayPerimetro
end.
Programa ejecutándose:
unit uPila;
interface
uses
Dialogs,SysUtils;
type
ptrbase=^TBase;
TBase=object
constructor iniciar;
destructor fin;virtual;
private
info:integer;
enlace:ptrbase
end;
13
TPila=object
constructor inicializar;
procedure meter(n:integer);
procedure sacar(var n:integer);
function vacia:boolean;
private
cima:ptrbase
end;
implementation
constructor TBase.iniciar;
begin
enlace:=nil
end;
destructor TBase.fin;
begin
end;
constructor TPila.inicializar;
begin
cima:=nil
end;
procedure TPila.meter;
var
auxi:ptrbase;
begin
new(auxi,iniciar);
auxi^.info:=n;
auxi^.enlace:=cima;
cima:=auxi
end;
function TPila.vacia:boolean;
begin
vacia:=cima=nil
end;
procedure TPila.sacar;
var
auxi:ptrbase;
begin
if cima<>nil then
begin
14
auxi:=cima;
n:=auxi^.info;
cima:=cima^.enlace;
dispose(auxi,fin)
end;
end.
program poo5;
uses
uPila,Dialogs,SysUtils;
var
n:integer;S:string;
p:TPila;
begin
p.inicializar;
n:=StrToInt(InputBox('n','Dame un número>=0','2'));
while n>0 do
begin
p.meter(n);
n:=StrToInt(InputBox('n','Dame un número>=0','2'));
end;
while not p.vacia do
begin
p.sacar(n);
S:=S+IntToStr(n)+#13;
end;
ShowMessage('Contenido de la Pila'+#13+S)
end.
Programa ejecutandose:
15
EMPLEO DE COMPONENTES EN EL DISEÑO DE UN PROGRAMA
Seguidamente se desarrollaran aplicaciones en las cuales se explicara de manera
progresiva el uso avanzado de los componentes estándar.
Ya que Delphi genera numerosos archivos por cada proyecto es preciso agruparlos de
modo que todos residan en un subdirectorio.
Básicamente hay dos archivos de gran importancia:
El archivo .PAS es un archivo de texto ASCII sin formato que contiene la declaración de
clase de un formulario y el código fuente de los controladores del evento. Merece la
pena observar que hay un solo archivo para todo el código del formulario, no solamente
fragmentos de código.
El archivo de Proyecto Delphi .DPR es otro archivo de código fuente Pascal. Este
archivo se crea automáticamente y a veces es necesario cambiarlos manualmente.
Una vez que decidamos guardar la aplicación, Delphi nos pedirá un nombre para estos
archivos.
16
el nombre que le asignará al modulo, digamos uMensaje. (usaremos el prefijo u para
designar al archivo .PAS).
5. En el dialogo Save Project1 As digite en el cuadro Nombre de Archivo el nombre
que le asignara al proyecto, digamos pMensaje (usaremos el prefijo p para designar al
archivo .DPR).
6. En este punto ya esta en condiciones de para realizar el diseño de su primera
aplicación Delphi. Note que el nombre del proyecto se ubica en la barra de título del
Entorno Integrado de Desarrollo, mientras que el nombre de la unidad se muestra en
el Editor de Código.
17
Interval 1000
Timer2 Enabled True
Interval 150
BitBtn1 Kind bkAbort
Caption %Salir
Cursor crHandPoint
Esta sentencia conmuta el valor booleano de la propiedad visible del control Label1.
Delphi busca el valor actual de Label1.Visible y el operador not invierte ese valor.
Vinculemos un procedimiento al control Timer2. Este procedimiento debe mostrar en la
barra de titulo del formulario un mensaje (“Hola, bienvenido a Delphi”) que se desplace
de derecha a izquierda. Haciendo doble clic en el control Timer2, introducir el siguiente
código.
procedure TForm1.Timer2Timer(Sender: TObject);
const
mensaje : string='Bienvenido a Delphi';
inicial : integer=1;
begin
Form1.caption:=copy(StringOfChar(' ',80) + mensaje,inicial,81);
if inicial=80 then inicial:=0;
inicial:=inicial + 1
end;
18
end;
CUADROS DE MENSAJE
Hay 6 procedimientos y funciones que se pueden usar para mostrar cuadros de dialogo
simples:
Funciones MessageDlg
Cuadro personalizado que cuenta con uno o mas botones y generalmente un mapa de
bits. Aparece en el centro de la pantalla. Necesita cuatro parámetros:
Una cadena conteniendo el mensaje que deseamos visualizar en el interior de la
ventana. Una constante, indicando el tipo de ventana que queremos mostrar:
Constante: mtCustom
mtWarning
mtError
mtInformation
mtConfirmation
19
mbIgnore Ignorar
mbAll Todo
Al pulsar alguno de los botones de la ventana, MessageDlg() devuelve un valor que nos
servirá, para conocer qué botón ha sido pulsado.
Procedimiento ShowMessagePos
Realiza lo mismo y además indica la posición del cuadro
Función InputBox
Solicita al usuario que inserte una cadena. Tenemos que proporcionarle un titulo, una
consulta y una cadena predeterminada.
Funcion InputQuery
Similar al anterior. Se usa para conocer el método por el cual se cerrado, la ventana.
Toma también tres parámetros siendo el tercero diferente: una variable de tipo string
en la que será devuelto el dato introducido por el usuario. InputQuery devuelve True o
False dependiendo si el usuario ha pulsado Enter o Esc, respectivamente.
MessageBox
20
Método del objeto Application. Especifica el mensaje, titulo y se pueden poner varios
botones y funciones. Necesita tres parámetros:
Texto, que es el mensaje que puede ser mayor a los 255 caracteres de ser necesario.
Titulo, que es la cadena en la barra de título de la caja de dialogo y es opcional
Flag, determina los botones que aparecerán en el cuadro y el comportamiento de éste.
MessageBox retorna 0 si no hay mucha memoria para crear el cuadro; de otro modo
retorna uno de los siguientes valores:
21
GroupBox1 Caption &Tipo de Mensaje
GroupBox2 Caption &Botones
RadioButton1 Caption Advertencia
RadioButton2 Caption Error
RadioButton3 Caption Información
RadioButton4 Caption Confirmación
RadioButton5 Caption Personalizado
RadioButton6 Caption OK
RadioButton7 Caption OK Cancel
RadioButton8 Caption Yes No
RadioButton9 Caption Yes No Cancel
CheckBox1 Caption Botón A&yuda
Los siguientes eventos de los radio botones sirven para asignar un constante (que
representa el icono que se desea visualizar) en la propiedad MsgDlgType:
procedure TForm1.RadioWarningClick(Sender: TObject);
begin
MsgDlgType := mtWarning;
end;
procedure TForm1.RadioErrorClick(Sender: TObject);
begin
22
MsgDlgType := mtError;
end;
procedure TForm1.RadioInformationClick(Sender: TObject);
begin
MsgDlgType := mtInformation;
end;
procedure TForm1.RadioConfirmationClick(Sender: TObject);
begin
MsgDlgType := mtConfirmation;
end;
procedure TForm1.RadioCustomClick(Sender: TObject);
begin
MsgDlgType := mtCustom;
end;
Similarmente, los siguientes eventos de los radio botones restantes sirven para asignar
una constante (que representa el botón o botones que se desean visualizar) en la
propiedad MsgButtons:
23
Haga doble clic sobre el botón MessageDlg y digite:
Los valores de las coordenadas son tomados de los dos controles spin. Haga doble clic
sobre el botón InputBox y digite:
OnMouseDown
Button: Indica cual de los tres botones está pulsado, con los valores mbRight, mbLeft,
mbCenter.
Shift: Indica qué teclas realtivas al botón están pulsadas, que pueden ser Alt, Control o
Mayus.
onMouseUP
onMouseMove
25
1) Programa: Aplicación Eventos Mouse
El objetivo de este ejemplo es dibujar un rectángulo desde la posición inicial del arrastre
hasta el final, dando al usuario una visión de la operación que realizamos:
end;
Si el usuario presiona con el botón derecho del ratón algún lugar del área cliente se
dibujara una circunferencia de radio aleatorio menor que 100.
Con la primera instrucción del método MouseMove mostramos la posición actual del
ratón en la barra de titulo. Si además mantenemos pulsada la tecla Mayus sw seguirá
los movimientos del ratón pintando pixels de color amarillo en el formulario cuya salida
no es persistente.
26
Para dibujar un rectángulo de puntos correspondientes a la posición real se llama dos
veces al método DrawFocusRect. En la primera llamada se borra la imagen actual,
gracias al hecho de que dos llamadas consecutivas a ese método se limitan a reiniciar
la situación original.
27
28