Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Desarrollo OOP
Object Oriented Programming
1 Objetivos
Desarrollo de aplicaciones industriales utilizando herramientas de programacin oritentada a objetos
Microsoft Visual Studio Community 2017: IDE gratuito para programacin de aplicaciones .NET
https://www.visualstudio.com/es/downloads/
Registro de datos para posterior procesamiento en control de calidad, planificacin de la produccin etc.
Tratamiento de alarmas
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 2
2 Lenguaje C#
Primera versin propuesta por Microsoft en junio del 2000
Sintaxis bsica similar a otros lenguajes de programacin: Java, C++, PHP, etc.
Cdigo intermedio
IL Intermediate Language
Cdigo mquina
En una primera fase de compilacin, el cdigo fuente se traduce a un cdigo IL descrito en un lenguaje
similar a un ensamblador
En la ejecucin del programa en un determinado equipo con una determinada versin de sistema
operativo, se realiza una traduccin a cdigo mquina
Ejemplo:
else // Si no ...
Cdigo IL generado:
En Windows .NET hay un entorno de ejecucin para monitorizar la ejecucin del programa (managed
code) con el objetivo de comprobar su integridad, capturando posibles excepciones o errores y para que
se cumplan las restricciones de seguridad impuestas en su instalacin y relativas a la cuenta de usuario
3 Nmeros enteros
Sin signo: todos los bits utilizados para expresar el valor en binario
Ejemplos:
int x = 123;
long y = x;
Casting necesario cuando se reduce el formato. El compilador exige que sea el programador quien tome
la responsabilidad de la posible prdida de informacin, obligndole a indicar el casting.
long y = 123;
int x = (int) y;
3.3 Constantes
Si no, en decimal
Ejemplo: 217 = 1101 1001
4 Enumerados
Se pueden definir tipos de datos enumerados, de forma que una variable de este tipo pueda tomar un
valor dentro de un conjunto posible de valores identificados mediante un nombre
Los enumerados son compatibles con los nmeros enteros y cada posible valor de un enumerado
corresponde a un valor entero. Por defecto son valores consecutivos comenzando en 0. Para el caso
anterior, Parado=0, Acelerando=1, Marcha=2, etc
estadoMotor = Estado.Marcha;
int valor = (int)estadoMotor; // Guarda un 2 en valor
estadoMotor = (Estado)3; // Guarda Estado.Decelerando en estadoMotor
5 Nmeros reales
Los valores se pueden indicar en notacin cientfica escribiendo el exponente en base 10 despus de
una E
-5
2.47E-5 = 2.47 * 10
Conversiones
Representacin en memoria
En decimal: signo * M * 2E
Mantisa M de 23 bits.
Exponente E de 8 bits. Al exponente de rango -126 a 127 se le suma 127 para almacenarlo en el rango
1 a 254.
El punto decimal se desplaza hacia la izquierda hasta dejar slo a un 1 en la parte entera:
8
101000001.1011 = 1.010000011011 * 2
Valores especiales
if (double.IsPositiveInfinity(z))
System.Console.WriteLine("Resultado = +Infinito");
if (double.IsNegativeInfinity(z))
System.Console.WriteLine("Resultado = -Infinito");
Es posible inicializar una variable con el valor NaN, por ejemplo, para indicar que no contiene ningn
valor vlido
Con 32 o 64 bits es imposible representar los infinitos valores existentes en la recta real
En su lugar, se representan valores aislados en una secuencia en la que estn ms prximos cuanto
menor es su valor absoluto
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 9
Consecuencia: se representan habitualmente valores aproximados y que no son exactos, por lo que no
es conveniente realizar comprobaciones de igualdad entre nmeros reales
Es un nmero entero de 96 bits al que se le puede poner un punto decimal para disponer de hasta 28
dgitos decimales
En los bits 103...110 se indica el exponente en 8 bits que indica el nmero de dgitos decimales
Ejempo:
decimal x = 35.66M;
2
35.66 = 3566 / 10
El exponente es 2 = 10 en binario
En Espaa la norma oficial es el uso de la coma aunque la RAE indica que hay que tender a la
utilizacin del punto para unificar criterios con otros pases.
En el caso de separadores de millares, se utilizan:
- El software de control de los generadores de energa elctrica alterna del avin utilizan una variable
entera de 32 bits con signo para contar el nmero de centsimas de segundo transcurridas y as
tener una medida del tiempo.
31
- Esta variable sufre un desbordamiento de formato al cabo de 2 * 1/100 s = 248 das
- Este software, cuando detecta este problema, deshabilita los alternadores y la generacin de
energa elctrica alterna del avin cuando se da este fallo, que se puede producir en pleno vuelo.
Ariane 5
http://www.rtve.es/noticias/20140604/ecrror-software-convirtio-lanzamiento-espacial-carisimos-
fuegos-artificiales/948262.shtml
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 12
7 Operaciones aritmticas
Con nmeros enteros
a = 7; a - b 3
b = 4; Resta
Multiplicacin a * b 28
Divisin entera a / b 1
Resto a % b 3
Cambio de signo -a -7
Ejemplo:
Operacin Ejemplo Resultado
double x, y; x + y 11.0
Suma
x = 7.0;
y = 4.0; Resta x - y 3.0
Multiplicacin x * y 28.0
Divisin x / y 1.75
Ejemplo: a + x
Parntesis
Ejemplo: (a + x) * (y + b)
Ejemplo:
int x, y;
x = 3;
y = 5;
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 13
Incremento x ++; x = x + 1; x = 4
Decremento x --; x = x - 1; x = 2
y = y + 1; x = 24
Incremento previo x = ++y * 4;
x = y * 4; y = 6
x = y * 4; x = 20
Incremento posterior x = y++ * 4;
y = y + 1; y = 6
y = y - 1; x = 16
Decremento previo x = --y * 4;
x = y * 4; y = 4
x = y * 4; x = 20
Decremento posterior x = y-- * 4;
y = y - 1; y = 4
Ejemplo:
Operacin Ejemplo Equivalente a
etc
10 Caracteres
- Segunda parte de la tabla ASCII: caracteres utilizados para la confeccin de textos en ingls
Caracteres especiales
Dec C# Significado
10 '\n' Nueva lnea
13 '\r' Retorno de carro
9 '\t' Tabulacin horizontal
92 '\\' Barra invertida
39 '\'' Comilla simple
34 '\"' Doble comilla
Ejemplos
"Estaban \"dormidos\""
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 16
10.2 Unicode
- Todos los caracteres de la tabla ASCII (0x00 a 0x7F) se expresan en un nico byte
- A partir del cdigo 0x80 hasta el 0x7FFFFFFF se expresan segn la siguiente tabla:
- Ejemplo, el carcter , de cdigo 0x2260 = 0010 0010 0110 0000 se expresa en tres bytes
1110 0010 1000 1001 1010 0000 = 0xE2 0x89 0xA0
11 Cadenas de caracteres
Concatenacin de varios caracteres para formar un texto
Se manejan mediante objetos inmutables: cualquier modificacin del texto implica la creacin de un
nuevo objeto en memoria
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 17
cadena = cadena.ToUpper();
// Aplicacin del mtodo ToUpper() para conversin a maysculas.
// Crea otro objeto con el valor "HOLA PEPE"
Otros mtodos
StartsWith, EndsWith: indican si una cadena comienza o termina de una determinada forma
etc.
Por defecto, el separador decimal es una coma en cadenas para sistemas Windows configurados en
Espaol
String cadena;
double x = 35.2347, y;
cadena = "8.257";
y = Convert.ToDouble(cadena); // Resultado 8257.0
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 18
Otras conversiones:
int i = 23;
string s = "376";
i = (int) f;
// Casting para reducir formato de float a int
s = i.ToString();
// Todos los tipos disponen del mtodo ToString() para generar una cadena con la
// representacin visual del valor que almacenan
f = Convert.ToSingle(s);
// Clase Convert con mtodos de conversin a diferentes formatos
12 Buleanos
12.1 Comparaciones
Generan buleanos
Ejemplo:
int x = 4;
int y = 5; Operacin Ejemplo Resultado
Igual x == y false
Diferente x != y true
bool b = x > y;
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 19
Ejemplo:
bool a = true;
bool b = false; Operacin Ejemplo Resultado
OR a || b true
NOT ! a false
El mtodo WriteLine pertenece a la clase Console que est definida en el espacio de nombres System
class MiClase {
}
}
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 20
14 Espacios de nombres
Permiten organizar los identificadores globales de las clases en una estructura jerrquica
namespace Empresa {
namespace Ingenieria {
class Mantenimiento {
static public string estado() {
return "Reparacin de cinta transportadora";
}
}
class Instalacion {
static public string estado() {
return "Montaje de cadena 4";
}
}
namespace Gestion {
class Ventas {
static public string estado() {
return "Elaboracin de presupuestos";
}
}
}
}
namespace MiEspacio {
class MiPrograma {
}
}
etc
14.2 Alias
En el caso de que se utilicen dos clases con el mismo nombre, es necesario especificar el espacio de
nombres al que pertenece. Ejemplo:
using System.IO; // Espacio de nombres con clases para entrada/salida con ficheros
using System.Windows.Shapes; // Espacio de nombres con clase para dibujo en ventanas
System.IO.Path rutaFichero;
// Para manejar la ruta para localizar un fichero en una estructura de directorios
System.Windows.Shapes.Path curva; // Para dibujar una curva definida por varios puntos
Alternativamente, se pueden definir alias para no tener que utilizar el espacio nombres:
IoPath rutaFichero;
WpfPath curva;
15 Estructuras
Son tambin tipos de dato con valor, permiten agrupar varios datos en una nica variable, con la
posibilidad adicional de aadir cdigo en forma de mtodos.
public double x, y;
// Contiene dos nmeros reales de doble precisin para representar sus coordenadas.
// Los miembros x e y se marcan como pblicos para poder utilizarlos
// directamente desde fuera de la estructura.
}
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 22
EstructuraPunto a, b;
// Crea dos estructuras, con identificadores 'a' y 'b'.
// Por defecto sus campos 'x' e 'y' se inicializan con valores 0.
a.x = 1;
a.y = 2;
// Da valor a los miembros de la estructura 'a'
b.x = 3;
// Modifica la coordenada 'x' del punto representado por 'b'
// La estructura 'a' no se modifica
double d = a.distanciaA(b);
// Pasa la estructura 'b' por valor al mtodo 'distanciaA', que se ejecuta sobre
// la estructura 'a'. Guarda el resultado en 'd'.
} // Fin de Main
Cuando se copia una estructura en otra, se copian todos los valores almacenados
a b a b
Las referencias apuntan al objetos que se crean y destruyen durante la ejecucin del programa.
public double x, y;
// Contiene dos nmeros reales de doble precisin para representar sus coordenadas.
// Los miembros x e y se marcan como pblicos para poder utilizarlos
// directamente desde fuera de la clase.
ClasePunto a, b;
// Crea dos referencias, con identificadores 'a' y 'b'.
// Por defecto estas referencias valen 'null', indicando que no apuntan a
// ningn objeto
a.x = 1;
a.y = 2;
// Mediante la referencia 'a' podemos modificar los campos pblicos 'x' e 'y'
// del objeto apuntado
b = a; // Hace que la referencia 'b' apunte al mismo objeto apuntado por 'a'
b.x = 3;
// Modifica la coordenada 'x' del punto representado por el objeto apuntado por
// 'b'. La referencia 'a' apunta al mismo objeto, por lo que se est modificando
// el mismo punto
double d = a.distanciaA(b);
// Pasa la referencia 'b' por valor al mtodo 'distanciaA', que se ejecuta sobre
// el obejto apuntado por 'a'. Guarda el resultado en 'd'.
} // Fin de Main
a b a b
x 1.0 x x 1.0 x
y 2.0 y y 2.0 y
17 Mtodos
17.1 Pase de parmetros por valor
El mtodo maneja el valor pasado en un dato local que desaparece cuando finaliza su ejecucin
using System;
class MiPrograma {
x 4
static int doble (int dato) {
dato *= 2;
return dato;
} y
}
}
Al mtodo se le pasa como parmetro una referencia al dato que tiene que modificar
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 25
using System;
namespace MiEspacio {
Al final de la funcin duplica:
class MiPrograma {
}
}
namespace MiEspacio { x 4
class MiPrograma { y 8
static void duplica (int dato, out int doble) {
doble = dato * 2; dato 4
}
doble
static void Main() {
int x = 4, y;
duplica (x, out y);
}
}
}
18 Constructores
Cada clase puede disponer de uno o varios constructores
Permiten indicar cmo se inicializan los objetos a partir de diferentes tipos de fuentes de informacin
Marcados con public para poder utilizarlos fuera de la clase donde estn definidos
using System;
namespace MiEspacio {
public double re, im; // Cada complejo tiene su parte real e imaginaria
class MiPrograma {
19 Instrucciones
Visual Basic C#, C, C++, Java, PHP, etc
Dim dato, absoluto As Integer int dato, absoluto;
x = 0 x = 0;
x = 3 x = 3;
x = 3 x = 3;
Do While x > 0 do
x = x - 1 x = x - 1;
Loop while (x > 0);
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 27
x = 7 x = 7;
y = 4 y = 4;
- Operadores binarios:
- Aritmticos: +, -, *, /, %
- Desplazamientos: >>, <<
- Comparacin: >, <, >=, <=, ==, !=
- Lgicos: &, |, ^
Con implicit tambin podemos indicar en mtodos estticos cmo se realizan conversiones entre
objetos y otros tipos
using System;
namespace MiEspacio {
public double re, im; // Cada complejo tiene su parte real e imaginaria
public static Complejo operator - (Complejo c1, Complejo c2) { // Definicin de la resta
return new Complejo(c1.re - c2.re, c1.im - c2.im);
}
public static Complejo operator - (Complejo c1) { // Definicin del cambio de signo
return new Complejo(- c1.re, - c1.im);
}
public static Complejo operator ~ (Complejo c1) { // Definicin del complejo conjugado
return new Complejo(c1.re, -c1.im); // Cambio de signo en parte imaginaria
}
class MiPrograma {
Complejo a, b, c, d;
21 Matrices
Son tipos referencia, por lo que es necesario crearlas dinmicamente en una instruccin del programa
mediante el uso del operador new
Ejemplos:
int j;
for (i = 0; i < m2.GetLength(0); i ++) // i recorre las filas, de 0 a 1
for (j = 0; j < m2.GetLength(1); j ++) // j recorre las columnas, de 0 a 2
m2[i,j] = i * 10 + j;
int[] m1 = new int[10]; // Crea una matriz de 10 enteros apuntada por la referencia 'm1'
int[] m2; // Referencia 'm2' que no apunta a ninguna matriz por ahora
m1[0] = 1234; // Carga el valor 1234 en la primera posicin de la matriz apuntada por 'm1'
m2 = m1; // La referencia 'm2' apunta a la misma matriz apuntada por 'm1'
m2[0] = -123; // Sustituye el valor 1234 en la pimera posicin de la matriz por el valor -123
using System;
namespace MiEspacio {
class MiPrograma {
static int maximo (int[] matriz) { // Devuelve el valor mximo encontrado en la matriz
int resultado = matriz[0]; // El primer candidato es el primer dato
foreach (int dato in matriz) // Para cada dato almacenado en la matriz ...
if (dato > resultado) // Si es mayor que el candidato ...
resultado = dato; // Actualiza el resultado
return resultado; // Devuelve el resultado
}
}
}
22 Colecciones
Permiten acumular un nmero indeterminado de objetos y datos
Existen clases predefinidas en .NET Framework para el manejo de varios tipos de colecciones
22.1 Listas
namespace Listas {
class Programa {
lista.AddRange(americanos);
// Aade los elementos de una lista al final de otra lista
string[] m = lista.ToArray();
// Convierte una lista en una matriz
lista.Insert(1, "Noruega");
// Inserta un nuevo elemento en una posicin
lista.Add("Noruega");
lista.Add("Austria"); // Una lista puede tener elementos repetidos
}
}
}
22.2 Diccionarios
using System;
using System.Collections.Generic;
namespace MiEspacio {
class MiClase {
}
}
}
using System;
using System.Collections.Generic;
namespace MiEspacio {
class MiClase {
if (posiciones.ContainsKey("Redondela"))
Console.WriteLine("Coordenadas de Redondela = {0}",
posiciones["Redondela"].aCadena());
else Console.WriteLine("No tengo las coordenadas de Redondela");
// Muestra las coordenadas de Redondela
23 Propiedades
Los objetos puede disponer propiedades para que podamos intercambiar informacin con ellos
mediante operaciones de lectura/escritura de forma similar a como se maneja una variable
La ventaja es que podemos controlar cmo se realizan esas lecturas y escrituras mediante la definicin
de las operaciones get y set para cada propiedad en la clase correspondiente
En una clase se suelen definir datos privados que slo se pueden manejar desde los mtodos y
propiedades de esa clase. Mediante propiedades pblicas podemos controlar cmo se realizan las
operaciones de lectura/escitura sobre los datos
Las propiedades para las cuales no se define la accin set, son propiedades de slo lectura. Si no se
define la accin get, son propiedades de slo escritura
Ejemplo:
namespace MiEspacio {
class Programa {
Console.WriteLine (m.Resultado);
// Calcula y lee el resultado, mostrndolo en pantalla
Ejemplo:
class Program {
return temperatura;
// Devuelve el resultado
}
double T;
if (Double.IsNaN(T)) // Si no es vlida
- Propagacin de excepciones
Ejemplo:
class Program {
return temperatura;
// Devuelve el resultado
}
double T;
}
}
25 Herencia
Se puede crear una nueva clase derivada que hereda todo lo definido en otra clase base
Los constructores de las clases derivadas tienen que llamar en primer trmino a algn constructor de la
clase base utilizando la palabra reservada base
Los mtodos virtual de una clase base se pueden redefinir en una clase derivada utilizando el mismo
identificador y parmetros y marcndolos con override
Los mtodos redefinidos suelen hacer uso del mismo mtodo de la clase base. Para ello se utiliza la
palabra reservada base
Los miembros privados de la clase base se pueden utilizar en las clases derivadas marcndolos con
protected
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 36
Existe una clase Object predefinida que acta como clase base para todas las clases utilizadas en el
programa. Dispone de un mtodo virtual ToString(), que se puede redefinir en cualquier clase para
convertir un objeto a cadena de caracteres, por ejemplo, para visualizarlo en pantalla
Ejemplo:
using System;
namespace MiEspacio {
protected double x, y;
// Coordenadas del punto. Protegidas para que no puedan modificarse
// fuera de la clase ni de clases derivadas de esta.
x += vector.x;
y += vector.y;
}
public double leeX() { // Para poder leer la coordenada x desde otras clases
return x;
}
public double leeY() { // Para poder leer la coordenada x desde otras clases
return y;
}
Punto desplazamiento;
// Aade un vector de desplazamiento para obtener el otro extremo de la lnea
public Linea(float ox, float oy, float dx, float dy) : base(ox, oy) {
// Constructor
// Lnea situada en (ox, oy) y con vector de desplazamiento (dx, dy)
// Llama al constructor de la clase base para inicializar la posicin
public Arco(float cx, float cy, float r, float ai, float af) : base(cx, cy, r) {
// Constructor
// Arco en (cx, cy), radio r y ngulos ai y af
// Llama al constructor del crculo para inicializar su posicin y radio
class MiPrograma {
Console.WriteLine(p.ToString());
Console.WriteLine(l.ToString());
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 38
c.traslada(p);
Console.WriteLine(c.ToString());
a.traslada(p);
a.escala(0.5);
Console.WriteLine(a.ToString());
}
}
}
En la clase abstracta, los mtodos abstractos estn declarados y no definidos, es decir, para cada
mtodo abstracto se indica un identificador, un tipo de valor de retorno y una lista de parmetros, no se
definen sus instrucciones
Los mtodos abstractos actan como mtodos virtuales cuyas instrucciones se pueden redefinir en
clases derivadas
Ejemplo:
using System;
namespace MiEspacio {
class MiPrograma {
}
}
Otro ejemplo:
using System;
using System.Collections.Generic;
namespace MiEspacio {
protected double x, y;
// Coordenadas del punto. Protegidas para que puedan modificarse
// slo en esta clase y en clases derivadas
x += vector.x;
y += vector.y;
}
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 40
public double leeX() { // Para poder leer la coordenada x desde otras clases
return x;
}
public double leeY() { // Para poder leer la coordenada x desde otras clases
return y;
}
Punto desplazamiento;
// Aade un vector de desplazamiento para obtener el otro extremo de la lnea
public Linea(float ox, float oy, float dx, float dy) : base(ox, oy) {
// Constructor
// Lnea situada en (ox, oy) y con vector de desplazamiento (dx, dy)
// Llama al constructor de la clase base para inicializar la posicin
public Arco(float cx, float cy, float r, float ai, float af) : base(cx, cy, r) {
// Constructor
// Arco en (cx, cy), radio r y ngulos ai y af
// Llama al constructor del crculo para inicializar su posicin y radio
List<ElementoGrafico> elementos;
// Los elementos grficos que componen el dibujo se manejan en una lista
elementos.Add(elemento);
}
double resultado = 0;
foreach (ElementoGrafico elemento in elementos)
resultado += elemento.superficie();
return resultado;
}
class MiPrograma {
}
}
27 Interfaces
Una clase puede ser clase derivada de otra clase base. No puede ser derivada de varias clases base.
La herencia mltiple se puede implantar mediante interfaces. Una clase puede implantar varias
interfaces.
Una interfaz slo puede contener declaraciones (cabeceras sin instrucciones) de mtodos y de
propiedades, todos pblicos. No puede contener datos.
Ejemplo:
using System;
namespace MiEspacio {
interface IComunicacion {
string Sonido ();
}
interface IAlimentacion {
string Alimento ();
}
class MiPrograma {
}
}
Ejemplo: una pantalla de 19 pulgadas con una resolucin de 1600x1200 puntos tiene una densidad de
puntos:
1600 + 1200
= 100
19
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 45
Esto significa que todos los elementos visuales de la aplicacin se van a mostrar con unas
dimensiones ligeramente ms pequeas en esta pantalla
Para que esto no suceda, en Windows se puede modificar el DPI utilizado por defecto. Esto se configura
yendo al escritorio y luego con el botn derecho Personalizar - Pantalla - Establecer tamao de texto
personalizado
Es una parte del sistema operativo con herramientas para la generacin y ejecucin de aplicaciones,
bibliotecas de clases predefinidas y funcionalidades diferentes segn su versin
Cuando elaboramos una nueva aplicacin en Visual Studio, es necesario indicar para qu version de
.NET Framework vamos a preparar el programa
Es un lenguaje de descripcin de informacin desarrollado por el W3C (World Wide Web Consortium)
En un archivo de texto se describe toda la informacin, utilizando para ello etiquetas tags y atributos
Las etiquetas permiten establecer una organizacin en rbol. Dentro de cada etiqueta se pueden
establecer atributos
- Ejemplo: fichero con datos sobre varias personas, utilizando las etiquetas datos, persona, dni, nombre,
direccion, email
<persona>
<dni>654321</dni>
<nombre>Juan</nombre>
<direccion>Monforte</direccion>
<email>juan@ejemplo.com</email>
</persona>
</datos>
<persona dni="654321">
<nombre>Juan</nombre>
<direccion>Monforte</direccion>
<email>juan@ejemplo.com</email>
</persona>
</datos>
En XML se utilizan espacios de nombres para diferenciar etiquetas que pueden utilizar el mismo
identificador pero que tienen diferente significado. Ejemplo:
En esta informacin XML, las etiquetas nombre y edad tienen diferente significado segn el nivel dnde
se utilizan. Se pueden diferenciar claramente si pertenecen a espacios de nombres distintos
<?xml version="1.0" encoding="utf-8"?>
<datos xmlns:per="http://ejemplo.com/persona" xmlns:mas="http://ejemplo.com/mascota">
<per:persona>
<per:nombre>Ana</per:nombre>
<per:edad>30</per:edad>
<per:email>ana@ejemplo.com</per:email>
<mas:mascota>
<mas:especie>perro</mas:especie>
<mas:nombre>Trosky</mas:nombre>
<mas:edad>3</mas:edad>
</mas:mascota>
</per:persona>
</datos>
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 47
Cada espacio de nombres xmlns (XML name space) tiene un identificador (ejemplo: per) y una cadena
de caracteres nica (ejemplo: ="http://ejemplo.com/persona") que lo identifica. Esta cadena suele ser
un URI (Universal Resource Identifier) en el que se utiliza un nombre de dominio nico contratado en
Internet
Los espacios de nombres tambin se pueden aplicar si la informacin est descrita en atributos:
28.4 XAML
Basado en XML
El objetivo es separar el diseo grfico del cdigo que rige la lgica del programa. De esta forma, los
diseadores grficos pueden trabajar de forma independiente de los programadores, incluso con otras
herramientas de diseo
Cada etiqueta XAML corresponde a una clase con el mismo nombre. Por ejemplo, la etiqueta Button
corresponde a la clase Button en el programa
Si una etiqueta est contenida en otra, los correspondientes elementos visuales estn contenidos uno
dentro del otro
Las propiedades de cada elemento se indican mediante atributos o con etiquetas adicionales
Ejemplo:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApp1" x:Class="WpfApp1.MainWindow"
Title="MainWindow" Height="177" Width="282">
<Grid>
</Grid>
</Window>
Para cada componente, se puede indicar mediante el atributo x:Name el identificador que se utilizar en
el programa para la referencia que apuntar al objeto correspondiente
Para el caso de los componentes Label y Button, el texto que se muestra sobre el componente se
establece en el atributo Content
Utilizando el atributo Margin, se pueden establecer mrgenes izquierdo, superior, derecho, inferior
En el caso del botn, en el atributo Click se indica que cuando el usuario pulse con el ratn, el evento
correspondiente lo atender el mtodo botonDuplica_Click
Este archivo XAML se puede editar, pero lo habitual es utilizar el diseador de interfaces para generarlo
automticamente, para establecer las propiedades de cada componente:
En el proyecto se crea un archivo fuente para que podamos definir el comportamiento del programa
mediante mtodos en C#
using System;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// Con estas sentencias using se puede acceder a las clases definidas dentro
// de estos espacios de nombres
namespace WpfApp1 {
int x = Convert.ToInt32(editorDato.Text);
// Recoge el texto escrito en el editor donde se indica el dato a duplicar
// y lo convierte a nmero entero de 32 bits
x = x * 2;
// Lo duplica
}
}
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 50
Normalmente las aplicaciones hay que protegerlas frente a la introduccin de datos incorrectos que
pueden provocar excepciones que finalizan la ejecucin del programa de forma inesperada:
int x = Convert.ToInt32(editorDato.Text);
// Convierte el texto a nmero entero
botonDuplica.IsEnabled = true;
editorDato.Foreground = Brushes.Black;
// Si no hay problemas en la conversin, habilita el botn de duplicado y
// establece color negro para el texto del editor
}
catch (Exception ex) { // Si hubo algn problema en la conversin ...
botonDuplica.IsEnabled = false;
editorDato.Foreground = Brushes.Red;
// Deshabilita el botn de duplicado y establece color rojo para el texto
// del editor
}
}
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 51
29 Distribucin Layout
Existen varios tipos de componentes contenedores que permiten disponer otros componentes en su
interior, para poder organizar la interfaz con el usuario
Cada componente tiene una serie de propiedades que indican cmo se distribuyen en su contenedor
Ejemplo: HorizontalAlignment="Left"
30 Contenedores
Las dimensiones y la posicin de los componentes dentro del contenedor se ajustan en funcin de las
dimensiones del contenedor, aplicando unas reglas que dependen del tipo de contenedor:
30.1 Grid
Organizacin en formato tabla, con todos los elementos situados en filas y columnas.
Por defecto hay nicamente una fila y columna
<Grid x:Name="tabla">
</Grid>
Se pueden definir colecciones de filas y columnas y situar otros controles en la posicin deseada
Por ejemplo: tres filas y dos columnas
<Grid x:Name="tabla">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
</Grid>
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 52
Las filas y columnas se pueden dimensionar con un tamao fijo o indicar con un * que se ocupar el
resto del espacio disponible. Tambin se puede indicar que ajusten su tamao a su contenido mediante
Auto
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="3*"/>
</Grid.RowDefinitions>
</Grid>
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 53
30.2 StackPanel
</StackPanel>
30.3 Canvas
Los componentes se sitan estableciendo una posicin absoluta con respecto al origen, utilizando los
atributos Canvas.Top y Canvas.Left
<Canvas >
<Label FontSize="20" Content="Dato" Canvas.Left="40" Canvas.Top="30"/>
<TextBox FontSize="20" Canvas.Left="98" Canvas.Top="35" Width="120"/>
<Button FontSize="15" Content="Introducir" Canvas.Left="120" Canvas.Top="80" Width="75"/>
</Canvas>
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 54
30.4 Dockpanel
Todos los componentes se ajustan contra los bordes del contenedor y ocupan todo su espacio
Ejemplo:
<DockPanel LastChildFill="True">
</StackPanel>
</DockPanel>
En el contenedor de tipo StackPanel, se indica para sus componentes (dos botones) una organizacin
horizontal y alineada a la derecha. Tambin se indica que ocupa la posicin inferior en el DockPanel
30.5 ScrollViewer
Cuando hay que mostrar demasiada informacin, es til poder disponer de barras de desplazamiento
Ejemplo:
</StackPanel>
</ScrollViewer>
31 Controles comunes
31.1 Label
31.2 TextBlock
Para mostrar texto con posibilidad de utilizar diferentes juegos de caracteres, texto multilnea, etc.
<ScrollViewer>
</ScrollViewer>
</Border>
31.3 Button
Botones para ejecutar ciertas acciones cuando el usuario hace click con el ratn
Cuando se pulsa el botn, se genera un evento Click para el que preparamos un mtodo
31.4 TextBox
31.5 CheckBox
Una casilla con un texto que se puede marcar o desmarcar. El texto se indica en la propiedad Content.
Cuando el usuario pulsa el CheckBox para cambiar su estado, se produce el evento Click
void actualizaSeleccionados() {
// Actualiza el texto de la etiqueta donde se muestran qu CheckBox estn marcados
31.6 RadioButton
Todas las opciones relacionadas entre s se incluyen dentro del mismo contenedor. Por ejemplo, dentro
de un StackPanel:
</StackPanel>
double anguloGrados;
31.7 ListBox
Permite mostrar varios elementos (etiquetas, checkbox, etc.) en una lista y seleccionar uno o varios.
El evento SelectionChanged se produce cada vez que el usuario modifica la seleccin en la lista.
31.8 ComboBox
31.9 Slider
El usuario puede arrastrar un cursor a lo largo de una lnea para establecer un valor.
Cuando el usuario realiza cualquier modificacin del valor, se genera el evento ValueChanged.
31.10 Image
31.11 Rectangle
Estructura Margin para establecer la posicin con respecto a su contenedor. En esta estructura hay
propiedades Top, Left, Right, Bottom para establecer mrgen superior, izquierdo, derecho e inferior.
Ejemplo: dibujar rectngulos que indican la cantidad de producto que hay en un depsito en funcin de
la posicin de un Slider
31.12 Mens
Coleccin de MenuItem que pueden ser opciones terminales o submens que son a su vez colecciones
de MenuItem
Cuando el usuario elige una opcin terminal, se produce el evento Click sobre el MenuItem
31.13 Iconos
Se pueden incorporar como recursos para poder utilizarlos en diferentes partes de la aplicacin:
- Icono para la aplicacin, que aparecer cuando se instala, cuando se minimiza y en la barra superior.
- etc.
En el proyecto de la aplicacin se puede crear un directorio de iconos, pinchando con el botn derecho
sobre el proyecto y Add - New Folder, y luego se pueden aadir con Add - Existing Item
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 66
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication3"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" Icon="iconos/aplicacion.ico">
<ToolBarTray >
<ToolBar>
<Button ToolTip="Crea un documento nuevo" Click="FicheroNuevo_Click">
<Image Source="iconos/nuevo.png" />
</Button>
<Button ToolTip="Abre un documento" Click="FicheroAbrir_Click">
<Image Source="iconos/abrir.png" />
</Button>
<Button ToolTip="Guarda el documento" Click="FicheroGuardar_Click">
<Image Source="iconos/guardar.png" />
</Button>
</ToolBar>
<ToolBar>
<Button ToolTip="Salir de la aplicacin" Click="FicheroSalir_Click">
<Image Source="iconos/salir.png" />
</Button>
</ToolBar>
</ToolBarTray>
</StackPanel>
</Window>
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 67
32 Eventos
El grueso del cdigo de las aplicaciones corresponden a mtodos que se activan mediante eventos
Loaded: adems de inicializado, al componente se le han aplicado estilos y relaciones con datos
Activated:en el caso de una ventana, cuando se muestra por primera vez o cuando el usuario
cambia de ventana y la activa
Closed: cuando se cierra definitivamente una ventana. Puede servir para guardar el estado de la
aplicacin en un archivo para poder recuperarla en una ejecucin posterior.
etc.
- etc
Ejemplo:
33 Temporizaciones
Se pueden crear temporizadores para ejecutar cdigo cuando transcurre un cierto intervalo de tiempo.
Ejemplo: un segundero
namespace WpfApplication1 {
public MainWindow() {
InitializeComponent();
}
System.Windows.Threading.DispatcherTimer temporizador;
// Objeto para implantar temporizaciones
temporizador.Start();
// Arranca el temporizador
}
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 69
segundos++;
etiquetaTiempo.Content = "Tiempo = " + segundos.ToString() + " s.";
}
}
}
34 Grficas
Para generar grficas que muestran la evolucin temporal de una o varias variables de un proceso, se
puede utilizar un Canvas donde se pueden mostrar elementos grficos generados dinmicamente
durante la ejecucin del programa
Ejemplo: una grfica de una seal a la que se aade un nuevo valor recogido de un Slider a cada 0.1 s
y de forma que se desplaza hacia la izquierda cuando llega al extremo derecho
System.Windows.Threading.DispatcherTimer temporizador;
// Objeto para implantar temporizaciones
temporizador.Start();
// Arranca el temporizador
}
else nPuntosEnCanvas++; // Si no, indica que se va a aadir un nuevo punto
35 Controles de usuario
El programador puede crear sus propios controles para
poder reutilizarlos varias veces en la misma aplicacin y en
aplicaciones diferentes
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:BibliotecaControles" x:Class="BibliotecaControles.Deposito"
mc:Ignorable="d" Width="113" Height="268" SizeChanged="Deposito_SizeChanged">
<Grid >
</Grid>
</UserControl>
En la imagen, con Margin="0" y Stretch="Fill" se logra que ocupe toda la superficie del control
El rectngulo rFondo es el rectngulo superior, en color gris, para representar el fondo del depsito
void redibujaDeposito() {
// Dibuja el depsito segn su estado actual
rFondo.Width = 20 * escalaX;
rFondo.Height = fondoPuntos;
// Establece las dimensiones del rectngulo del fondo
rProducto.Fill = brochaRelleno;
// Cubre de color el rectngulo del producto
}
redibujaDeposito();
// Vuelve a dibujar el control con las nuevas dimensiones
}
}
Ejemplo: una flecha de direccin que se puede rotar y que se puede mostrar intermitente
- Proyecto BibliotecaControles de tipo WPF User Control Library donde se define el control
FlechaIntermitente.
- Proyecto Programa donde se define una aplicacin que utiliza ese control de usuario. En References
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 74
FlechaIntermitente.xaml:
<UserControl x:Class="BibliotecaControles.FlechaIntermitente"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:BibliotecaControles"
mc:Ignorable="d"
d:DesignHeight="100" d:DesignWidth="50">
<Grid Loaded="Grid_Loaded" SizeChanged="Grid_SizeChanged">
<Canvas x:Name="canvas"/>
</Grid>
</UserControl>
FlechaIntermitente.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 75
namespace BibliotecaControles {
InitializeComponent();
get {
return intermitente; // Devuelve una copia de la variable
}
set {
intermitente = value; // Actualiza la variable
get {
return angulo; // Devuelve una copia de la variable
}
set {
angulo = value; // Actualiza la variable
dibujaFlecha(); // Redibuja la flecha con el nuevo ngulo
}
}
flecha.HorizontalAlignment = HorizontalAlignment.Center;
flecha.VerticalAlignment = VerticalAlignment.Center;
// La flecha se sita en el centro del canvas
MainWindow.xaml:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Programa"
xmlns:BibliotecaControles="clr-namespace:BibliotecaControles;assembly=WpfControlLibrary1"
x:Class="Programa.MainWindow"
mc:Ignorable="d"
Title="MainWindow" Height="249" Width="403">
<Grid>
<Slider x:Name="slider" HorizontalAlignment="Left" Margin="246,108,0,0"
VerticalAlignment="Top" Width="123" LargeChange="0" Maximum="360"
ValueChanged="slider_ValueChanged"/>
Desarrollo OOP - Informtica Industrial 2017/2018 - Escuela de Ingeniera Industrial - Universidad de Vigo 77
MainWindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Programa {
flecha.Angulo = slider.Value;
// El ngulo de rotacin de la flecha lo fija el valor del slider
36 Interfaces flexibles
En muchos tipos de situaciones el
programa tiene que utilizar un
nmero variable de controles en
funcin de ciertos datos
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Programa"
xmlns:BibliotecaControles="clr-namespace:BibliotecaControles;assembly=BibliotecaControles"
x:Class="Programa.MainWindow" mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox x:Name="editorNDatos" HorizontalAlignment="Left" Height="23"
Margin="293,22,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="49"/>
<Button x:Name="botonNDatos" Content="OK" HorizontalAlignment="Left"
Margin="362,24,0,0" VerticalAlignment="Top" Width="48" Click="botonNDatos_Click"/>
<Label x:Name="label" Content="Num. depsitos" HorizontalAlignment="Left"
Margin="196,21,0,0" VerticalAlignment="Top"/>
<StackPanel Orientation="Horizontal" x:Name="panel" Margin="0,60,0,0" />
</Grid>
</Window>
panel.Children.Clear();
// Borra toda la coleccin de controles existentes en el panel
}
}