Vous êtes sur la page 1sur 28

Capt.

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;

Clasificación de los métodos

Los métodos se dividen en estáticos y virtuales.

 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.

Al encapsular un objeto es posible definir partes publicas y privadas y controlar las


componentes que el usuario del tipo objeto podrá utilizar. Cuando un objeto esta
encapsulado y con su estructura interna oculta, privada, se facilita el mantenimiento del
software, ya que se podrá mejorar la estructura del objeto, sin tener que modificar los
programas que lo utilicen.

Ejemplo:

Diseñe un Objeto TLibro que encapsule cuatro procedimientos:


type
cad80 = string[80];
TLibro=class
Autor.titulo.codigo:Cad80;
Precio: integer;
Procedure iniciar(A, T, C, Cad80; P: integer);
Procedure escribir:
Procedure Leer;
Procedure Listar;
end;

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;

TPixel es descendiente de TCoordenadas mientras que TCoordenadas es antepasado


inmediato de TPxel. En los métodos de los descendientes se suelen incluir llamadas a
métodos de los ascendientes con la finalidad de no repetir código. La palabra inherited
permite llamar desde un descendiente a un método del ascendiente sin necesidad de
especificar el nombre del mismo.

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;

1) Ejemplo POO1: La clase TEstudiante

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:

2) Ejemplo 2 POO2: La clase TEscrito-Herencia

Definir los siguientes tipos objeto: TEscrito, TLibro, TFolleto cuyos campos se indican a
continuación:

TEscrito: Autor, Título, Código, Año de publicación, Numero de paginas.


TLibro: Autor, Título, Código, Año de publicación, Numero de paginas, Editorial, Precio.
TLibro Tecnico: Autor, Título, Código, Año de publicación, Numero de paginas, Editorial,
Precio, Especialidad.
Folleto: Autor, Título, Código, Año de publicación, Numero de paginas, Tema.

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:

3) Ejemplo 3 POO3: La clase TEmpleado-Herencia


Declarar la clase TEmpleado con los campos Nombre, Dirección y Año de nacimiento.
Declarar la clase TAdministrativo como descendiente de TEmpleado. Dicha clase
TAdministrador tendrá, además de los campos anteriormente mencionados, el campo
Salario. Con instancias de cualquiera de los dos tipos, el método inicializara y permitirá
la introducción de valores en los campos.

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:

4) Ejemplo unidad: La unidad uFiguras


Escribir una unidad que exporte los objetos Figura, Circulo, Rectángulo, teniendo en
cuenta que la jerarquía entre ellos es:

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:

6) Ejemplo Unidad: La unidad uPila


Diseñar una unidad que exporte el tipo objeto dinámico pila de enteros.

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.

7) Ejemplo 5 POO5: El Objeto TPila

Elaborar un programa que utilice la unidad creada anteriormente y permita introducir en


la pila una serie de números enteros y positivos. A continuación deberá sacar de la pila
y mostrar en pantalla los números introducidos.

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.

Guardar una Aplicación


Siga estos pasos:
1. Abra el Explorador de Windows y cree una carpeta (Ejm: Ubíquese en la unidad raíz
de D:, luego hacer clic en el menú Archivo y elegir Nuevo/Carpeta, a continuación
ingrese Programas Delphi) y dentro de esta carpeta cree una nueva carpeta Mensaje
2. Inicie Delphi. Hacer clic en File/New/Application para crear una nueva aplicación
3. Diríjase al menú File y seleccionar el comando Save Unit As…
4. En el dialogo Save Unit1 As primeramente seleccione el lugar donde residirán los
archivos (D: Programas Delphi/Mensaje), luego digite en el cuadro Nombre de Archivo

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.

1) Programa 1: Mensaje de Bienvenida


1. Ingrese a Delphi y coloque un control Image en el formulario que se encuentra en la
pestaña Additional de la paleta de componentes.

2. Haga clic en el botoncito de tres Puntos ( … ) de la propiedad Picture (en el Object


Inspector) y Delphi nos mostrara el cuadro de dialogo Picture Editor.
3. Hacer clic en el botón Load y Delphi visualizara el cuadro de dialogo Load Picture.
4. En el cuadro de dialogo Load Picture, abra la carpeta Imágenes (que esta en la
carpeta Aplicaciones) y elija el archivo Computadora.jpg.
5. Haga clic en el botón abrir y Delphi regresara al cuadro de dialogo Load Picture.
Ahora este cuadro muestra el archivo de imagen seleccionado.
6. Haga clic en botón Ok. El control Image muestra la imagen seleccionada, pero solo
una parte de ella. Para que el control Image muestre toda la imagen cambien el valor
de la propiedad Strech a true.
7. coloque un control Label en el formulario y modifique sus propiedades:

Control Propiedad Valor


Label1 Caption Hola, bienvenido a Delphi
Transparent True
WordWarp True

8. Haga clic en el botoncito Font y delphi nos mostrara el dialogo Fuente


9. Seleccionar la fuente Staccato 222 BT, estilo de fuente regular, color azul y 36
puntos de tamaño. Finalmente, haga clic en Aceptar.
10. Agregar dos controles Timer y un botón BitBtn en el formulario. La siguiente tabla
muestra las propiedades asignadas a cada uno de los controles Timer y BitBtn.

Control Propiedad Valor


Timer1 Enabled True

17
Interval 1000
Timer2 Enabled True
Interval 150
BitBtn1 Kind bkAbort
Caption %Salir
Cursor crHandPoint

Luego de diseñar la intefaz de usuario, el siguiente paso consiste en vincular código


con cada uno de los controles. Los pasos que siguen permiten unir un procedimiento al
control Timer1 accionado por el evento On Timer. Cuando el usuario ejecute el
programa, este procedimiento debe hacer que el control Label1 muestre de manera
intermitente el mensaje “Hola, bienvenido a Delphi”
1. En el formulario, hacer doble clic en el control Timer. Delphi abre un controlador de
evento para el evento On Timer en la ventana de código.
2. Ente begin y end digite la sentencia.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.visible:=not(Label1.visible);
end;

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;

Asocie un procedimiento al control BitBtn accionado por el evento On Click.


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
close

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

un conjunto, en el que indicaremos los botones que deseamos aparezcan en el interior:

Constante Botón correspondiente


mbYes Si
mbOk Aceptar
mbNo No
mbCancel Cancelar
mbHelp Ayuda
mbAbort Abortar
mbRetry Reintentar

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.

Constante Botón que se ha pulsado


mrNone Ninguno, la ventana ha sidos cerrada
mrOk mbOk
mrYes mbYes
mrNo mbNo
mrCancel mbCancel
mrAbort mbAbort
mrRetry mbRetry
mrIgnore mbIgnore
mrAll mbAll

Un identificador asociado a una pagina de ayuda.


Funcion MessageDlgPos
Similar al anterior. El cuadro de mensaje aparece en una posición dada y no en el
centro de la pantalla.
Procedimiento ShowMessage
Muestra un cuadro de mensaje con el nombre de la aplicación como título y un solo
botón OK,
Procedimiento ShowMessageFmt
Similar al anterior. Cuenta con los mismos parámetros que la función Format.

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:

Valor Valor Numérico Significado


IDOK 1 El usuario eligió el botón Ok
IDCANCEL 2 El usuario eligió el botón Cancel
IDABORT 3 El usuario eligió el botón Abort
IDRETRY 4 El usuario eligió el botón Retry
IDIGNORE 5 El usuario eligió el botón Ignore
IDYES 6 El usuario eligió el botón Yes
IDNO 7 El usuario eligió el botón No

1) Programa: Miscelánea de Cuadros de Mensaje

Desarrollar una aplicación en el que el usuario pueda personalizar en tiempo de


ejecución los diversos cuadros de mensaje:

Siga los siguientes pasos:


1. Crear al carpeta Miscelánea
2. Crear la unit uCuadros y el Project pCuadros.
3. En el formulario coloque: 6 etiquetas, 7 botones, 4 cuadros de edición, 2
controles Spin, 2 controles Bevel, 2 cajas agrupadoras, 9 Radio botones y una
casilla de verificación.
4. Modificar las propiedades de los componentes.

Control Propiedad Valor


Form1 Caption Cuadros de Mensaje
Label1 Caption &X
Label2 Caption &Y
Label3 Caption M&ensaje
Label4 Caption Ti&tulo
Label5 Caption &Consulta
Label6 Caption &Valor
Edit1 Text Hola
Edit2 Text Información del usuario
Edit3 Text ¿Cuál es tu nombre?
Edit4 Text Víctor

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

Aspecto de la interfaz de usuario:

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:

procedure TForm1.RadioOKClick(Sender: TObject);


begin
MsgButtons := [mbOk];
end;

procedure TForm1.RadioOKCancelClick(Sender: TObject);


begin
MsgButtons := mbOkCancel;
end;

procedure TForm1.RadioYesNoClick(Sender: TObject);


begin
MsgButtons := [mbYes, mbNo];
end;

procedure TForm1.RadioYesNoCancelClick(Sender: TObject);


begin
MsgButtons := mbYesNoCancel;
end;

Haga doble clic sobre el formulario y establezca los valores iníciales:

procedure TForm1.FormCreate(Sender: TObject);


begin
MsgDlgType := mtWarning;
MsgButtons := [mbOk];
end;

23
Haga doble clic sobre el botón MessageDlg y digite:

procedure TForm1.ButtonMessageDlgClick(Sender: TObject);


begin
if CheckHelp.Checked then
Include (MsgButtons, mbHelp);
MessageDlg (Edit1.Text, MsgDlgType, MsgButtons, 0);
end;

Haga doble clic sobre el botón MsgDlgPos y digite:

procedure TForm1.ButtonMsgDlgPosClick(Sender: TObject);


begin
if CheckHelp.Checked then
Include (MsgButtons, mbHelp);
MessageDlgPos (Edit1.Text, MsgDlgType, MsgButtons,
0, SpinX.Value, SpinY.Value);
end;

Haga doble clic sobre el botón ShowMessage y digite:

procedure TForm1.ButtonShowMessageClick(Sender: TObject);


begin
ShowMessage (Edit1.Text);
end;

Haga doble clic sobre el botón ShowMessagePos y digite:

procedure TForm1.ButtonShowMessagePosClick(Sender: TObject);


begin
ShowMessagePos (Edit1.Text, SpinX.Value, SpinY.Value);
end;

Los valores de las coordenadas son tomados de los dos controles spin. Haga doble clic
sobre el botón InputBox y digite:

procedure TForm1.ButtonInputBoxClick(Sender: TObject);


begin
EditValue.Text := InputBox (EditCaption.Text,
EditPrompt.Text, EditValue.Text);
end;

Haga doble clic sobre el botón InputQuery y digite:

procedure TForm1.ButtonInputQueryClick(Sender: TObject);


var
24
Text: String;
begin
Text := EditValue.Text;
if InputQuery (EditCaption.Text, EditPrompt.Text, Text) then
EditValue.Text := Text;
end;

Digite el codigo para cerrar la aplicación en el botón Salir:

procedure TForm1.ButtonQuitClick(Sender: TObject);


begin
Close;
end;

EVENTOS DEL RATON (MOUSE)


Los eventos básicos son los siguientes:

OnMouseDown

Se recibe al pulsar uno de los botones:

Procedure TMouseForm:FormMouseDown (Sender: Tobject; Butto:TMouseButton;Shift:


TShiftState; X,Y:Integer);

Revisemos el significado de los parámetros:

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.

X e Y: Indican las coordenadas de la posición del mouse en el área de cliente de la


ventana partiendo de la esquina superior izquierda.

onMouseUP

Se recibe al liberar uno de los botones

onMouseMove

Ocurre cuando el usuario mueve el puntero del mouse.

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:

1. Iniciar Delphi y una nueva aplicación


2. En el Inspector de Objetos seleccionar la pagina Events y ubicar el evento
onMouseDown haciendo doble clic sobre el cuadro asociado.

Revisemos las instrucciones del método MouseDown. Si el usuario presiona el botón


izquierdo se activa el campo Boolean fDraggin del formulario indicando que el arrastre
es la acción de los otros dos métodos. Además de la variable fRect del tipo TRec
guarda la traza de la posición inicial y actual del arrastre. Por otro lado la función API
SerCapture permite que aunque el usuario mueva el mouse fuera del área cliente, el
formulario siga recibiendo todos los mensajes del mouse, de modo que si se mueve el
mouse hacia la parte superior de la pantalla por encima de la barra de título con el
mouse pulsado, el programa muestra ordenada negaiva.

procedure TMouseForm.FormMouseDown(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
var r:byte;
begin
if Button = mbLeft then
begin
fDragging := True;
SetCapture (Handle);
fRect.Left := X;
fRect.Top := Y;
fRect.BottomRight := fRect.TopLeft;
Canvas.DrawFocusRect (fRect);
end;
if Button = mbRight then
begin
r:=random(100);
Canvas.Ellipse(x-r,y-r,x+r,y+r);
end;

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.

procedure TMouseForm.FormMouseMove(Sender: TObject;


Shift: TShiftState; X, Y: Integer);
begin
// muestra la posicion del ratón en la barra de título
Caption := Format ('Puntero en x=%d, y=%d', [X, Y]);
if fDragging then
begin
// remove and redraw the dragging rectangle
Canvas.DrawFocusRect (fRect);
fRect.Right := X;
fRect.Bottom := Y;
Canvas.DrawFocusRect (fRect);
end
else
if ssShift in Shift then
// mark points in yellow
Canvas.Pixels [X, Y] := clYellow;
end;

En el método MouseUp se llama a la función API ReleaseCapture y se define campo


FDragging a False. Con Invalidate se activa una operación de dibujo ejecutándose el
evento OnPaint el que convierte en persistente la salida del formulario.

procedure TMouseForm.FormMouseUp(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
begin
if fDragging then
begin
ReleaseCapture;
fDragging := False;
Invalidate;
end;
end;

procedure TMouseForm.FormPaint(Sender: TObject);


begin
Canvas.Rectangle (fRect.Left, fRect.Top,
fRect.Right, fRect.Bottom);
end;

27
28

Vous aimerez peut-être aussi