Documente Academic
Documente Profesional
Documente Cultură
Programacin
Orientada a
Objetos
Presentacin..3
Modulo A
Modulo B
Semana 1: Introduccin a la Plataforma .NET136
Semana 2: Uso de Estructuras de Control..194
Semana 3: Introduccion a la Estructura de Datos(Arreglos).233
Semana 4: Procedimientos y Funciones...239
Semana 5: Funciones de Sistema y Formatos ..284
Semana 6: Programacion Orientados a Objetos.308
Semana 7: Manejo de Colecciones350
Semana 8: Manejo de Archivos392
Semana 9: Manejo de Streams de Datos y Archivos412
Bibliografa: 421
PRESENTACIN
Esta gua didctica es un material de ayuda institucional, perteneciente a las
especialidades de computacin, Ingeniera de Software e Ingeniera de Redes y
Comunicaciones tiene por finalidad proporcionar los conocimientos de la
programacin orientada a Objetos a los estudiantes del segundo ciclo de estudios.
La Organizacin SISE, lder en la enseanza tecnolgica a nivel superior, promueve
la elaboracin de materiales educativos, en concordancia a las exigencias de las
tecnologas de estos tiempos, que permiten la creacin de nuevas herramientas de
aprendizaje con el objetivo de facilitar el acceso de los estudiantes a la educacin en
el marco del desarrollo tecnolgico de la informtica de las telecomunicaciones.
Esta gua se divide en 2 mdulos y cada una de ellas en 9 semanas. Permite conocer
las herramientas indispensables para la elaboracin de aplicaciones con el uso de la
tcnica O.O. Se inicia con el uso de tcnica en manejo de datos en memoria y en el
manejo de capas donde estas tcnicas bsicas se necesitan para dar solucin a una
determinada proposicin o problema.
En este proceso el alumno aprender instrucciones que le permitirn evaluar
expresiones para luego procesar un conjunto de sentencias. Tambin aprender el
manejo de una aplicacin a nivel de contenedores.
La implementacin y uso de Capas dentro de la aplicacin en escritorio permitirn que
el alumno aplique la tcnica Orientada a objetos.
Todas estas herramientas darn un soporte solido al alumno para aprender a
programar en cualquier lenguaje Orientada a Objetos(JAVA, .NET, Visual C,etc).
Este material en su primera edicin, servir para ayudar a nuestros estudiantes
SISESINOS.
Arreglos
Contenidos
-
____________________________________________________________________________
ARREGLOS LINEALES
Un arreglo es una coleccin de datos del mismo tipo, que se almacenan en posiciones
consecutivas de memoria y reciben un nombre comn. Para referirse a un determinado
elemento de un arreglo se deber utilizar el nombre del arreglo acompaado de un ndice el
cual especifica la posicin relativa en que se encuentra el elemento.
Unidimensionales (vectores).
Declaracin de un arreglo:
<tipo de dato>: nombre_variable [Tamao]
Con esto diremos que se est definiendo un atributo de tipo arreglo y estamos
determinando el tipo de dato y el tamao de registros.
Ejemplos:
entero: Numeros[10]
decimal: talla [5]
caracter nombres [8]
talla[4]=170.5
nombre[6]=Vernica
Numero[5]=115
talla[0]=168.52
nombre[3]=William
Numero[10]=652
talla[2]=102.62
nombre[1]=Angie
Numero[0]=52
talla[1]=85.62
nombre[8]=Sebastian
ndice
Valores
ndice
Valores
1
0
2
152
Arreglo Talla
0
Arreglo
Nombres
0
null
3
0
5
115
168.52
1
Angie
4
0
2
null
7
0
8
0
9
0
85.62
102.6 0
5
null
4
William null
6
0
10
652
170.5 0
7
Vernica null
8
Sebastin
Variable=nombre_Arreglo[ndice]
escribir (Variable) o escribir (nombre_Arrgelo[indice)
Ejemplo:
X=nombre[1]
escribir(X)
_________________________________________________________
escribir (nombre[8])
b. Leer: se podr ingresar datos al arreglo en forma contigua de acuerdo al ndice. Es por
ello que se usara a una estructura iterativa que puede ser Mientras(while), Desde (do)
o Repetir(do..while).
Leer(Arreglo[indice])
Nota Para que esta lectura se repita hasta el total de tamao del arreglo se deber de
usar a una estructura Iterativa.
T = 10;
decimal :notas[T]
2. Llenar el vector con los datos: Se puede hacer en el momento de la declaracin
asignando al vector los valores que necesitamos almacenar.
Ejemplo.
notas[10] = {2.3 , 3.5 , 4.2 , 3.3 , 3.0 , 4.9 , 4.2 , 3.0 , 2.0 , 1.5 };
recorriendo el arreglo as dndole nuevos valores:
desde(i = 1 hasta N)
leer( notas[i] )
fin_desde
3. Manipular la informacin guardada en el vector. Para esto es necesario recorrer dicha
estructura y se puede hacer de la siguiente manera.
desde(i = 1 hasta N)
escribir ( notas[i] )
fin_desde
Tambien se puede leer y a la vez escribir los datos ingresados al arreglo
desde(i = 1 hasta N)
leer( notas[i] )
escribir ( notas[i] )
fin_desde
Ejemplos:
1. Crear un Arreglo que permita ingresar 10 Apellidos.
caracter: Apellidos[10]
desde(i =1 hasta 10)
leer(Apellidos[i] )
escribir (Apellidos [i] )
fin_desde
2. Crear un Arreglo que permita ingresar 15 promedios del aula 307 del curso de
fundamentos de programacin
decimal: Promedios[15]
desde(i = 1 hasta 15)
leer(Promedios[i] )
escribir (Promedios [i] )
fin_desde
desde(i = 1 hasta N)
leer(Institutos[i] )
leer(Zonas[i] )
escribir(Institutos[i])
escribir (Zonas[i] )
fin_desde
6. Crear un Arreglo que ingrese 15 reas y sus respectitos Sueldos y mostrar cuantos
son del rea de Sistemas,Contabilidad,
Cuantos superan al sueldo mnimo
Cuntos ganan entre 1000 y 2500.
Constante N=15
entero:Sueldo[N]
Carcter:Area[N]
desde(i = 0 hasta N-1)
leer(Sueldo[i] , Area[i] )
escribir (Sueldo[i] , Area[i] )
si(Area[i]=Sistema)entonces
cs=cs+1
fin_si
si(Area[i]=Contabilidad) entonces
cc=cc+1
fin_si
si(Sueldo[i]>650) entonces
csum=csum+1
fin_si
si(Sueldo[i]>=1000 y Sueldo[i]<=2500) entonces
cr=cr+1
fin_si
fin_desde
escribir(Total del rea de Sistemas: ,cs)
escribir(Total del rea de Contabilidad: ,cc)
escribir(Total de Empleados que ganan ms que el sueldo mnimo: ,csum)
escribir(Total de Empleados que ganan entre 1000 y 2500: ,cr)
10
11
Otro Ejemplo:
String [ ] Coordinadores={Vernica Escobar, Vctor Snchez,Rogelio Tello,Carlos Monge};
O Tambin:
Coordinadores [0] = " Vernica Escobar ";
Coordinadores [1] = " Vctor Snchez ";
Coordinadores [2] = " Rogelio Tello ";
Coordinadores [3] = "Carlos Monge";
Casos Prcticos
1. Ejemplo ingresando valores aleatorios al arreglo:
private void btnAgregar_actionPerformed(ActionEvent e) {
modLstf.clear();
int Numeros[]=new int[10];
for( int i=0; i < 10; i++ ){
Numeros[i] = (int)(Math.random()*100)+1;
modLstf.addElement((i+1)+".- "+Numeros[i] );
}
}
12
2. Almacenar los votos obtenidos por los 20 candidatos. Estos son ingresados por el usuario.
private void btnAgregar_actionPerformed(ActionEvent e) {
int votos[]=new int[20]; //Declara el Arreglo en forma Local
modLstf.clear(); //Limpia todo el contenido de la lista
for( int i=0; i < 20; i++ ){
votos[i] = Integer.parseInt(JOptionPane.showInputDialog( "Ingresar Cantidad de
Votos - "+(i+1)));
modLstf.addElement((i+1)+".- "+votos[i] );
}
}
13
3. Se tiene una lista llamado Amigos: Vernica E., Gelnda D., Victor S., Rogelio T., Waldir C.,
Eduardo A., Carlos M., Henrry Q., Miguel F., Manue T, Juan C.. Se necesita almacenarlo
en un Arreglo y mostrarlo.
4. Se pide crear una lista que almacene 10 registros: estos datos sern Apellidos, edades y
distritos del aula 307.
private void btnAgregar_actionPerformed(ActionEvent e) {
final int t=10;
int edades[]=new int[t];
String apellidos[]=new String[t];
String distritos[]=new String[t];
for( int i=0; i < t; i++ ){
14
15
16
17
ARREGLOS BIDIMENSIONALES
MATRICES
La utilizacin de matrices constituye actualmente una parte esencial de los lenguajes de
programacin, ya que la mayora de los datos se introducen en los ordenadores como tablas
organizadas en filas y columnas: hojas de clculo, bases de datos, Archivos, etc.
Se llama matriz de orden mn a todo conjunto rectangular de elementos Matriz(m)(n)
dispuestos en m lneas horizontales (filas) y n verticales (columnas) de la forma:
Columnas
0
1
2
3
Filas
Ejemplo:
a) Entero: Numeros[5][3]
Cuando se define este espacio en memoria para las matrices establece este espacio.
0
1
2
3
4
b) Caracter: Letras[2][5]
0
1
18
Acceso al contenido
Para poder acceder al contenido:
de una Matriz:
a. Escribir: Obtener el dato de acuerdo al ndice establecido, para ello se deber mostrar
utilizando una variable o mostrndolo directamente.
Variable=Matriz[ndiceFila] [ndiceColumna]
Escribir(Variable) o
Mostar(Matriz[ndiceFila] [ndiceColumna])
Ejemplo:
X=Letras[0][3]
Escribir(X)
el resultado ser O
_________________________________________________________
Escribir(Letras[0][0])
el resultado ser V
19
20
Ejemplos:
En una matriz de dimensiones 5x4 hallar el mayor valor y el menor valor.
Variables
Fi=5
Co=4
Entero: Datos[Fi][Co]
Inicio
mayor=0; menor=1000;
desde(x=0 hasta Fi-1)
desde (y=0 hasta Co-1)
leer(Datos [x] [y])
si (Datos [x] [y]> mayor)
mayor= matriz [x] [y]
si (Datos [x] [y]< menor)
menor= matriz [x] [y]
fin_desde
fin_desde
escribir(mayor, menor)
fin_programa
21
Asignar datos:
numero[0][0]=123;
numero[0][1]=456
Leer datos:
//solo indica el ingreso para esa posicin de la matriz
nmeros[0][2]=Integer.parseInt(JOptionPane.showInputDialog(Ingresar Numero));
En el caso que se desee realizar para toda la matriz debers de usar a una estructura
anidada para el ingreso. Por ejemplo:
//Definimos el total de filas y columnas
final int filas=5;
final int columnas=3;
int numero[][]=new int[filas][columnas];
for(int y=0;y<filas;++y){
for(int x=0;x<columnas;++x){
numero[y][x]= Integer.parseInt(JOptionPane.showInputDialog(Ingresar
Numero));
}
}
22
Jtable es una clase que me permite organizar una determinada informacin en tabla, esta
difiere de una base de datos normal porque al utilizar Jtable t puedes visualizar esta tabla,
brindndole al usuario organizacin de informacin, oportunidades de editar y cambiar el
tamao de las columna entre otras.
Jtable le da al programador muchas facilidades, pues este posee varias caractersticas que
permiten hacer desde tablas con informacin compleja y muy estructurada hasta tablas con
informacin sencilla y "bsica".
DefaultTableModel
La clase Jtable controla como se presentan los datos, para crear un Jtable habr pues que
crear un DefaultTableModel antes. DefaultTableModel lo que hace es predeterminar ciertas
caractersticas para el Jtable, es decir que tu puedes poner ciertos parmetros dentro de un
DefaultTableModel y as no tener que determinarlos siempre. DefaulTableModel guarda los
datos de la tabla para s mismo, es decir, puede tener la informacin de la tabla pero estos
datos son los visualizados por el computador, es decir, para visualizar una tabla el
DEFAULTTABLEMODEL puede tener la informacin pero sin el Jtable no se puede visualizar
para el usuario.
EDITABLE O NO?
Jtable tiene una caracterstica muy llamativa, este permite que el programador pueda decidir
que se edita y que no, sin embargo si el programador dentro de su programa o de su
DEFAULTTABLEMODEL no tiene determinado este aspecto, Jtable automticamente hace
editable las celdas dentro de la tabla.
LA INFORMACIN, Y LAS COLUMNAS?
Jtable te brinda muchas facilidades para poder crear una tabla, y as mismo de llenarla con la
informacin que desees ( nmeros, letras etc...) por lo que sencillamente dentro de una tabla
esta automticamente esta a travs de la informacin debidamente separada - por ""(comillas)
o por , (coma) - es capaz de contabilizarlas y al mismo tiempo llenarla con la informacin que
se le dio; es decir el programador solo se debe encargar de poner los ttulos de las tablas y as
mismo de escribir la informacin en el mismo orden en que desee que salga de acuerdo con los
ttulos y Jtable se encargara automticamente de colocar la informacin donde se le indico.
UN CHECK BOX?
Para un CellRendered con un DefaultTableModel sencillo, tal vez identificar clases pueda ser
algo ms complejo que no pueda hacer, pero para uno un poco ms avanzado, esto sera muy
fcil, y para esto cito el caso de un CHECK BOX(casilla de verificacin) el cual es un
componente grafico generado por Jtable despus de que identifica una informacin tipo
boolean, dndole as la apariencia de un cuadro rellenable, un check box no es ms que eso,
una opcin - que puede ser editable o no.
UN LIST BOX?
En algunas oportunidades, para cierto tipo de informacin que deseamos que el usuario
complete, necesitamos darle a el usuario, cierto tipo de opciones cosa que a travs de un List
Box tu puedes ofrecer al usuario el tipo de respuestas que tu desees que selecciones, este tipo
de organizacin de informacin ya no es tan sencillo como declarar una informacin tipo
boolean, toca crear la lista.
23
jTable1.setModel(modTbDatos);
modTbDatos.setColumnCount(3);
modTbDatos.setRowCount(5);
Ejemplo 01:
24
Ejemplo 02:
Ejemplo 03:
Crear 2 vectores Apellidos y Edades que almacenen 15 registros y debern ser
presentados en el JTable por columnas.
25
modTbDatos.setValueAt(Edad[i],i,1);
}
}
26
3. Realizar
un
subprograma
llamado
llenar_vector_sin_repet
igual
que
llenar_vector_10_elem pero que no introduzca repetidos. Realizar un programa que lo
utilice y muestre por pantalla el contenido del vector.
4. Dada una matriz de 10 x 10, mostrar la suma de las filas y columnas
a) Que fila obtuvo la suma mayor
b) Que columna obtuvo la suma menor.
c) El numero mayor
d) El promedio de la suma
e) El promedio de la columna.
27
Contenidos
-
____________________________________________________________________________
Algoritmos de Ordenamiento
Ordenar es simplemente colocar informacin de una manera especial basndonos en un
criterio de ordenamiento.
Mtodos de ordenamientos.
Existen diferentes mtodos de ordenamiento entre ellas tenemos por Seleccin, Insercin,
Quick Sort, Burbuja, Shell, etc. Dentro de las cuales hablaremos de los mtodos:
El hecho de que la informacin est ordenada, nos sirve para poder encontrarla y accesarla de
manera ms eficiente ya que de lo contrario se tendra que hacer de manera secuencial.
A continuacin se describirn 4 grupos de algoritmos para ordenar informacin:
Algoritmos de insercin:
En este tipo de algoritmo los elementos que van a ser ordenados son considerados uno a la
vez. Cada elemento es INSERTADO en la posicin apropiada con respecto al resto de los
elementos ya ordenados.
Entre estos algoritmos se encuentran el de INSERCION DIRECTA, SHELL SORT, INSERCION
BINARIA y HASHING.
Algoritmos de intercambio:
En este tipo de algoritmos se toman los elementos de dos en dos, se comparan y se
INTERCAMBIAN si no estn en el orden adecuado. Este proceso se repite hasta que se ha
analizado todo el conjunto de elementos y ya no hay intercambios.
Entre estos algoritmos se encuentran el BURBUJA y QUICK SORT.
28
Algoritmos de seleccin:
En este tipo de algoritmos se selecciona o se busca el elemento ms pequeo (o ms grande)
de todo el conjunto de elementos y se coloca en su posicin adecuada. Este proceso se repite
para el resto de los elementos hasta que todos son analizados.
Entre estos algoritmos se encuentra el de SELECCION DIRECTA.
Algoritmos de enumeracin:
En este tipo de algoritmos cada elemento es comparado contra los dems. En la comparacin
se cuenta cuntos elementos son ms pequeos que el elemento que se est analizando,
generando as una ENUMERACION. El nmero generado para cada elemento indicar su
posicin.
Los mtodos simples son: Insercin (o por insercin directa), seleccin, burbuja y shell, en
dnde el ltimo es una extensin al mtodo de insercin, siendo ms rpido. Los mtodos ms
complejos son el quick-sort (ordenacin rpida) y el heap sort.
A continuacin se mostrarn los mtodos de ordenamiento ms simples.
Mtodo Burbuja.
El bubble sort, tambin conocido como ordenamiento burbuja, consiste en comparar un valor
con el siguiente valor y de acuerdo a la condicin se realizara el intercambio entre los datos, y
este recorrido se va ir haciendo hasta culminar todos los elementos N-1 del arreglo.
Algoritmo:
Desde(g=0 hasta N-1)
Mtodo de Shell.
Nombrado as debido a su inventor Donald Shell. Ordenamiento de disminucin incremental,
Ordena subgrupos de elementos separados K unidades (respecto de su posicin en el arreglo)
del arreglo original. El valor K es llamado incremento.
Despus de que los primeros K subgrupos han sido ordenados (generalmente utilizando
INSERCION DIRECTA), se escoge un nuevo valor de K ms pequeo, y el arreglo es de nuevo
partido entre el nuevo conjunto de subgrupos. Cada uno de los subgrupos mayores es
ordenado y el proceso se repite de nuevo con un valor ms pequeo de K.
Eventualmente el valor de K llega a ser 1, de tal manera que el subgrupo consiste de todo el
arreglo ya casi ordenado.
Al principio del proceso se escoge la secuencia de decrecimiento de incrementos; el ltimo
valor debe ser 1. "Es como hacer un ordenamiento de burbuja pero comparando e
intercambiando elementos."
29
Cuando el incremento toma un valor de 1, todos los elementos pasan a formar parte del
subgrupo y se aplica insercin directa.
El mtodo se basa en tomar como salto N/2 (siendo N el nmero de elementos) y luego se va
reduciendo a la mitad en cada repeticin hasta que el salto o distancia vale 1.
Ejemplo:
Para el arreglo a = [6, 1, 5, 2, 3, 4, 0]
Tenemos el siguiente recorrido:
Recorrido
Salto
2,1,4,0,3,5,6
0,1,4,2,3,5,6
(2,0)
0,1,4,2,3,5,6
Ninguno
0,1,2,3,4,5,6
(4,2), (4,3)
0,1,2,3,4,5,6
Ninguno
30
31
Bsqueda
Un algoritmo de bsqueda es aquel que est diseado para localizar un elemento concreto
dentro de una estructura de datos. Consiste en solucionar un problema de existencia o no de
un elemento determinado en un conjunto finito de elementos, es decir, si el elemento en
cuestin pertenece o no a dicho conjunto, adems de su localizacin dentro de ste.
Este problema puede reducirse a devolver la existencia de un nmero en un vector.
Bsqueda secuencial
Permite localizar el dato dentro del arreglo desde la posicin inicial hasta la posicin final, la
existencia se puede asegurar desde el momento que el elemento es localizado (pero no
podemos asegurar la no existencia hasta no haber analizado todos los elementos del arreglo).
Datos de Entrada:
vec: nombre de la coleccin de todos los datos
tam: tamao del vector
dato: elemento que se quiere buscar.
Variables
entero: pos
Inicio
leer(dato)
pos = 0
Mientras(pos < tam)
Si (vec[pos]= dato) entonces
Devolver= verdadero
sino
pos = pos + 1
fin_si
fin_Mientras
Bsqueda binaria
Se utiliza cuando el vector en el que queremos determinar la existencia o no de un elemento
est ordenado, o puede estarlo, este algoritmo reduce el tiempo de bsqueda
considerablemente, ya que disminuye exponencialmente con el nmero de iteraciones.
32
Ejemplos
Caso 01
Dentro de una lista de 10 nombres, verifique si el nombre ingresado existe o no y en que
posicion.
public class FrmBus extends JFrame {
final int tam=5;
String nom[]=new String[tam];
int x;
***
***
***
void agregar(){
if(x<tam){
nom[x]=txtnom.getText();
modlstn.addElement((x+1)+".- "+nom[x]);
++x;
txtnom.setText("");
txtnom.requestFocus();
}else{
JOptionPane.showMessageDialog(null,"Ya
nombres\n"+"Termino el Ingreso");
txtnom.setEnabled(false);
}
}
no
se
puede
ingresar
mas
void busqueda(){
int sw=0,posi=0;
String n=JOptionPane.showInputDialog("Ingresar Nombre a buscar");
for(int f=0;f<x;++f){
if(n.equalsIgnoreCase(nom[f])){
sw=0;
posi=f;
break;
}
else
sw=1;
}
if(sw==0){
lblb.setText("El Nombre Encontrado");
lblp.setText(" "+(posi+1));
}
else
lblb.setText("El Nombre No Existe");
}
33
34
Caso 02
Dentro de una lista de 25 distritos muestre si existe o no el distrito de Villa el Salvador.
Caso 03
Crear una Aplicacin donde permita llenar datos a los vectores Nombres, Apellidos Ao de
Nacimiento y edad. Permitir hasta 20 registros.
La edad se calcula de acuerdo al Ao de Nacimiento
El programa permitir :
o Ordenar por Apellido
o Buscar Datos por Nombres y decir cuntos Nombres son iguales.
Se define la dimensin y
los nombres de los
Arreglos
int Reg;
Se define el Contador
del Registro
private void jbInit() throws Exception {
-----------------------------------------------------//llenando el combo con las fechas
Se Establece valores
al Combo
35
for(int g=1970;g<=2010;++g)
cboAnac.addItem(g);
void LeerDatos(){
Preguntando si el Registro es
if(Reg<filas){
menor al total de Filas.
nom[Reg]=txtNom.getText();
ape[Reg]=txtApe.getText();
Llena los datos a los Arreglos
}
else
JOptionPane.showMessageDialog(null,"Ya no puede ingresar mas registros");
}
Muestra los datos que tiene el
void llenarRegistros(){
Arreglo
modTbDatos.setValueAt((Reg+1),Reg,0);
modTbDatos.setValueAt(nom[Reg],Reg,1);
modTbDatos.setValueAt(ape[Reg],Reg,2);
modTbDatos.setValueAt(anac[Reg],Reg,3);
Incremento el Registro para
modTbDatos.setValueAt(edad[Reg],Reg,4);
controlar el total de datos
++Reg;
ingresados.
}
private void btnAceptar_actionPerformed(ActionEvent e) {
LeerDatos();
llenarRegistros();
}
private void cboAnac_actionPerformed(ActionEvent e) {
anac[Reg]=Integer.parseInt(cboAnac.getSelectedItem().toString());
edad[Reg]=2010-anac[Reg];
lbledad.setText(""+edad[Reg]);
}
void OrdenarB(){
String tempA,tempN;
int tempAn,tempE;
for (int i = 0; i <Reg - 1; i++) {
for (int j = 0; j < Reg - 1; j++) {
if ((ape[j].compareTo(ape[j+1]))>0) {
tempA = ape[j];
ape[j] = ape[j+1];
ape[j+1] = tempA;
//
tempN = nom[j];
nom[j] = nom[j+1];
nom[j+1] = tempN;
Ordenamiento Burbuja.
Por medio del Apellido
//
tempAn = anac[j];
anac[j] = anac[j+1];
anac[j+1] = tempAn;
36
//
tempE = edad[j];
edad[j] = edad[j+1];
edad[j+1] = tempE;
}
}
}
// visualizar datos ordenados
modTbDatos.setRowCount(15);
for(int g=0;g<Reg;++g){
modTbDatos.setValueAt((g+1),g,0);
modTbDatos.setValueAt(nom[g],g,1);
modTbDatos.setValueAt(ape[g],g,2);
modTbDatos.setValueAt(anac[g],g,3);
modTbDatos.setValueAt(edad[g],g,4);
}
}
private void BtnOrdenart_actionPerformed(ActionEvent e) {
modTbDatos.setRowCount(0);
Eliminar todas las filas de la
OrdenarB();
tabla.
}
Llamar al Ordenamiento y
volver a mostrar los datos. Y
se Visualizara en la tabla
ordenado por Apellido.
37
void busqueda_Nom(){
int f=0,c=0;
String Vb=JOptionPane.showInputDialog("Ingresar Nombres a Buscar");
while(f<Reg){
if(Vb.equalsIgnoreCase(nom[f])){
c=c+1;
}
++f;
}
if(c>0)
JOptionPane.showMessageDialog(null,"Nombre Encontrado"+"\n"+"y se Repite
:"+(c)+"Veces");
else
JOptionPane.showMessageDialog(null,"No se Encontrado el Nombre");
}
38
busqueda_Nom();
}
Insertar el Botn Eliminar Registro Intenta estableciendo el siguiente cdigo
39
Contenidos
-
El estado est compuesto de datos, ser uno o varios atributos a los que se habrn
asignado unos valores concretos (datos).
El comportamiento est definido por los procedimientos o mtodos con que puede
operar dicho objeto, es decir, qu operaciones se pueden realizar con l.
La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras
palabras, es su identificador (concepto anlogo al de identificador de una variable o
una constante).
40
Caractersticas de la POO
Existe un acuerdo acerca de qu caractersticas contempla la "orientacin a objetos", las
caractersticas siguientes son las ms importantes:
41
Herencia: las clases no estn aisladas, sino que se relacionan entre s, formando una
jerarqua de clasificacin. Los objetos heredan las propiedades y el comportamiento de
todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y
el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos
especializados de objetos preexistentes. Estos pueden compartir (y extender) su
comportamiento sin tener que volver a implementarlo. Esto suele hacerse
habitualmente agrupando los objetos en clases y estas en rboles o enrejados que
reflejan un comportamiento comn. Cuando un objeto hereda de ms de una clase se
dice que hay herencia mltiple.
Clases en POO
Las clases son declaraciones de objetos, tambin se podran definir como abstracciones de
objetos(quiere decir que la definicin de un objeto es la clase). Cuando programamos un objeto
y definimos sus caractersticas y funcionalidades en realidad lo que estamos haciendo es
programar una clase.
Propiedades en clases
Las propiedades o atributos son las caractersticas de los objetos. Cuando definimos una
propiedad normalmente especificamos su nombre y su tipo. Nos podemos hacer a la idea de
que las propiedades son algo as como variables donde almacenamos datos relacionados con
los objetos.
Objetos en POO
Los objetos son ejemplares de una clase cualquiera. Cuando creamos un ejemplar tenemos
que especificar la clase a partir de la cual se crear. Esta accin de crear un objeto a partir de
una clase se llama instanciar (que viene de una mala traduccin de la palabra instace que en
ingls significa ejemplar). Por ejemplo, un objeto de la clase fraccin es por ejemplo 3/5. El
concepto o definicin de fraccin sera la clase, pero cuando ya estamos hablando de una
fraccin en concreto 4/7, 8/1000 o cualquier otra, la llamamos objeto.
Para crear un objeto se tiene que escribir una instruccin especial que puede ser distinta
dependiendo el lenguaje de programacin que se emplee, pero ser algo parecido a esto.
miCoche = new Coche()
42
Con la palabra new especificamos que se tiene que crear una instancia de la clase que sigue a
continuacin. Dentro de los parntesis podramos colocar parmetros con los que inicializar el
objeto de la clase coche.
Estados en objetos
Cuando tenemos un objeto sus propiedades toman valores. Por ejemplo, cuando tenemos un
coche la propiedad color tomar un valor en concreto, como por ejemplo rojo o gris metalizado.
El valor concreto de una propiedad de un objeto se llama estado.
Para acceder a un estado de un objeto para ver su valor o cambiarlo se utiliza el operador
punto.
miCoche.color = rojo
El objeto es miCoche, luego colocamos el operador punto y por ltimo el nombre e la propiedad
a la que deseamos acceder. En este ejemplo estamos cambiando el valor del estado de la
propiedad del objeto a rojo con una simple asignacin.
Mensajes en objetos
Un mensaje en un objeto es la accin de efectuar una llamada a un mtodo.
Otras cosas
Hay mucho todava que conocer de la POO ya que slo hemos hecho referencia a las cosas
ms bsicas. Tambin existen mecanismos como la herencia y el polimorfismo que son unas
de las posibilidades ms potentes de la POO.
La herencia sirve para crear objetos que incorporen propiedades y mtodos de otros objetos.
As podremos construir unos objetos a partir de otros sin tener que reescribirlo todo.
El polimorfismo sirve para que no tengamos que preocuparnos sobre lo que estamos
trabajando, y abstraernos para definir un cdigo que sea compatible con objetos de varios
tipos.
Son conceptos avanzados que cuesta explicar en las lneas de ese informe. No hay que olvidar
que existen libros enteros dedicados a la POO y aqu solo pretendemos dar un repaso a
algunas cosas para que os suenen cuando tengis que poneros delante de ellas en los
lenguajes de programacin que debe conocer un desarrollador del web.
43
Para crear una clase main (principal), deber de seleccionar la opcin public y generate
Main Method. Y su estructura quedara as.
}
}
Ejemplo 01: mostrar mis datos personales desde una clase Main.
public class ClassEjecutar1 {
public static void main(String[] args) {
//referencia de la clase
ClassEjecutar1 Ejecutar = new ClassEjecutar1();
String nombres="Veronica Ysabel";
String ape="Escobar Runco";
String espe="Computacion e Informatica";
System.out.println("Nombres: "+nombres);
System.out.println("Apellidos: "+ape);
System.out.println("Especialidad: "+espe);
}
}
44
Usando consola
Ejemplo 02: mostrar datos personales ingresado por el usuario desde una clase
Main.
public class ClassEjecutar2 {
public static void main(String[] args) {
//referencia de la clase
ClassEjecutar2 Ejecutar = new ClassEjecutar2();
String nombres=JOptionPane.showInputDialog("Ingresar Nombre");
String ape=JOptionPane.showInputDialog("Ingresar Apellido");
String espe=JOptionPane.showInputDialog("Ingresar Especialidad");
JOptionPane.showMessageDialog(null,"Nombres: "+nombres+"\n"+"Apellidos:"+ape
+"\n" +"Especialidad: "+espe,"Datos Personales",1);
}
}
Usando Message
45
46
Usando clases
public class SubClaseHija1 {
//Metodos
public int Suma(int a,int b){
return(a+b);
}
public int Resta(int a,int b){
return(a-b);
}
public int Multiplica(int a,int b){
return(a*b);
}
public int divi(int a,int b){
return(a/b);
}
}
--------------------------------------------------------------------------------------package prjcaso1;
import javax.swing.JOptionPane;
public class ClassEjecutar extends
SubClaseHija1 {
//Atributos Globales
public static void main(String[] args) {
//referencia de la clase
ClassEjecutar Ejecutar = new ClassEjecutar();
//atributos Locales
int num1, num2;
num1=Integer.parseInt(JOptionPane.showInputDialog("Ingrece el #1"));
num2=Integer.parseInt(JOptionPane.showInputDialog("Ingrece el #2"));
JOptionPane.showMessageDialog(null,"La suma de\t"+num1+"+"+num2+"="+
Ejecutar.Suma(num1,num2),"Operacion de Suma",2);
JOptionPane.showMessageDialog(null,"La resta de\t"+num1+"-"+num2+"="+
Ejecutar.Resta(num1,num2),"Operacion de Resta",2);
JOptionPane.showMessageDialog(null,"La multiplicacion de\t"+num1+"*"+num2+"="+
Ejecutar.Multiplica(num1,num2),"Operacion de Multiplicacin",2);
JOptionPane.showMessageDialog(null,"La Divisin de\t"+num1+"/"+num2+"="+
Ejecutar.divi(num1,num2),"Operacion de Divisin",2);
47
Usando Referencias
public class SubClaseHija1 {
//Metodos
public int Suma(int a,int b){
return(a+b);
}
public int Resta(int a,int b){
return(a-b);
}
public int Multiplica(int a,int b){
return(a*b);
}
public int divi(int a,int b){
return(a/b);
}
}
_____________________________________________________________
// La clase Main
public class ClassEjecutar {
//Atributis Globales
public static void main(String[] args) {
//referencia del Frame
FrmOperaciones llamar=new FrmOperaciones();
llamar.setVisible(true);
//atributos Locales
}
}
48
.
private void btnCalcular_actionPerformed(ActionEvent e) {
int num1, num2;
num1=Integer.parseInt(txta.getText());
num2=Integer.parseInt(txtb.getText());
txtSalida.append("La suma de\t"+num1+"+"+num2+"="+Ejecutar.Suma(num1,num2)+"\n");
txtSalida.append("La resta de\t"+num1+"-"+num2+"="+Ejecutar.Resta(num1,num2)+"\n");
txtSalida.append("La
multiplicacion
de:
"+num1+"*"+num2+"="+Ejecutar.Multiplica(num1,num2)+"\n");
txtSalida.append("La Divisin de\t"+num1+"/"+num2+"="+Ejecutar.divi(num1,num2)+"\n");
}
}
49
Los constructores
Un objeto de una clase se crea llamando a una funcin especial denominada constructor de la
clase. El constructor se llama de forma automtica cuando se crea un objeto, para situarlo en
memoria e inicializar los miembros datos declarados en la clase. El constructor tiene el mismo
nombre que la clase. Lo especfico del constructor es que no tiene tipo de retorno.
public class ClassConstructor {
public ClassConstructor() {
System.out.println("Alumno SISE");
}
public ClassConstructor(String Esp) {
System.out.println("Su Especialidad " + Esp);
}
public ClassConstructor(int Costo) {
System.out.println("El Costo " + Costo + " Soles");
}
public ClassConstructor(int Costo,String Esp) {
double de=0,neto;
if(Esp.equalsIgnoreCase("Sistemas"))
de=0.15*Costo;
if(Esp.equalsIgnoreCase("Contabilidad"))
de=0.10*Costo;
neto=Costo-de;
System.out.println("Descuento " + de);
System.out.println("Neto " + neto );
}
50
El calificador private indica que dicho componente ser accesible nicamente dentro de la
Clase en cuestin, si se intenta accesar cualquier elemento de este tipo dentro de otra
Clase ser generado un error de compilacin.
El calificador private suele utilizarse en Clases que sern modificadas continuamente, esto
permite evitar futuros quebrantos en otras Clases como fue mencionado al inicio.
51
No puede ser generada ninguna instancia (Uso de new) de un elemento static puesto que
solo existe una instancia.
Todos los elementos definidos dentro de una estructura static deben ser static ellos mismos
, o bien, poseer una instancia ya definida para poder ser invocados.
NOTA: Lo anterior no implica que no puedan ser generadas instancias dentro de un
elemento static; no es lo mismo llamar/invocar que crear/generar.
La teora del concepto static puede ser un poco difcil de digerir, sin embargo, como fue
mencionado anteriormente, conforme avance el curso sern descritos diversos fragmentos
de cdigo para dejar en claro su uso.
52
Atributo Static
El atributo static, que se puede utilizar con propiedades declaradas con las palabras clave var,
const o function, permite asociar una propiedad a la clase en lugar de asociarla a instancias de
la clase. El cdigo externo a la clase debe llamar a propiedades estticas utilizando el nombre
de la clase en lugar de un nombre de instancia. Las subclases no heredan las propiedades
estticas, pero las propiedades forman parte de una cadena de mbitos de subclase. Esto
significa que en el cuerpo de una subclase se puede utilizar una variable o un mtodo esttico
sin hacer referencia a la clase en la que se defini.
53
Interfaces
El concepto de Interface lleva un paso ms adelante la idea de las clases abstractas. En Java
una interface es una clase abstracta pura, es decir una clase donde todos los mtodos son
abstractos (no se implementa ninguno). Permite al diseador de clases establecer la forma de
una clase (nombres de mtodos, listas de argumentos y tipos de retorno, pero no bloques de
cdigo). Una interface puede tambin contener datos miembro, pero estos son siempre static y
final. Una interface sirve para establecer un 'protocolo' entre clases.
Para crear una interface, se utiliza la palabra clave interface en lugar de class. La interface
puede definirse public o sin modificador de acceso, y tiene el mismo significado que para las
clases. Todos los mtodos que declara una interface son siempre public.
Para indicar que una clase implementa los mtodos de una interface se utiliza la palabra clave
implements. El compilador se encargar de verificar que la clase efectivamente declare e
implemente todos los mtodos de la interface. Una clase puede implementar ms de una
interface.
Declaracin y uso
Una interface se declara:
interface nombre_interface {
tipo_retorno nombre_metodo ( lista_argumentos ) ;
...
}
Como Crear la Interface:
54
Por ejemplo:
Presione Alt Enter para validar la implementacin y luego presione en el foquito para que
pueda jalar los mtodos de la interface quedando de la siguiente manera.
55
Referencias a Interfaces
Es posible crear referencias a interfaces, pero las interfaces no pueden ser instanciadas. Una
referencia a una interface puede ser asignada a cualquier objeto que implemente la interface.
Por ejemplo:
ClassImplementa usoInterface=new ClassImplementa();
int v1=Integer.parseInt(txtv1.getText());
int v2=Integer.parseInt(txtv2.getText());
txtsalida.append("Mtodo que calcula la suma de los 2 numeros:"+ usoInterface.Ejemplo1(v1,v2)+ "\n");
Extensin de interfaces
Las interfaces pueden extender otras interfaces y, a diferencia de las clases, una interface
puede extender ms de una interface. La sintaxis es:
interface nombre_interface extends nombre_interface , . . . {
tipo_retorno nombre_metodo ( lista_argumentos ) ;
...
}
56
Los paquetes
Los paquetes son una forma de organizar grupos de clases. Un paquete contiene un
conjunto de clases relacionadas bien por finalidad, por mbito o por herencia.
Los paquetes resuelven el problema del conflicto entre los nombres de las clases. Al
crecer el nmero de clases crece la probabilidad de designar con el mismo nombre a
dos clases diferentes.
Las clases tienen ciertos privilegios de acceso a los miembros dato y a las funciones
miembro de otras clases dentro de un mismo paquete.
En el Entorno Integrado de Desarrollo (IDE) JBuilder de Borland, un proyecto nuevo se crea en
un subdirectorio que tiene el nombre del proyecto. A continuacin, se crea la aplicacin, un
archivo .java que contiene el cdigo de una clase cuyo nombre es el mismo que el del archivo.
Se pueden agregar nuevas clases al proyecto, todas ellas contenidas en archivos .java
situadas en el mismo subdirectorio. La primera sentencia que encontramos en el cdigo fuente
de las distintas clases que forman el proyecto es package o del nombre del paquete.
57
Herencia
La herencia es uno de los conceptos ms cruciales en la POO. La herencia bsicamente
consiste en que una clase puede heredar sus variables y mtodos a varias subclases (la clase
que hereda es llamada superclase o clase padre). Esto significa que una subclase, aparte de
los atributos y mtodos propios, tiene incorporados los atributos y mtodos heredados de la
superclase. De esta manera se crea una jerarqua de herencia.
Por ejemplo, imaginemos que estamos haciendo el anlisis de un Sistema para una tienda
que vende y repara equipos celulares.
En general, podemos tener una gran jerarqua de Clases tal y como vemos en el siguiente
grfico:
58
Ejemplos:
Se puede heredar clases propias de Java como por ejemplo:
public class FrmDiseo extends JFrame
public panel pnlDatos extends JPanel
para cada herencia pedira una importacion como por ejemplo
import javax.swing.JFrame;
import javax.swing.JPanel;
y otras propias del usuario.
public class ClassEJemplo1 extedns subClase01
public class ClassEJemplo1 extedns subClase02
Ejemplo:
Empleemos esta estructura de paquetes para poder realizar la siguiente
aplicacin:
59
60
ENCAPSULAMIENTO
El encapsulamiento es la caracterstica de autonoma de la OO. Esta caracterstica permite
generar componentes autnomos de software tomando una parte de funcionalidad y ocultando
los detalles de la implementacin al mundo exterior.
Los trminos mdulo, componente o bean se suelen utilizan en lugar de componente
encapsulado de software.
Una vez encapsulada, una entidad de software se puede visualizar como una caja negra.
Ejemplo:
Declare los atributos que desea encapsular:
61
62
Sobrecarga
En programacin orientada a objetos la sobrecarga se refiere a la posibilidad de tener dos o
ms funciones con el mismo nombre pero funcionalidad diferente. Es decir, dos o ms
funciones con el mismo nombre realizan acciones diferentes. El compilador usar una u otra
dependiendo de los parmetros usados. A esto se llama tambin sobrecarga de funciones.
Tambin existe la sobrecarga de operadores que al igual que con la sobrecarga de funciones
se le da ms de una implementacin a un operador.
Sobrecarga es la capacidad de un lenguaje de programacin, que permite nombrar con el
mismo identificador diferentes variables u operaciones
El mismo mtodo dentro de una clase permite hacer cosas distintas en funcin de los
parmetros
Java no permite al programador implementar sus propios operadores sobrecargados, pero s
utilizar los predefinidos como el + del ejemplo anterior. C++, por el contrario si permite
hacerlo.
63
Ejemplos
Caso 01
Crear una sobrecarga que permita sumar 2 nmeros y ser llamado de acuerdo al tipo
de dato que se le envie.
public class ClassSobreCalculos {
public int Totales(int a,int b){
return(a+b);
}
public double Totales(double a, double b){
return(a+b);
}
public long Totales(long a, long b){
return(a+b);
}
}
Caso 02
Crear una sobrecarga de mtodos donde permita hallar el sueldo, descuento y el neto.
El sueldo depender del costo y cantidad de horas
El descuento segn el estado de Honorarios o Planilla
Neto segn el sueldo y el descuento.
package pckLogico;
public class ClassSobre {
public double Calcular(int ch,int costo){
return(ch*costo);
}
public double Calcular(int sueld, String estado){
double de=0;
if(estado.equalsIgnoreCase("Planilla"))
de=0.12*sueld;
if(estado.equalsIgnoreCase("Honorarios"))
de=0.07*sueld;
return(de);
}
public double Calcular(int sueld,double de){
return(sueld-de);
}
}
Package pckLogico;
public class ClassEncapsular {
64
int sueldo,costo,ch;
double desc,neto;
String estado;
public int getSueldo() { return sueldo; }
public void setSueldo(int sueldo) {
this.sueldo = sueldo; }
public int getCosto() {
return costo; }
public void setCosto(int costo) {
this.costo = costo; }
public int getCh() {
return ch; }
public void setCh(int ch) {
this.ch = ch; }
public double getDesc() {
return desc; }
public void setDesc(double desc) {
this.desc = desc; }
public double getNeto() {
return neto; }
public void setNeto(double neto) {
this.neto = neto; }
public String getEstado() {
return estado; }
public void setEstado(String estado) {
this.estado = estado;
}
65
Caso 03
Crear una sobrecarga de mtodos donde permita hallar el sueldo, descuento y el neto.
El sueldo depender del costo y cantidad de horas
El descuento ser del 10% si el sueldo supera a los 1500
Neto segn el sueldo y el descuento.
//Campos encapsulado
public class ClassEncapsular {
int c,cs,suel;
double np,des;
public int getC() {
return c;
}
public void setC(int c) {
this.c = c;
}
public int getCs() {
return cs;
}
public void setCs(int cs) {
this.cs = cs;
}
public int getSuel() {
return suel;
}
public void setSuel(int suel) {
this.suel = suel;
}
public double getNp() {
return np;
}
public void setNp(double np) {
this.np = np;
}
public double getDes() {
return des;
66
}
public void setDes(double des) {
this.des = des;
}
}
// Frame:
public class FrmVentana extends JFrame {
Class1 x = new Class1();
*****
public FrmVentana() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
*******
******
******
}
private void btnCalcular_actionPerformed(ActionEvent e) {
x.setC(Integer.parseInt(txtch.getText()));
x.setCs(Integer.parseInt(txtcst.getText()));
x.setSuel(x.pago(x.getC(),x.getCs()));
x.setDes(x.pago(x.getSuel()));
x.setNp(x.pago(x.getSuel(),x.getDes()));
lblSueldo.setText(""+x.getSuel());
lblDesc.setText(""+x.getDes());
lblnp.setText(""+x.getNp());
}
private void btnLlamar_actionPerformed(ActionEvent e) {
FrmResultados j=new FrmResultados();
j.setVisible(true);
j.lblr.setText(""+x.getNp());
}
}
// Clase Main
public class Class1 extends ClassMetodos{
public static void main(String[] args) {
FrmVentana ven=new FrmVentana();
ven.setVisible(true);
}
67
Caso 04
Crear una sobrecarga de mtodos donde permita hallar el precio, total, igv y el neto.
Segn el articulo saldr el precio. El total ser deacuerdo a la cantidad y precio y el neto ser
deacuero al total y a la seleccin del Igv.
// Clase encapsulada
package pckLogico;
public class ClassEncapsular {
int precio,cantidad;
double total,igv;
String articulo;
public int getPrecio() {
68
return precio;
}
public void setPrecio(int precio) {
this.precio = precio;
}
public int getCantidad() {
return cantidad;
}
public void setCantidad(int cantidad) {
this.cantidad = cantidad;
}
public String getArticulo() {
return articulo;
}
public void setArticulo(String articulo) {
this.articulo = articulo;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public double getIgv() {
return igv;
}
public void setIgv(double igv) {
this.igv = igv;
}
}
// clase sobrecarga
package pckLogico;
public class ClassSobreCarga {
public int Calcular(String articulo){
int pre = 0;
if(articulo.equalsIgnoreCase("Monitor"))
pre=259;
if(articulo.equalsIgnoreCase("Teclado"))
pre=15;
if(articulo.equalsIgnoreCase("Memorias"))
pre=175;
if(articulo.equalsIgnoreCase("Case"))
69
pre=550;
if(articulo.equalsIgnoreCase("Lectora"))
pre=25;
return(pre);
}
public double Calcular(int cantidad, int precio){
return(cantidad*precio);
}
public double calcular(double total){
return(total*0.19);
}
public double calcular(double total,double igv){
return(total+igv);
}
}
//Frame
public class FrmDatos extends JFrame {
ClassEncapsular atributo = new ClassEncapsular();
ClassSobreCarga metodos = new ClassSobreCarga();
String Titulos[]={"registro","articulo","precio","cantidad","total"};
String valores[][]={};
int c=1;
*************
***************
private void jbInit() throws Exception {
*********************
*********************
*********************
cboArticulo.addItem("Seleccionar");
cboArticulo.addItem("Monitor");
cboArticulo.addItem("Teclado");
cboArticulo.addItem("Memorias");
cboArticulo.addItem("Case");
cboArticulo.addItem("Lectora");
}
private void cboArticulo_actionPerformed(ActionEvent e) {
lblTotal.setText("");
txtCantidad.setText("");
atributo.setArticulo(cboArticulo.getSelectedItem().toString());
lblPrecio.setText(""+metodos.Calcular(atributo.getArticulo()));
atributo.setPrecio(metodos.Calcular(atributo.getArticulo()));
lblPrecio.setText(""+atributo.getPrecio());
}
private void btnAgregar_actionPerformed(ActionEvent e) {
atributo.setCantidad(Integer.parseInt(txtCantidad.getText()));
atributo.setPrecio(atributo.getPrecio());
atributo.setTotal(metodos.Calcular(atributo.getCantidad(),atributo.getPrecio()));
lblTotal.setText(""+atributo.getTotal());
70
if(chkIGV.isSelected())
atributo.setIgv(metodos.calcular(atributo.getTotal()));
else
atributo.setIgv(0);
lblIGV.setText(""+atributo.getIgv());
lblneto.setText(""+metodos.calcular(atributo.getTotal(),atributo.getIgv()));
Object
valores[]={c,atributo.getArticulo(),atributo.getPrecio(),atributo.getCantidad(),atributo.getTotal()};
ModDatos.addRow(valores);
++c;
}
71
Contenidos
-
Manejo de Paneles(JPanel)
Clase GregorianCalendar
Clase String: Uso de la Clase String String.valueOf(), length(), charAt(), toString(),
substring(), indexOf(), lastIndexOf(), equalsIgnoreCase(), compareTo(),
- Uso de la Clase String: concat(), replace(), toLowerCase(), toUperCase().
____________________________________________________________________________
PANEL
Construir directamente programas o aplicaciones directamente en un FRAME, produce
rpidamente un amontonamiento de controles o componentes en la propia forma.
Es ms conveniente usar componentes de agrupamiento visuales que faciliten la separacin
fsica y lgica de las diversas partes que componen un programa o aplicacin.
Estos controles de agrupamiento son conocidos como paneles, aunque en visual basic se
conocen como frames (no confundirlos con frame de java).
Java tiene los siguientes tipos de paneles, PANEL, SPLITPANE, SCROLLPANE,
TABBEDPANE, TOOLBAR.
Recordar adems que los panels pueden y deben usar su propio layout para acomodar los
componentes visuales que contendr.
En particular frame usando su layout acomoda sus paneles y panel usando su layout acomoda
los componentes.
72
puede parecer un poco rebuscado, obedece al esquema arquitectnico del AWT; se trata del
bien conocido esquema de separacin interface/implementacin que establece por un lado una
clase de interface y por otras distintas clases de implementacin para cada una de las
plataformas elegidas.
73
GregorianCalendar
Segn la documentacin del API de java, la clase Calendar es una clase abstracta base para
convertir entre un objeto de tipo Date (java.util.Date) y un conjunto de campos enteros como
YEAR (ao), MONTH (mes), DAY (da), HOUR (hora), etc.
Una subclase de Calendar representa una fecha de acuerdo a las reglas de un calendario
especfico. La plataforma provee una subclase concreta de Calendar: GregorianCalendar.
Futuras subclases podran representar varios tipos de calendarios lunares usados en diferentes
lugares del mundo.
La clase Calendar tiene mucho del comportamiento que esperaramos de la clase
java.util.Date, es decir, cuando obtenemos una instancia de la clase Calendar obtenemos un
instante de tiempo especfico con gran precisin similar a lo que obtenemos con la clase date.
S es cierto, podemos decir aqu que los milisegundos juegan un papel fundamental en esta
clase; pero el verdadero sentido de la clase Calendar no es obtener un instante de tiempo sino
extraerle
datos.
Recordemos que la clase java.util.Date tiene mtodos que permiten obtener el ao, mes y da,
pero estos mtodos estn obsoletos precisamente por que para eso existe Calendar y de
hecho cuando usamos el mtodo getYear() de la clase java.util.Date esta recurre a las
funcionalidades que posee la clase Calendar.
Hay que mencionar tambin que obtener un instante de tiempo especfico y diferente del actual
es supremamente sencillo con esta clase, indicndole simplemente el da, mes y ao con que
se desea trabajar, o se puede especificar an ms dando hora, minuto y segundo deseado.
Veamos:
El mtodo getInstance() de la clase nos devuelve una subclase de Calendar con el tiempo
ajustado a la hora actual, y usamos el mtodo set(args) para forzarlo a tomar la fecha
deseada:
Calendar ahoraCal = Calendar.getInstance();
System.out.println(ahoraCal.getClass());
ahoraCal.set(2004,1,7);
System.out.println(ahoraCal.getTime());
ahoraCal.set(2004,1,7,7,0,0);
System.out.println(ahoraCal.getTime());
YEAR: Ao.
MONTH: Mes.
DATE, DAY_OF_MONTH: Da del mes.
DAY_OF_WEEK: Da de la semana entre 1 (MONDAY) y 7 (SATURDAY).
HOUR: Hora antes o despus del medio da (en intervalos de 12 horas).
HOUR_OF_DAY: Lo hora absoluta del da (en intervalos de 24 horas).
MINUTE: El minuto dentro de la hora.
SECOND: El segundo dentro del minuto.
Estn tambin los atributos que representan los meses, como: JANUARY, MARCH, JUNE,
DECEMBER, etc. que van desde 0 (JANUARY) hasta 11 (DECEMBER).
74
Tambin hay atributos que representan los das: SUNDAY, TUESDAY, SATURDAY, etc. estos
empiezan con 1 (SUNDAY) y van hasta 7 (SATURDAY).
Hay ms atributos pero con estos es suficiente para los objetivos de este artculo, si deseas
conocerlos todos recurre a la documentacin del lenguaje.
Para extraer algn atributo se usa el mtodo get pasndole como parmetro alguna de las
constantes que vimos anteriormente y el mtodo devuelve siempre un dato de tipo int; as para
obtener el ao, mes, da y hora, usaramos el siguiente cdigo:
System.out.println("ANYO: "+ahoraCal.get(Calendar.YEAR));
System.out.println("MES: "+ahoraCal.get(Calendar.MONTH));
System.out.println("DIA: "+ahoraCal.get(Calendar.DATE));
System.out.println("HORA: "+ahoraCal.get(Calendar.HOUR));
if (ahoraCal.get(Calendar.MONTH) == Calendar.JUNE){
System.out.println("ES JUNIO");
}else{
System.out.println("NO ES JUNIO");
}
Si el objeto tiene la fecha equivalente a 5:30 p.m. del 22 de junio de 2004 se ve la siguiente
salida:
AO:2010
MES:Mayo
DIA:02
HORA:5
ES JUNIO
Modificar Un Atributo
Modificar un atributo de Calendar es tan sencillo como obtenerlo, solamente es necesario usar
el mtodo set(int atributo, int valor), en donde atributo es una de las constante mencionadas
anteriormente y valor es la cantidad que se le quiere asignar. Por ejemplo:
ahoraCal.set(Calendar.MONTH,Calendar.JANUARY) o ahoraCal.set(Calendar.YEAR, 1980)
ajustaran la fecha almacenada en el objeto ahoraCal a enero o al ao 1980 sin modificar
ninguno de los otros atributos.
75
Este calendario usado en occidente, llamado gregoriano fue adoptado por primera vez en 1582
por el imperio romano (o aproximadamente) y posteriormente se fue adoptando en muchos
otros pases, por ejemplo 1752 en Gran Bretaa y 1918 en Rusia.
A grandes rasgos sabemos que el calendario gregoriano consta de aos que son definidos por
cada traslacin (vuelta de la tierra alrededor del sol), cada ao tiene doce meses de los cuales
7 tienen 31 das, 4 tienen 30 das y 1 tiene 28 das excepto en aos bisiestos que tiene 29.
Estos aos bisiestos se implantaron para corregir el desfase que tenemos cada cuatro aos (un
ao real dura 365 das y 6 horas aproximadamente), regla completa para los aos bisiestos
segn el calendario gregoriano es la siguiente:
"Un ao es bisiesto si es divisible por 4, a menos que sea divisible por 100 y no por 400".
Todo esto quiz suene un poco tonto, pero es absolutamente necesario tenerlo claro para
entender el funcionamiento de la clase GregorianCalendar.
El mtodo add(CONSTATE, valor) suma algebraicamente valor a una fecha; el valor a sumar
asume el significado dado por CONSTANTE, que es una de las definidas para la clase y que se
mencionaron en la seccin anterior (MONTH, YEAR, SECOND, etc).
76
hoy.add(Calendar.YEAR, -5);
hoy.add(Calendar.DATE, -50);
System.out.println(hoy.getTime());
77
Clase String
Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y
StringBuffer. Un objeto String representa una cadena alfanumrica de un valor constante que
no puede ser cambiada despus de haber sido creada. Un objeto StringBuffer representa una
cadena cuyo tamao puede variar.
Los Strings son objetos constantes y por lo tanto muy baratos para el sistema. La mayora de
las funciones relacionadas con cadenas esperan valores String como argumentos y devuelven
valores String.
Hay que tener en cuenta que las funciones estticas no consumen memoria del objeto, con lo
cual es ms conveniente usar Character que char. No obstante, char se usa, por ejemplo, para
leer ficheros que estn escritos desde otro lenguaje.
MTODOS PRINCIPALES:
Para poder aplicar estos mtodos es necesario crear un objeto String. Adems de estos
mtodos, la clase String cuenta con otros muchos.
int longitud=str.length();
int indexOf(String str, int indice): devuelve el ndice en el que aparece por
primera vez la String del primer argumento en la que se aplica el mtodo, a
partir del ndice especificado en el segundo argumento. Recordar que una
String est indexada. Si el ndice a partir del que se inicia la bsqueda no
existe o la String no aparece, devuelve -1. MUY USADO.
Ejemplo:
int indexOf(char ch): devuelve el ndice en el que aparece por primera vez el
carcter que se le pasa al argumento. Si no se encuentra el carcter devuelve 1. Se observa que el nombre de este mtodo es igual al anterior aunque su
nmero de argumentos es distinto adems de su tipo. A esto, en Java, se le
llama sobrecarga de mtodos: mismo nombre pero distinto n de
argumentos o distinto tipo de argumentos o distinto orden. Ir a la API para
Tcnica de Programacin Orientada a Objetos
78
comprobar que hay ms con este mismo nombre. Este concepto se tratar ms
en profundidad en temas posteriores.
String s=Laboratorios SIse ;
Cad=s.indexOf(S);
String s1=Angie;
Cad=s.replace(e,E);
String toLowerCase(): devuelve una nueva String convirtiendo todos los caracteres
de la String sobre la que se aplica el mtodo, en minsculas.
String s=SEBASTIAN;
JOptionPane.showMessageDialog(null,s.toLowerCase());
String toUpperCase(): devuelve una nueva String convirtiendo todos los caracteres
de la String sobre la que se aplica el mtodo, en maysculas.
String s=william;
JOptionPane.showMessageDialog(null,s.toUpperCase());
boolean equals(String str): investiga si dos String tienen los mismos caracteres y en
el mismo orden. Si es as devuelve true y si no false. MUY USADO
boolean equalsIgnoreCase(String str): investiga si dos String tienen los mismos
caracteres y en el mismo orden sin tener en cuenta las maysculas. Si es as devuelve
true y si no false. MUY USADO
boolean startsWith(String str): devuelve true si la String sobre la que se aplica
comienza por la del argumento; false si esto no ocurre.
boolean startsWith(String str, int indice): devuelve true si la String sobre la que se
aplica comienza por la del argumento a partir de un determinado ndice asociado al
segundo argumento; false si esto no ocurre.
79
boolean endsWith(String str): devuelve true si la String sobre la que se aplica acaba
en la del argumento; false si esto no ocurre.
String trim(): devuelve una String en base a la que se le pasa al argumento, pero sin
espacios en blanco al principio ni al final. No elimina los espacios en blanco situados
entre las palabras.
Ejemplo:
String substring(int indiceIni, int indiceFin): devuelve una String obtenida a partir
del ndice inicial incluido y del ndice final excluido; es decir, se comporta como un
intervalo semiabierto [indiceIni, indiceFin). Si el ndice final sobrepasa la longitud de la
String, lanza una IndexOutOfBoundsException. MUY USADO.
Ejemplo:
char charAt (int indice): devuelve el carcter asociado al ndice que se le pasa como
argumento de la String sobre la que se aplica el mtodo. Si el ndice no existe se lanza
una StringIndexOutOfBoundsException que hereda de IndexOutOfBoundsException.
MUY USADO.
80
Contenidos
-
Definicin de ARCHIVOS.
Los archivos tambin denominados ficheros (file); es una coleccin de informacin (datos
relacionados entre s), localizada o almacenada como una unidad en alguna parte de la
computadora.
Los archivos son el conjunto organizado de informaciones del mismo tipo, que pueden utilizarse
en un mismo tratamiento; como soporte material de estas informaciones.
Los archivos como coleccin de datos sirve para la entrada y salida a la computadora y son
manejados con programas.
Los archivos pueden ser contrastados con Arrays y registros; Lo que resulta dinmico y por
esto en un registro se deben especificar los campos, l nmero de elementos de un arrays (o
arreglo), el nmero de caracteres en una cadena; por esto se denotan como "Estructuras
Estticas".
En los archivos no se requiere de un tamao predeterminado; esto significa que se pueden
hacer archivos de datos ms grandes o pequeos, segn se necesiten.
81
Tipos De Archivos
Los elementos de un archivo pueden ser de cualquier tipo, simples o estructurados o segn su
funcin.
Segn su funcin.
Se define por:
a.- Archivos Permanentes: Son aquellos cuyos registros sufren pocas o ninguna variacin a lo
largo del tiempo, se dividen en:
Constantes: Estn formados por registros que contienen campos fijos y campos de baja
frecuencia de variacin en el tiempo.
De Situacin: Son los que en cada momento contienen informacin actualizada.
Histricos: Contienen informacin acumulada a lo largo del tiempo de archivos que han
sufridos procesos de actualizacin o bien acumulan datos de variacin peridica en el tiempo.
b.- Archivos de Movimiento: Son aquellos que se utilizan conjuntamente con los maestros
(constantes), y contienen algn campo comn en sus registros con aquellos, para el
procesamiento de las modificaciones experimentados por los mismos.
c.- Archivo de Maniobra o Transitorio: Son los archivos creados auxiliares creados durante
la ejecucin del programa y borrados habitualmente al terminar el mismo.
82
Tipos de accesos
Acceso Secuencial. Exige el tratamiento de elemento, para esto es necesario una exploracin
secuencial comenzando desde el primer momento (Pascal permite este acceso)
Secuenciales: archivo de texto que debe ser ledo del principio hasta el final.
Acceso Directo. Permite procesar o acceder a un elemento determinado y referencia
directamente por su posicin en el soporte de almacenamiento (Turbo Pascal permite este
acceso.
Aleatorios: Es un archivo con registros de un mismo largo. Un programa puede accesar
directamente cualquier registro sin tener que leer los registros previos.
Binarios: Es un archivo que lee byte por byte sin asumir ninguna estructura.
Los archivos Binarios no son un nuevo tipo de archivo, pero si una nueva forma de manipular
cualquier tipo de archivo. Las tcnicas de archivo binarios permiten leer o cambiar cualquier
byte de un archivo. Son herramientas extremadamente potentes, pero como toda herramienta
potente debe manejarse con cuidado
83
Excepciones
Excepcion es, o sencillamente problemas. En la programacin siempre se producen errores,
ms o menos graves, pero que hay que gestionar y tratar correctamente. Por ello en java
disponemos de un mecanismo consistente en el uso de bloques try/catch/finally . La tcnica
bsica consiste en colocar las instrucciones que podran provocar problemas dentro de un
bloque try, y colocar a continuacin uno o ms bloques catch, de tal forma que si se provoca un
error de un determinado tipo, lo que haremos ser saltar al bloque catch capaz de gestionar
ese tipo de error especfico. El bloque catch contendr el codigo necesario para gestionar ese
tipo especfico de error. Suponiendo que no se hubiesen provocado errores en el bloque try,
nunca se ejecutaran los bloques catch.
Veamos ahora la estructura del bloque try/catch/finally:
try {
//Cdigo que puede provocar errores
} catch(Tipo1 var1) {
//Gestin del error var1, de tipo Tipo1
}
[ ...
catch(TipoN varN) {
//Gestin del error varN, de tipo TipoN
}]
[
finally {
//Cdigo de finally
}
84
Como podemos ver es obligatorio que exista la zona try, o zona de pruebas, donde pondremos
las instrucciones problemticas. Despus vienen una o ms zonas catch, cada una
especializada en un tipo de error o excepcin. Por ltimo est la zona finally, encargada de
tener un cdigo que se ejecutar siempre, independientemente de si se produjeron o no
errores.
Se puede apreciar que cada catch se parece a una funcin en la cul slo recibimos un objeto
de un determinado tipo, precisamente el tipo del error. Es decir slo se llamar al catch cuyo
argumento sea coincidente en tipo con el tipo del error generado
Archivos de Texto
Archivos necesarios:
Los archivos nos permiten guardar nuestro trabajo para que no perdamos datos una vez que
cerremos la aplicacin. Existen dos tipos de archivos en Java, en este trial veremos los
primeros. Los archivos de texto en Java se manejan mediante la clase BufferedReader y la
clase PrintWriter. Estas dos clases nos permiten manejar los archivos de texto como podemos
ver en la presentacin a continuacin:
Archivos de Texto
Adems de los ejemplos y ejercicios de la presentacin puedes basarte en el siguiente archivo
para aprender a manejar archivos de texto:
Hay dos maneras de escribir a un archivo una vez que ya tenemos el PrintWriter, pero primeor
tenemos que entender una cosa de esta clase. El PrintWriter es un buffer, como una caja en la
que se guarda lo que se va a escribir al archivo y una vez que ya est todo listo se manda al
archivo.
85
Para mandar un String a un archivo de texto podemos utilizar dos mtodos, el primero es
println() que recibe una lnea de texto y la imprime en el archivo con un cambio de lnea ("\n") al
final, el segundo mtodo que se utiliza frecuentemente es el mtodo print que funciona
bsicamente de la misma manera, pero no pone un salto de lnea al final y no imprime los datos
al archivo sino nicamente los deja en el buffer, por lo que tenemos que utilizar el mtodo
flush() para que lo imprima al archivo.
Es muy importante recordar que debemos cerrar el archivo al terminar de utilizarlo, ya que en
caso contrario no estamos seguros de que todos los cambios se guarden en el archivo. Para
poder cerrar el archivo utilizamos el mtodo close() del PrintWriter.
Es muy importante recordar que debemos cerrar el archivo al terminar de utilizarlo, ya que en
caso contrario no estamos seguros de que todos los cambios se guarden en el archivo. Para
poder cerrar el archivo utilizamos el mtodo close() del PrintWriter.
86
El otro mtodo del BufferedReader que nos va a ser muy til es el mtodo readLine(), este
mtodo nos permite leer todo un archivo mucho ms rpido y nos es muy til cuando queremos
obtener datos de un archivo de inicio ya que podemos leer una lnea cada vez y utilizarla de la
manera que nos convenga.
Al igual que cuando utilizamos el PrintWriter debemos cerrar el archivo al terminarlo de utilizar
utilizando el mtodo close() del BufferedReader ya que aunque en este caso no se pierden
datos, otros programas no van a poder utilizar el archivo hasta que lo cerremos.
Por ltimo vamos a darle un rpido vistazo a la clase File que nos es muy til siempre que
trabajamos con archivos.
El constructor de File recibe un String con la ruta del archivo, una vez que creamos el
objeto tipo File podemos utilizar los siguientes mtodos:
87
Para poder leer archivos de texto en Java debemos crear un objeto de tipo
BufferedReader. BufferedReader es una clase que contiene mtodos predefinidos para
poder leer de una secuencia de bits.
Para poder guardar archivos de texto en Java debemos crear un objeto de tipo
PrintWriter. PrintWriter es una clase que contiene mtodos predefinidos para meter
datos a una secuencia de bits.
Puedes hacer click en los nombres para ver el API que contiene muchos mtodos
tiles.
BufferedReader
El constructor que vamos a utilizar para crear un BufferedReader es:
BufferedReader fileIn = new BufferedReader(new
FileReader(fileName);
Ya que tenemos el objeto tipo BufferedReader podemos utilizar varios mtodos para
leer, l ms comn es:
fileIn.readLine();
Este mtodo lee una lnea y la devuelve o devuelve null si llegamos al final del archivo
y no hay nada que leer.
Es importante recordar cuando trabajamos con archivos que cada que leemos o
escribimos a un archivo debemos hacerlo dentro de un try.
Un try es un manejador de excepciones, cuando sucede un error en la ejecucin de
nuestro programa ejecuta ciertas instrucciones dependiendo del tipo de error que
sucedi.
Otro mtodo muy importante es el mtodo: fileIn.read();
88
Este mtodo nos permite leer un solo carcter del flujo de datos. El mtodo regresa un
nmero (int) del 1 al 65535 si puede leer del archivo o regresa -1 si no.
try {
BufferedReader fileIn = new BufferedReader(
new FileReader(fileName));
int i = fileIn.read(); //Iniciamos una variable a la que
//vamos a leer
char c = (char) i; //Como lo que leimos es un int debemos
// hacer un cast a char
} catch (IOException ioe) {
} catch (FileNotFoundException fnfe) {
}
PrintWriter
89
}
}
Ejemplos:
Caso 01
package prjarchivos;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFrame;
public class ArchivoApp2{
public static void main(String[] args) {
FileReader entrada=null;
StringBuffer str=new StringBuffer();
try {
entrada=new FileReader("VERARCHI01.txt");
int c;
while((c=entrada.read())!=-1){
str.append((char)c);
}
System.out.println(str);
System.out.println("--------------------------------------");
}
catch (IOException ex) {
System.out.println("El archivo no existe");
}
finally{
//cerrar los flujos de datos
if(entrada!=null){
try{
entrada.close();
}
catch(IOException ex){}
}
System.out.println("el bloque finally siempre se ejecuta");
}
}
}
Caso 02
package prjrarchivos2;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;
import pckPrincipal.FrmLlamar;
90
Caso 03
package pckClase;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import pckAplica.FrmArchivo3;
public class ClassAr3 {
public String datos[]=new String[50];
public int i,pos,tam;
public ClassAr3() {
}
public void llamar(){
String subStr="";
String nombre="ArchivoApp2.txt";
BufferedReader entrada;
try {
entrada = new BufferedReader(new FileReader(nombre));
String texto="";
91
while(true){
texto = entrada.readLine();
/* tam=texto.length();
for(int g=0;g<tam;++g){
String j=String.valueOf(texto.charAt(g));
//JOptionPane.showMessageDialog(null,j);
if(j.equals(",")){
datos[i]=subStr;
++i;
}
else
subStr=subStr+j;
}
*/
if(texto==null) break;
System.out.println(texto);
}
entrada.close();
}catch(FileNotFoundException f){
} catch (IOException e) {
// TODO
}
}
}
Desarrollo:
92
Empecemos a codificar
package pckLogico;
public class ClassEncapsulada {
String nom,ape,cod;
int p,reg;
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getApe() {
return ape;
}
public void setApe(String ape) {
this.ape = ape;
}
public int getP() {
return p;
}
public void setP(int p) {
this.p = p;
}
public int getReg() {
return reg;
}
public void setReg(int reg) {
this.reg = reg;
}
public String getCod() {
return cod;
}
93
94
95
datos.Grabar(atri.getReg(),atri.getCod(),atri.getNom(),atri.getApe(),atri.getCod(),atri.getP());
++c;
}
// Panel Pie
package pckPaneles;
public class pnlPie extends JPanel {
GregorianCalendar formato=new GregorianCalendar();
************************
96
public FrmPresenta() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.getContentPane().setLayout( null );
this.setSize(new Dimension(400, 408));
this.setResizable(false);
this.setTitle("Usando Archivos");
pnlPie1.setBounds(new Rectangle(0, 345, 395, 40));
pnlEncabezado1.setBounds(new Rectangle(0, 0, 395, 345));
this.getContentPane().add(pnlEncabezado1, null);
this.getContentPane().add(pnlPie1, null);
}
}
97
98
Contenidos
- Definicin de la Clase Vector.
- Definicin de la Clase ArrayList.
- Diferencias entre ellas
- Mtodos de la clase Vector y ArrayList
- Aplicando atributos encapsulados usando estas clases
- Definicin de la la Clase Hashtable.
- Mtodos get y put
____________________________________________________________________________
Vector
Es una clase que permite crear matrices dinmicas, es decir matrices que varan en cantidad
de elementos durante la ejecucin del programa, lo cual no se puede hacer en java con la clase
Array que es la clase que generalmente se utiliza para crear matrices.
En un Vector, puedo agregar cualquier cosa, incluso puedo agregar diferentes tipos de objetos
a un mismo vector, esto se debe a que Vector almacena objetos de tipo Object que es la clase
base de Java. Esto no puedo hacerlo con un Array ya que todos sus elementos deben ser del
mismo tipo.
Por este motivo, cuando accedo a un elemento de un Vector, debo moldearlo a su tipo
especfico de datos, de lo contrario obtendr un objeto de tipo Object.
La clase Enumeration se utiliza con un vector o mejor dicho, se crea a partir de la cantidad de
elementos de un vector, ya que lo nico que hace Enumeration es enumerar los elementos de
un vector. Enumeration lo nico que hace es recorrer los elementos de un vector hacia
adelante mediante el mtodo nextElement (), asegurando que nunca se pasar del ndice del
vector, esto lo hace mediante el mtodo hasMoreElements().
Solo para eso sirve Enumeration, pero asegura que no habr error por salirse del ndice del
vector. Este es un ejemplo de cmo utilizar ambas clases juntas:
99
Crear un vector
Para usar la clase Vector hemos de poner al principio del archivo del cdigo fuente la siguiente
sentencia import
import java.util.*;
import java.util.Vector;
Cuando creamos un vector u objeto de la clase Vector, podemos especificar su dimensin
inicial, y cuanto crecer si rebasamos dicha dimensin.
Vector VecDatos=new Vector(20, 5);
VecDatos.addElement("uno");
Podemos tambin insertar un elemento en una determinada posicin, mediante
insertElementAt. El segundo parmetro o ndice, indica el lugar que ocupar el nuevo objeto.
Si tratamos de insertar un elemento en una posicin que no existe todava obtenemos una
excepcin del tipo ArrayIndexOutOfBounds. Por ejemplo, si tratamos de insertar un elemento
en la posicin 9 cuando el vector solamente tiene cinco elementos.
100
Ejemplo: Para insertar el string "tres" en la tercera posicin del vector v, escribimos
VecDatos.insertElementAt("tres", 2);
En la siguiente porcin de cdigo, se crea un vector con una capacidad inicial de 10 elementos,
valor por defecto, y se le aaden o insertan objetos de la clase String.
101
Para saber cuntos elementos guarda un vector, se llama a la funcin miembro size. Para
saber la dimensin actual de un vector se llama a la funcin miembro capacity.
Agregue esta 2 lneas al cdigo anterior.
lblT.setText(""+vecDatos.size());
lblD.setText(""+vecDatos.capacity());
102
103
Desde el objeto enum devuelto por la funcin miembro elements de la clase Vector llamamos a
las funciones miembro hasMoreElements y nextElement de la clase VectorEnumerator. La
funcin hasMoreElements devuelve true mientras haya todava ms elementos que se
puedan acceder en el vector v. Cuando se ha llegado al ltimo elemento del vector, devuelve
false. La funcin nextElement devuelve una referencia al prximo elemento en la estructura de
datos. Esta funcin devuelve una referencia a un objeto de la clase base Object, que el
programador precisar en ciertos casos, como veremos ms abajo, promocionar (casting) a la
clase adecuada.
Para buscar objetos en un vector se puede usar una Enumeration y hacer una comparacin
elemento por elemento mediante equals, tal como vemos en la siguiente porcin de cdigo
Enumeration enum=vecDatos.elements();
while(enum.hasMoreElements()){
String elemento=(String)enum.nextElement();
if(elemento.equals("William")){
lblEnc.setText("Encontrado William");
break;
}
}
104
Ejemplo 01:
import java.util.Vector;
public class VerCasoVector{
public static void main () {
Vector DocentesSta = new Vector ();
DocentesSta.addElement ("Veronica");
DocentesSta.addElement ("William");
DocentesSta.addElement ("Victor");
DocentesSta.addElement ("Rogelio");
DocentesSta.addElement ("Carlos");
ModLstDatos.addElement(DocentesSta);
//Quita el elemento
DocentesSta.removeElement ("Rogelio");
ModLstDatos.setText(DocentesSta);
lblP.setText("En la posicin 1 est: " + DocentesSta.elementAt (1));
DocentesSta.insertElementAt ("Angie", 2);
105
Si se necesitan aadir valores de datos primitivos a un Vector se pueden utilizar las clases
conocidas como envoltorios que son: Integer, Long, Double y Float. Sus mtodos de conversin
respectivos son: intValue ( ), longValue ( ), doubleValue ( ) y floatValue ( ).
Ejercicio:
Complemente la siguiente clase, escribiendo las instrucciones necesarias donde se muestran
los subguiones(__), guate del ejemplo anterior:
import java.util.*;
/**
* Uso de las clases Vector e Integer
*/
public class EjercicioVector
{
public static void main ()
{
Vector vecDatos = new Vector ();
vecDatos.add (new Integer (1));
vecDatos.add (new Integer (3));
vecDatos.add (new Integer (5));
for (int i = 0; i < v.size (); i++) {
Integer iI = (Integer) v.get (i);
ModLstDatos.addElement(iI.______________() + " ");
}
// Insertar un nuevo Objeto de tipo Integer cuyo valor sea 10
______________________
//El nuevo vector es
__________________
____________________
// Insertar un nuevo Objeto de tipo Integer cuyo valor sea 6 en la pos.3
System.out.println ("Se inserta un nuevo objeto cuyo valor es 6 en la posicin 3");
___________________________
//El nuevo vector es
_______________________________________
// Eliminar el objeto que contiene al Integer cuyo valor es 3
____________________
//El nuevo vector es
_______________________________
// Escribir el valor del segundo objeto
txtArea.append("El valor del segundo objeto es: " + _____________+\n);
// Determinar el nmero de objetos del vector
txtArea.append ("El tamao del vector es: " + _____________+\n);
// Eliminar el tercer objeto y escribir su valor
txtArea.append ("En la tercera posicin haba un: " + _____________+\n);
106
107
La clase ArrayList
Las aplicaciones frecuentemente necesitan almacenar un grupo de datos en un slo objeto.
Los arrays sirven bien para este propsito, pero algunas veces necesitamos incrementar o
reducir dinmicamente el nmero de elementos del array, o hacer que contenga distintos tipos
de datos
Esto es comn entre las aplicaciones como las tiendas online. Un cliente aade una mercanca
a su carro de la compra, y detrs de la escena, los tems son almacenados y eliminados
automticamente.
Para esta clase de grupos de datos crecientes y menguantes, podemos usar la clase Vector , o
la reciente clase ArrayList del paquete java.util .
Un ArrayList contiene tantos objetos como necesitemos.
ArrayList tiene varios constructores, dependiendo de cmo necesitemos construir el ArrayList
Un objeto ArrayList slo contiene referencias a objetos. Para almacenar tipos primitivos como
double long o float ,
ArrayList es una de las muchas clases del Collection Framework , que proporciona un
conjunto de interfaces y clases bien-diseados para almacenar y manipular grupos de datos
como una sola unidad, una coleccin.
Es una Lista volcada en un Array. Se debe utilizar en lugar de Vector como almacenamiento de
objetos de propsito general. Permite un acceso aleatorio muy rpido a los elementos, pero
realiza con bastante lentitud las operaciones de insertado y borrado de elementos en medio de
la Lista. Se puede utilizar un ListIterator para moverse hacia atrs y hacia delante en la Lista,
pero no para insertar y eliminar elementos.
Ventajas
Un ArrayList es un array dinmico. No tiene restricciones de capacidad. Su tamao se ajusta
de forma dinmica.
108
Mtodos de ArrayList
int size().- El tamao actual (puede ser 0)
void add(obj).- Aade un objeto al final del ArrayList, incrementando su tamao de
obj es un objeto.
Object get(N).- Devuelve el elemento almacenado a la posicin N en el ArrayList.
N tiene que ser un entero entre 0 y size()-1.
Nota:
En ArrrayListInteger.java, se convierte el objeto devuelto por get() a un Integer con
casting.
En ArrayListString.java, se convierte el objeto devuelto por get() a un String llamando al
mtodo toString() de Object.
Ejemplo 01: Usando el ArrayList
import java.util.ArrayList;
public class ArrayListEntero {
public static void main(String[] args) {
ArrayList numeros = new ArrayList();
Integer num1 = new Integer(10);
Integer num2 = new Integer(20);
Integer num3 = new Integer(30);
Integer num4 = new Integer(40);
numeros.add(num1);
numeros.add(num2);
numeros.add(num3);
numeros.add(num4);
int suma=0;
for (int i=0;i<numeros.size();i++) {
Integer vanum = (Integer)numeros.get(i);
suma = suma + vanum.intValue();
txtArea.append(vanum);
if (i<numeros.size()-1)
txtArea.append ("+");
else
txtArea.append ("=");
}
109
txtArea.append(\n+suma);
}
}
import java.util.*;
public class ArrayListString {
public static void main(String[] args) {
ArrayList Saludo = new ArrayList();
Saludo.add("Sise");
Saludo.add("te");
Saludo.add("da la");
Saludo.add("Bienvenidaa");
Saludo.add("..");
for (int i=0;i<Saludo.size();i++)
Object objecto = Saludo.get(i);
String cadena = objecto.toString();
cadena = cadena.toUpperCase();
txtSalida.append(cadena+" ");
}
}
Ms Mtodos de ArrayList
void set(index, obj): Sustituye el elemento en la posicin index por el objeto obj.
(index tiene que ser entre 0 y size()-1) dentro del ArrayList, sustituyendo el elemento
previamente almacenado a la posicin N. Es equivalente a A[N] = obj para un array A.
Object remove(index) -- Elimina el elemento a la posicin index (index entre 0 y size()-1).
110
// Clase Encapsulada
package PckLogico;
public class ClassEncapsulada {
String nombre,apellido,condicion;
int reg,nota1,nota2,nota3,nota4;
double promedio;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public int getNota1() {
return nota1;
}
public void setNota1(int nota1) {
this.nota1 = nota1;
}
public int getNota2() {
return nota2;
}
public void setNota2(int nota2) {
this.nota2 = nota2;
}
111
112
//ClassEjecutar
package PckPrincipal;
import PckPresentacion.FrmAcceso;
import PckPresentacion.FrmDatos;
public class ClassEjecutar {
public static void main(String[] args) {
FrmAcceso prin= new FrmAcceso();
prin.setVisible(true);
// Cerrar una ventana
}
}
113
void Eliminar(){
int fila=tbl_d.getSelectedRow();
modTDatos.removeRow(fila);
}
private void btnAgregar_actionPerformed(ActionEvent e) {
datos();
Object valores[]={R,atri.getNombre(),atri.getApellido(),atri.getNota1(),atri.getNota2(),
atri. getNota3(),atri.getNota4(),atri.getPromedio(),atri.getCondicion()};
modTDatos.addRow(valores);
++R;
}
private void jButton1_actionPerformed(ActionEvent e) {
//Ir al Inicio del registro de la Tabla
tbl_d.setRowSelectionInterval (0,0);
}
private void jButton2_actionPerformed(ActionEvent e) {
//Ir al Siguiente Registro de la Tabla
if ( tbl_d.getSelectedRow() != 0 ) {
tbl_d.setRowSelectionInterval (tbl_d.getSelectedRow()+1, tbl_d.getSelectedRow() +1);
}
}
private void jButton3_actionPerformed(ActionEvent e) {
//Ir al Anterio de la Tabla
if ( tbl_d.getSelectedRow() != 0 ) {
tbl_d.setRowSelectionInterval (tbl_d.getSelectedRow()-1, tbl_d.getSelectedRow() -1);
}
}
private void jButton4_actionPerformed(ActionEvent e) {
//Implementa para ir al final del registro de la tabla
}
private void btnSalir_actionPerformed(ActionEvent e) {
System.exit(0);
}
private void btnEliminar_actionPerformed(ActionEvent e) {
Eliminar();
}
private void btnBuscar_actionPerformed(ActionEvent e) {
/* Implementa Este boton
}
}// fin del Frame
114
//Frame Acceso
private void btnAceptar_actionPerformed(ActionEvent e) {
String Nombre, clave;
Nombre= txtNombre.getText();
clave=txtClave.getText();
if(Nombre.equalsIgnoreCase("SISE")&&clave.equalsIgnoreCase("2010")){
FrmDatos prin=new FrmDatos();
prin.setVisible(true);
this.dispose();
}
}
115
Contenidos
- Uso de mens(JMenu)
- JProgressBar,
- JColorChooser, JFileChooser,
- InternalFrame
- Implementacin de Libreras
- Creacin de Archivos Jar Ejecutables
____________________________________________________________________________
Mens
Adems, como siempre, tenemos que escribir unos gestores para los sucesos de los mens y
asociarlos a los mens.
Los sucesos de los MenuItem son los que tenemos que gestionar nosotros a diferencia de los
sucesos de los mens que los gestiona el sistema. Mientras los segundos sirven para que
aparezcan y desaparezcan las voces del men, los primeros son los clicks sobre la orden
correspondiente al Item.
116
Por lo tanto, para stos tendremos que escribir unos ActionListener, como para los botones.
Realmente no son otra cosa que unos botones especiales. Los constructores son tres:
MenuItem() , que construye un MenuItem sin etiqueta.
MenuItem(String label), que construye MenuItem con etiqueta label.
MenuItem(String label, MenuShortcut s), que construye un MenuItem con etiqueta label
y acelerador (tecla de opcin rpida) definido en MenuShortcut s.
Algunos mtodos son:
addActionListener(ActionListener l), asocia un ActionListener al MenuItem para
escuchar los sucesos de tipo ActionEvent (el clic).
void deleteShortcut(), borra la tecla de opcin rpida para el menuitem.
String getActionCommand(), da la accin asociada al MenuItem. La accin es la
que pasa al actionListener del botn para identificar el botn mismo. As varios item
pueden tener el mismo gestor de sucesos que podr distinguir el botn clicado
basndose en la rden que le llega.
String getLabel(), devuelve la etiqueta del MenuItem
EventListener[]getListeners(Class listenerType) , devuelve todos los oyentes de
sucesos asociados al MenuItem, del tipo listenerType.
MenuShortcut getShortcut(), devuelve la definicin del acelerador para el
MenuItem.
boolean isEnabled(), dice si el men esta disponible o no. Si no lo est se
visualizar en gris.
void removeActionListener(ActionListener l), elimina el oyente asociado.
void setActionCommand(String command), ajusta la orden asociada al
MenuItem. Si no est especificado, la rden es la etiqueta del MenuItem.
void setEnabled(boolean b), habilita y deshabilita el MenuItem.
void setLabel(String label), ajusta la etiqueta para el MenuItem.
void setShortcut(MenuShortcut s), define el acelerador para el men.
Por lo tanto, para crear los Item del men Archivo descrito antes tendremos que escribir:
MenuItem abrir=new MenuItem("Abrir");
MenuItem cerrar=new MenuItem("Cerrar");
MenuItem guardar=new MenuItem("Guardar");
MenuItem salir=new MenuItem("Salir");
Por tanto creamos el objeto Menu para pegar los MenuItem.
Dos constructores del objeto son:
Menu(), construye un Men sin etiqueta
Menu(String label), construye un men con etiqueta label.
117
JProgressBar
Una barra de progreso que muestra grficamente qu cantitad total de la tarea se ha
terminado. Puedes ver Cmo usar Progress Bars para ms informacin.
ProgressMonitor
Un ejemplar de esta clase monitoriza el progreso de una tarea. Si el tiempo enlapsado
de la tarea excede un valor especificado en el programa, el monitor trae un dilogo con
una descripcin de la tarea, una nota de estado, una barra de progreso, un botn Ok, y
un botn Cancel. Puedes ver Cmo usar Progress Monitors para ms detalles.
ProgressMonitorInputStream
Un stream de entrada con un monitor de progreso aadido, que monitoriza la lectura
desde el stream. Se utiliza un ejemplar de este stream como cualquier otro stream. Se
puede obtener el monitor de progreso del stream llamando a getProgressMonitor y
configurndolo como se describe en Cmo usar Progress Monitors.
Despus de ver una barra de progreso y un monitor de progreso en accin, Decidir si utilizar
una Barra o un Monitor de Progreso puede ayudarnos a decidir cul es el apropiado para
nuestra aplicacin.
118
JFileChooser
JFileChooser es una clase java que nos permite mostrar fcilmente una ventana para la
seleccin de un fichero.
Si queremos abrirlo para leer el fichero, podemos llamarlo as
if (seleccion == JFileChooser.APROVE_OPTION){
File fichero = fileChooser.getSelectedFile();
// Aqu debemos abrir y leer el fichero.
...
}
Para seleccionar un fichero para guardar datos, el mecanismo es igual, pero se llama al mtodo
showSaveDialog()
La nica diferencia entre uno y otro es la etiqueta del dilogo y de los botones. Uno pondr
"Abrir" y otro "Guardar"
119
Import javax.swing.filechooser.FileFilter;
...
public class FiltroDeJPG extends FileFilter{
public boolean accept (File fichero) {
if (tieneExtensionJPG (fichero))
return true;
else
return false;
}
public String getDescription() {
return ("Filtro JPGs");
}
}
Debemos definir ambos mtodos. La descripcin puede ser cualquier cadena de texto que nos
sirva como descripcin del filtro. Finalmente, debemos pasar este filtro al JFileChooser
fileChooser.setFilter(new FiltroDeJPG());
Sin embargo, una de las bondades ofrecidas por el JDK 1.6, es el ahorro en la codificacin de
una clase filtro, pues este, ya viene con una incluida a la cual solo necesitamos invocarla, la
sintaxis es la siguiente:
Tenes definir un FileFilter , es decir, creas una clase que herede de FileFilter y le das las
propiedades que deseas. Por ejemplo:
120
Si queres trabajar con directorios tenes que cambiar el modo de seleccin usando la constante
JFileChooser.DIRECTORIES_ONLY. El modo de seleccin tambin puede ser cambiado para
permitir elegir mas de un fichero o directorio a la vez:
chooser.setFileSelectionMode(JFileChooser.DIRECTOR IES_ONLY);
121
JInternalFrame
Con la clase JInternalFrame, se puede mostrar un JFrame - como una ventana dentro de otra
ventana. Para crear un frame interno que parezca un dilogo sencillo, se pueden utilizar los
mtodos showInternalXxxDialog de JOptionPane, como se explic en Cmo crear Dilogos.
Normalmente, los frames internos se muestran dentro de un JDesktopPane.
JDesktopPane es una subclase de JLayeredPane al que se le ha aadido el API para manejar
el solapamiento de mltiples frames internos. Generalmente, se pone el panel superior dentro
del panel de contenido de un JFrame.
122
hija1.getContentPane().setLayout(null);
hija2.getContentPane().setLayout(null);
hija1.setVisible(true);
hija2.setVisible(true);
}
}
Para poder visualizar las ventanas u ocultarlas podra usar el metodo setVisble true o false en el
momento que usted desee ver la ventana deseada.
123
Implementacin de Libreras
En la mayora de los sistemas operativos actuales, se ofrece una cantidad de cdigo para
simplificar la tarea de programacin. Este cdigo toma la forma, normalmente, de un conjunto
de libreras dinmicas que las aplicaciones pueden llamar cuando lo necesiten. Pero la
Plataforma Java est pensada para ser independiente del sistema operativo subyacente, por lo
que las aplicaciones no pueden apoyarse en funciones dependientes de cada sistema en
concreto. Lo que hace la Plataforma Java, es ofrecer un conjunto de libreras estndar, que
contiene mucha de las funciones reutilizables disponibles en los sistemas operativos actuales.
Las libreras de Java tienen tres propsitos dentro de la Plataforma Java. Al igual que otras
libreras estndar, ofrecen al programador un conjunto bien definido de funciones para realizar
tareas comunes, como manejar listas de elementos u operar de forma sofisticada sobre
cadenas de caracteres. Adems, las libreras proporcionan una interfaz abstracta para tareas
que son altamente dependientes del hardware de la plataforma destino y de su sistema
operativo. Tareas tales como manejo de las funciones de red o acceso a ficheros, suelen
depender fuertemente de la funcionalidad nativa de la plataforma destino. En el caso concreto
anterior, las libreras java.net y java.io implementan el cdigo nativo internamente, y ofrecen
una interfaz estndar para que aplicaciones Java puedan ejecutar tales funciones. Finalmente,
no todas las plataformas soportan todas las funciones que una aplicacin Java espera. En
estos casos, las libreras bien pueden emular esas funciones usando lo que est disponible, o
bien ofrecer un mecanismo para comprobar si una funcionalidad concreta est presente.
124
1
1
3
3
4
3
4. Luego establecer el nombre del archivo Ejecutable
5. Al darle aceprtar aparecer esta ventana donde deber de elegir la clase que ejecute la
aplicacin (clase Main), busque la clase.
125
126
Contenidos
Threads
____________________________________________________________________________
Una thread es un nico flujo de contrrol dentro de un programa. Algunnaas veces es llammado
contexto de ejecucin porque cada thread debe tenner sus propios recurssos, como el
prrogram counter y el stack de ejecucin, como el contexto dee ejecucin. Sin embargo, toda
thread en un programa aun comparte muchos recursos, tales como espacio de memoria y
archivvos abiertos. Threads tambien son llamadas procesos livianos (lightweight prrocess).
Comparticin de datos
Todos los hilos de proceso que pertenecen a un mismo proceso comparten un rea comn de
datos que sirve para intercambiar informacin entre ellos. No es necesario acudir a tcnicas de
comunicacin entre procesos tales como paso de mensajes, ya que todos los hilos son
capaces de acceder directamente a los datos compartidos.
Por otro lado, la conmutacin entre hilos de un mismo proceso es muy rpida, puesto que la
cantidad de informacin que ha de ser salvada y/o restaurada por el sistema es mucho menor.
Por eso, cuando se trata con hilos siempre se habla de cambios de contexto ligeros, en
contraposicin a los cambios de contexto pesados, que implican el manejo de procesos.
127
Ejemplo 01
Crear una Aplicacin que presente la hora del sistema usando hilos.
128
Ejemplo 02
crear el Panel por medio de Codigo: Solo inserte el panel y digite los siguiente, crea una
clase main y una subclase.
public class PanelCarrera extends JPanel implements ActionListener{
public JLabel lblJ1 = new JLabel("1",JLabel.CENTER);
public JLabel lblJ2 = new JLabel("2",JLabel.CENTER);
JLabel barrera=new JLabel();
JButton b= new JButton("Inicia carrera");
//Constructor
public PanelCarrera(){
setLayout(new BorderLayout());
JPanel p= new JPanel();
p.setLayout(null);
lblJ1.setBounds(0,25, 20,20);
lblJ1.setBackground(Color.blue);
lblJ1.setOpaque(true);
lblJ1.setForeground(Color.white);
lblJ2.setBounds(0,50, 20, 20);
lblJ2.setBackground(Color.red);
lblJ2.setOpaque(true);
lblJ2.setForeground(Color.white);
barrera.setBounds(310,0, 2,400);
barrera.setBackground(Color.green);
barrera.setOpaque(true);
b.addActionListener(this);
p.add(lblJ1);
p.add(lblJ2);
129
p.add(barrera);
add(p, BorderLayout.CENTER);
add(b, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e){
lblJ1.setLocation(0, lblJ1.getLocation().y);
lblJ2.setLocation(0, lblJ2.getLocation().y);
ClassCarreraHilo st1= new ClassCarreraHilo(lblJ1, this);
ClassCarreraHilo st2= new ClassCarreraHilo(lblJ2, this);
st1.start();
st2.start();
}
}
130
131
Ejemplo 03
Muestre la palabra SISEpuede cada cierto tiempo
public class ClassBlink implements Runnable {
Thread Blink=new Thread(this);
JLabel tiempo=new JLabel();
public ClassBlink() {
JFrame ventana = new JFrame("Visualizar Palabra");
ventana.setSize(250,100);
ventana.setVisible(true);
ventana.add(tiempo);
//Blink=new Thread(this);
Blink.start();
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}
public void run(){
try {
while(true){
tiempo.setText("Sise puede..");
Blink.sleep(1000);
tiempo.setText(" ");
Blink.sleep(1000);
}
} catch (InterruptedException ex) {
System.out.println("Error...");
}
}
public static void main(String[] args) {
new ClassBlink();
}
private void jbInit() throws Exception {
tiempo.setBackground(new Color(0, 0, 165));
tiempo.setForeground(new Color(247, 255, 214));
tiempo.setOpaque(true);
tiempo.setFont(new Font("Dialog", 1, 21));
}
}
132
133
Presentacin Final
Panel Encabezado
134
El botn agregar solo almacenara datos al ArrayList, lo botones modificar, eliminar, depender
de la seleccin del JTable y buscar pedir el numero para mostrar todos los elementos en el
panel contenido.
Panel Contenido
Todos permitir mostrar todos los datos dentro del arrayList asi como aquellos que ya estaban
en el archivo.
X apellido: segn a las letras o palabra completa se realizar el filtro por apellidos en el Jtable.
135
Contenidos
136
Que no es .NET?
Antes de decir qu es .NET, es conveniente aclarar qu NO es .NET:
.NET no es un sistema operativo, como si lo es Microsoft Windows en sus distintas
versiones.
.NET no es un Lenguaje de Programacin: si bien la plataforma Microsoft .NET incluye
lenguajes de programacin de aplicaciones, su concepto es ms amplio y va ms all
de stos.
.NET no es un Entorno de Desarrollo: si bien la plataforma Microsoft .NET incluye
entornos de desarrollo integrados (IDEs), su concepto es ms amplio y va ms all de
stos.
.NET no es un servidor de aplicaciones (Application Server)
.NET no es un producto empaquetado que se pueda comprar como tal, sino que es una
plataforma que engloba distintas aplicaciones, servicios y conceptos y que en conjunto
permiten el desarrollo y la ejecucin de aplicaciones.
Qu es .NET?
Plataforma de Desarrollo compuesta de
Microsoft .NET es una plataforma de desarrollo y ejecucin de aplicaciones. Esto quiere decir
que no slo nos brinda todas las herramientas y servicios que se necesitan para desarrollar
modernas aplicaciones empresariales y de misin crtica, sino que tambin nos provee de
mecanismos robustos, seguros y eficientes para asegurar que la ejecucin de las mismas sea
ptima. Los componentes principales de la plataforma .NET son:
Un entorno de ejecucin de aplicaciones, tambin llamado Runtime, que es un
componente de software cuya funcin es la de ejecutar las aplicaciones .NET e
interactuar con el sistema operativo ofreciendo sus servicios y recursos.
Un conjunto de bibliotecas de funcionalidades y controles reutilizables, con una enorme
cantidad de componentes ya programados listos para ser consumidos por otras
aplicaciones.
Un conjunto de lenguajes de programacin de alto nivel, junto con sus compiladores y
linkers, que permitirn el desarrollo de aplicaciones sobre la plataforma .NET.
Un conjunto de utilitarios y herramientas de desarrollo para simplificar las tareas ms
comunes del proceso de desarrollo de aplicaciones.
137
NET Framework
El .NET Framework se basa en un nuevo entorno de ejecucin de lenguaje comn
(CLR - Common Language Runtime). Este motor de ejecucin proporciona un conjunto
de servicios comunes para los proyectos generados en Visual Studio .NET, con
independencia del lenguaje. Estos servicios proporcionan bloques de desarrollo
fundamentales para aplicaciones de cualquier tipo, para todas las capas y niveles de la
arquitectura de aplicaciones.
138
NET FRAMEWORK
El .NET Framework proporciona todos los servicios comunes necesarios para ejecutar las
aplicaciones Visual Basic .NET.
139
1. Beneficios
El .NET Framework fue diseado para satisfacer los siguientes objetivos:
Basado en estndares y prcticas Web
El .NET Framework soporta totalmente las tecnologas existentes de Internet, incluyendo
Hypertext Markup Language (HTML), XML, SOAP, Extensible Stylesheet Language for
Transformations (XSLT), Xpath y otros estndares Web. El .NET Framework promueve la
creacin de servicios Web dbilmente conectados y sin estado.
Extensible
140
2. Lenguajes
La plataforma .NET es independiente del lenguaje (el .NET Framework proporciona
todos los servicios comunes necesarios para permitir la ejecucin de los programas). El
.NET Framework ofrece soporte para numerosos lenguajes de programacin,
incluyendo lenguajes de Microsoft y de terceros.
Visual Basic .NET ofrece importantes innovaciones del lenguaje respecto a versiones
anteriores de Visual Basic. Visual Basic .NET soporta herencia, constructores,
polimorfismo, sobrecarga, excepciones estructuradas, estricta verificacin de tipos, free
threading, y muchas otras caractersticas. En esta versin, Visual Basic Scripting
Edition proporciona funcionalidad completa Visual Basic.
Microsoft Visual C#
La actualizacin de Visual C++ es una mnima extensin gestionada del lenguaje C++.
Esta extensin proporciona acceso al .NET Framework incluyendo el recolector de
basura, herencia de implementacin simple y herencia de interfaz mltiple. Esta
actualizacin tambin elimina la necesidad de escribir cdigo de fontanera para los
componentes. Ofrece acceso a bajo nivel donde sea necesario.
Microsoft J#
J# .NET es un lenguaje para los desarrolladores que utilicen el lenguaje Java que
quieran generar las aplicaciones y servicios para el .NET Framework. J# .NET est
totalmente integrado con el IDE de Visual Studio .NET y est diseado para aprovechar
al mximo el .NET Framework.
Lenguajes de terceros
141
3. Componentes
Los componentes principales del .NET Framework son los siguientes:
3.1.
142
Qu es un entorno gestionado?
Un entorno gestionado es aquel que proporciona servicios comunes de forma
automtica. Algunos ejemplos de los tipos de servicios que proporciona un entorno
gestionado son el recolector de basura y la seguridad.
143
144
fuente de datos podra ser XML, otra podra ser OLE DB, y una tercera fuente de datos
podra ser el adaptador directo para SQL Server.
3.4.
145
generar interfaces de usuario (IUs) Web dinmicos. Los Servicios Web de ASP.NET
proporcionan las piezas para construir aplicaciones distribuidas basadas en la Web.
Los Servicios Web estn basados en estndares abiertos de Internet, como HTTP y
XML. Podemos pensar en un Servicio Web como un componente reutilizable accesible
a travs de Internet, en lugar de estar limitado a clientes Windows en una red de rea
local.
El Common Language Runtime proporciona un soporte nativo para crear y exponer
Servicios Web utilizando una abstraccin de programacin coherente y familiar para
desarrolladores tanto de Active Server Pages (ASP) como de Visual Basic. El modelo
resultante es escalable y extensible. Este modelo se basa en estndares abiertos de
Internet (HTTP, XML, SOAP y SDL) y, por tanto, puede ser accedido e interpretado
desde cualquier cliente o dispositivo habilitado para Internet. Algunas de las clases
ASP.NET ms habituales se describen en los siguientes prrafos.
3.5.
INTERFAZ DE USUARIO
146
147
NAMESPACES
.NET Framework incluye un gran conjunto de ensamblados que forman las bibliotecas de
clases, que conjuntamente contienen cientos de tipos. Estos ensamblados proporcionan
acceso a funcionalidades del sistema en nuestro proceso de desarrollo.
Los espacios de nombres utilizan un esquema nombres con una sintaxis basada en un punto
para agrupar lgicamente clases relacionadas de modo que puedan buscarse y reverenciarse
fcilmente. Por ejemplo, el espacio de nombres System.Data contiene clases que constituyen
la arquitectura de ADO.NET. El espacio de nombres System.Xml es el espacio de nombres
global para todas las clases XML que proporcionan soporte basado en estndares para
procesar XML.
148
El sistema de tipos comunes define cmo se declaran, utilizan y gestionan los tipos en el
Common Language Runtime. Cada tipo de datos utilizado en Visual Basic .NET corresponde
directamente a un tipo definido en el sistema de tipos comunes.
Cdigo con seguridad de tipos, lo que significa que nicamente se accede a los tipos de forma
permisible y bien definida.
Las herramientas que gestionan y permiten una ejecucin del cdigo de alto rendimiento.
El sistema de tipos comunes soporta dos categoras generales de tipos: tipos valor y tipos
referencia.
Una variable de tipo valor contiene directamente sus datos. Cada variable de tipo valor tiene su
propia copia de datos, de modo que las operaciones en una variable de tipo valor no pueden
afectar a otra variable.
Una variable de tipo referencia contiene una referencia o puntero al valor de un objeto. Dos
variables de tipo referencia pueden referirse al mismo objeto, de modo que las operaciones en
149
una variable de tipo referencia pueden afectar al objeto referenciado por otra variable de tipo
referencia.
Tipos de datos
.NET Framework
VB .NET
C#
Descripcin
Boolean
Boolean
bool
True / false
Byte
Byte
byte
0 a 255
Int16
Short
short
-32768 a 32767
Int32
Integer
int
-2147483648 a
2147483647
Int64
Long
long
Single
Single
float
Double
Double
double
Decimal
Decimal
decimal
DateTime
Date
System.DateTime
1/1/0001 a 31/12/9999
String
String
string
Char
Char
char
Object
Object
object
Sbyte
SByte
sbyte
-128 a 127
UInt16
UShort
ushort
0 a 65535
UInt32
UInteger
uint
0 a 4.294.967.295
UInt64
ULong
ulong
0 a 1.8 E19
Los TIPOS PRIMITIVOS forman parte del CTS (COMMON TYPE LANGUAGE). Los
ltimos tipos de datos forman parte del CTS pero no del CLS (COMMON LANGUAGE
SPECIFICATION), y no deben ser usados si se desea crear aplicaciones que
interoperen con otros lenguajes de .NET.
150
Visual Basic no requiere que seleccione explcitamente un tipo de datos cuando declara una
variable. Sin embargo, es una buena idea hacerlo, ya que de esta forma sus aplicaciones sern
ms fiables y requerirn menos memoria. El tipo de datos determina los valores permitidos para
una variable, que, a su vez, determinan las operaciones que pueden realizarse sobre esa
variable.
Tipado fuerte
Si usted declara variables sin tipo de datos, se les otorga de forma predeterminada el tipo de
datos Object. Esto facilita la escritura rpida de programas, pero puede hacer que stos se
ejecuten ms lentamente. La especificacin de tipos de datos para todas sus variables se
denomina tipado fuerte. Se recomienda el uso de tipado fuerte porque:
151
Uso de variables
Antes de que pueda utilizar una variable en su aplicacin, necesita nombrar, declarar la
variable y asignarle un valor.
Utilizamos variables para almacenar valores que pueden cambiar cuando una aplicacin se
est ejecutando.
152
Elemento
Descripcin
Nombre
Direccin
Tipo de datos
Valor
mbito
Tiempo de vida
Ejemplos de variables
Una variable puede utilizarse de muchas formas, incluyendo las siguientes:
Como contador que almacena el nmero de veces en que un evento se produce
Como almacenamiento temporal para valores de propiedades
Como ubicacin para guardar un valor de retorno de una funcin
Como ubicacin para almacenar nombres de directorio o archivos
153
Reglas
Cuando nombramos una variable en Visual Basic .NET, debemos tener en cuenta las
siguientes reglas:
Iniciar cada nombre de variable con un carcter alfabtico o un guin bajo (_).
No utilizar espacios ni smbolos.
No utilizar palabras clave como Integer o Date.
Recomendaciones
Se recomienda que tenga en cuenta las siguientes directrices cuando nombre variables:
Proporcione nombres descriptivos y con significado, como numeroCuenta.
Aunque escribir un nombre largo de variable puede resultar tedioso en el momento de
escribir cdigo, har que el cdigo sea ms fcil de leer y mantener.
Inicie cada palabra del nombre de una variable pblica con letra mayscula, como
NombreCliente. Esto se denomina PascalCasing.
Evite el uso de abreviaturas.
Aunque es posible utilizar un nombre de variable como nocta, el cdigo ser mucho
ms fcil de leer si utilizamos el nombre numeroCuenta. En caso de ser necesario el
uso de abreviaturas, debemos asegurarnos de que sean coherentes en toda la
aplicacin.
Utilice un nombre nico dentro del mbito de la variable. mbito (scope) hace
referencia al subconjunto del cdigo que reconoce la variable.
Cuando declare variables locales y privadas, inicie la primera palabra con un carcter
en minscula, como en nuevoCliente. Esto se denomina camelCasing.
154
Introduccin
Los siguientes ejemplos muestran cmo declarar las variables con tipos referencia:
155
Aunque la sintaxis para declarar variables de tipo valor y de tipo referencia es similar, el
entorno de ejecucin los gestiona de modo distinto. Una variable de tipo referencia siempre
contiene un puntero a un valor de ese tipo o una referencia nula. Una variable de tipo valor
contiene el valor real de la variable.
Introduccin
En general, debera declarar explcitamente las variables de su aplicacin antes de utilizarlas.
De este modo, se reduce la probabilidad de errores lgicos y se facilita el mantenimiento del
cdigo. Aunque no es recomendable, puede utilizar variables en su aplicacin sin antes
declararlas. Este proceso se denomina declaracin implcita.
156
Con Option Explicit no habilitado (Off), este clculo supondr un bonus de $0.00 debido a que
la variable sueldoActual se declarar implcitamente como una nueva variable Object y se
inicializar vaca. Cuando sueldoActual se utilice en el clculo, Visual Basic lo convertir
automticamente a 0. Si este clculo se realiza varias veces en una estructura cclica, la
aplicacin se ejecutar sustancialmente ms lentamente porque Visual Basic necesita tiempo
para crear, inicializar, y convertir la variable cada vez.
3. Activar la pgina Compilar y haga clic en Off u On segn lo deseado en la lista Option
Explicit.
157
Tambin puede configurar Option Explicit como On u Off mediante la instruccin adecuada al
inicio de su cdigo:
Introduccin
Antes de poder utilizar variables en su aplicacin, debe asignarles un valor. Puede asignar un
valor a una variable despus de declararla o mientras la declara.
Sintaxis
Para asignar un valor a una variable, utilice el operador de asignacin (=), como se muestra en
la siguiente expresin:
NombreVariable = Valor
El valor del lado derecho de la expresin se asigna a la variable del lado izquierdo de la
expresin.
158
Cuando creamos una variable con la instruccin Dim, Visual Basic inicializa automticamente
las variables numricas a 0, las cadenas de texto a vacas ("") y las variables de fecha a 1 de
enero de 0001.
Nota
Los valores de fecha (Date) deben estar encerrados entre almohadillas (##), y los valores de
cadena (String) deben estar encerrados entre comillas ("").
159
Introduccin
Si una variable de su programa contiene un valor que no cambia nunca, considere almacenar
el valor como una constante en lugar de una variable. Las constantes proporcionan una forma
de utilizar nombres con significado en lugar de un valor que no cambia (como , una cantidad
matemtica fija).
Sintaxis
Para declarar una constante, utilice la instruccin Const con la siguiente sintaxis:
Nombramos y especificamos los niveles de mbito de las constantes siguiendo las mismas
reglas que para las variables.
160
Ejemplo
161
Cuando utilizamos variables, debemos asegurarnos de que son accesibles desde todas las
reas de cdigo que hacen referencia a ellas. Por otra parte, es posible que necesite restringir
el acceso a determinadas variables. Todo el conjunto de cdigo que puede hacer referencia a
una variable por su nombre se denomina mbito (scope) de la variable. Esta leccin describe
los diferentes niveles de mbito aplicables a variables y explica cmo asegurarse de que cada
variable de nuestra aplicacin tiene el mbito adecuado.
Qu es el mbito?
Cuando declaramos variables, uno de los primeros aspectos que probablemente
consideraremos es el mbito. Si utilizamos una variable fuera de su mbito, el compilador
generar un error.
162
Definiciones
Para estudiar el modo de trabajo del mbito con variables, debemos estar familiarizados con
los trminos y definiciones de la siguiente tabla:
Trmino
Definicin
mbito de la variable
Bloque
Procedimiento
Mdulo
Ensamblado
Modificador de
acceso
Niveles de mbito
Una variable puede tener uno de los siguientes niveles de mbito:
Nivel de mbito
Descripcin
Bloque
Procedimiento
Mdulo
Espacio de nombres
163
Sintaxis
Para declarar una variable local, utilice la instruccin Dim con la siguiente sintaxis:
El siguiente ejemplo muestra cmo declarar una variable local denominada blockNumber con
mbito a nivel de bloque:
If x <> 0 Then
Dim blockNumber As Integer
blockNumber = 1 / x
End If
164
Nota
En general, cuando declaramos cualquier variable, es una buena prctica de programacin
mantener el mbito lo ms estrecho posible (el mbito de bloque es el ms estrecho). Mantener
el mbito estrecho ayuda a conservar memoria y minimiza las posibilidades de que el cdigo
haga referencia a una variable equivocada.
El siguiente ejemplo muestra cmo declarar una variable local name con mbito a nivel de
procedimiento:
Sub ShowMessage_Click( )
Dim name As String
name = NameTextBox.Text
MessageBox.Show("Bienvenido de nuevo, " & name & "!")
End Sub
165
La vida de una variable local empieza cuando un procedimiento la invoca y acaba cuando el
procedimiento finaliza. Cuando acaba la vida de una variable local, la instancia de la variable se
destruye y su valor se pierde. En ocasiones, es posible que deseemos que la vida de una
variable local sea ms larga que la vida del procedimiento. Por ejemplo, podemos desear que
un procedimiento realice una accin especfica la primera vez que sea invocado y que no haga
nada en las siguientes llamadas. Podemos declarar una variable esttica para conseguir esta
funcionalidad.
Definicin
Una variable esttica perdurar mientras la aplicacin siga ejecutndose. Las variables
estticas siguen existiendo y conservan sus ltimos valores entre invocaciones al
procedimiento en el que se han declarado. Sin embargo, el cdigo de otros procedimientos no
puede acceder a ellas.
Sintaxis
Para declarar una variable esttica local, utilizaremos la siguiente sintaxis:
Ejemplo
Las variables estticas resultan tiles para mantener contadores que se utilizan nicamente
dentro de un procedimiento. El siguiente ejemplo muestra cmo declarar una variable esttica
que realiza el seguimiento de cuntas veces se ejecuta el procedimiento AddItem. Cada vez
que el procedimiento se ejecuta, el valor almacenado en items se incrementa en 1.
166
Sub AddItem_Click( )
Static items As Integer
' Aadir 1 al contador
items += 1
' Usar ampersand(&) para combinar una cadena y una variable
Messagebox.Show("El contador es ahora " & items)
End Sub
Nota
Puede conseguir los mismos resultados que con el cdigo anterior declarando items como una
variable de mdulo. Sin embargo, otros procedimientos tendran acceso a la variable y podran
cambiarla. A menos que se desee mbito a nivel de mdulo, es recomendable utilizar una
variable esttica.
167
Sintaxis
Para declarar una variable de mdulo, utilice la siguiente sintaxis:
Nota
El mbito de una variable de mdulo est determinado no slo por el modificador de acceso
utilizado para declararla, sino tambin por el nivel de acceso del mdulo, clase o estructura en
el que se declara. El mbito de la variable no puede ser mayor que el mbito de su contenedor.
168
' Put the following declaration at module level (not in any procedure)
Private myModuleMessage As String
' ...
Sub InitializeModuleVariable( )
myModuleMessage = "This variable has module-level scope."
End Sub
' ...
Sub UseModuleVariable( )
MessageBox.Show(myModuleMessage)
End Sub
' Put the following declaration at module level (not in any procedure)
Friend MyProjectMessage As String
' ...
Sub InitializeProjectVariable( )
MyProjectMessage = "This variable has project-level scope."
End Sub
' ...
Sub UseProjectVariable( )
MessageBox.Show(MyProjectMessage)
End Sub
Tcnica de Programacin Orientada a Objetos
169
' Put the following declaration at module level (not in any procedure)
Public MySolutionMessage As String
' ...
Sub InitializeSolutionVariable( )
MySolutionMessage = "This variable has solution-level scope."
End Sub
' ...
Sub UseSolutionVariable( )
MessageBox.Show(MySolutionMessage)
End Sub
170
Podemos utilizar funciones de conversin para forzar el resultado de una operacin a un tipo
de datos particular en lugar del tipo de datos por defecto.
Por ejemplo, podemos convertir un valor de tipo cadena a un valor entero.
171
Definicin
Las funciones de conversin permiten convertir explcitamente un valor de un tipo de datos a
otro.
Ejemplos de funciones de conversin
Visual Basic ofrece una amplia lista de funciones de conversin, incluyendo las descritas en la
siguiente tabla:
172
MessageBox.Show(CInt(myVariable))
End Sub
Private Sub Button3_Click(...)
' Use date conversion on String
Dim myVariable As String
myVariable = "February 12, 1992"
MessageBox.Show(myVariable)
MessageBox.Show(CDate(myVariable))
End Sub
Sintaxis
Para utilizar una funcin de conversin, se sita en el lado derecho de una instruccin de
asignacin, utilizando la siguiente sintaxis:
VariableName = CFunction(Expression)
173
El parmetro expression puede ser cualquier expresin vlida, como una variable, un resultado
de una funcin o un valor constante.
Ejemplo
El siguiente ejemplo muestra cmo utilizar las funciones de conversin CStr y CDbl para
escribir cdigo que convierte pies y pulgadas A metros.
feet = CDbl(FeetTextBox.Text)
inches = CDbl(InchesTextBox.Text)
'Next, convert feet and inches to millimeters.
millimeters = (inches * MillimetersPerInch) + _
(feet * MillimetersPerInch * InchesPerFoot)
'Convert millimeters to meters.
meters = millimeters / 1000
'Display the result in a label. Because the Text property is a string, use CStr( ) to convert the double.
MeterResult.Text = CStr(meters)
End Sub
En este ejemplo, podemos asumir que los valores constantes MillimetersPerInch e
InchesPerFoot han sido declarados y se les han asignado valores adecuados a nivel de
mdulo.
174
Ejemplo de CInt
El siguiente ejemplo muestra cmo utilizar la funcin CInt para convertir un valor Double en un
Integer:
Ejemplo de CDate
El siguiente ejemplo muestra cmo utilizar la funcin CDate para convertir cadenas en valores
Date. En general, no se recomienda codificar explcitamente fechas y horas como cadenas
(como muestra este ejemplo). En lugar de ello, utilicemos literales de fecha y hora, como #Feb
12, 1969# y #4:45:23 PM#.
175
Visual Basic puede realizar algunas conversiones de tipos de datos implcitamente. Una
conversin implcita se produce cuando un valor se convierte automticamente de un tipo de
datos en otro requerido por el cdigo en que el tipo de datos se utiliza. No requiere ninguna
sintaxis especial en el cdigo fuente.
Ejemplos
Si colocamos la cadena 1234 en una variable Integer, Visual Basic convertir
automticamente la cadena en un entero. O, si una cadena como 100 se aade a un valor
numrico en la frmula 100 + 10, Visual Basic convierte implcitamente la cadena en el valor
entero 100 y lo aade a 10.
Inconvenientes
Existen inconvenientes al depender de Visual Basic para realizar conversiones implcitas. Las
conversiones implcitas pueden producir resultados imprevistos.
Por ejemplo, cuando se juntan dos cadenas, Visual Basic concatena las cadenas con
independencia de su contenido; por tanto 100 + 10 = 10010. Si se requiere una conversin
estrecha, los datos pueden truncarse. Adems, cuando Visual Basic debe realizar conversiones
implcitas, el cdigo se ejecuta ms lentamente debido al trabajo extra que Visual Basic debe
llevar a cabo.
176
En Visual Basic .NET, podemos combinar variables de varios tipos de datos diferentes para
crear un tipo definido por el usuario denominado estructura. Las estructuras resultan tiles
cuando deseamos crear una nica variable que agrupe varias piezas de informacin
relacionadas.
Podemos combinar elementos de datos de distintos tipos para crear una combinacin de tipos
de datos nica denominada estructura. Las estructuras resultan tiles cuando deseamos que
una nica variable guarde varias piezas de informacin relacionadas. Despus de declarar una
estructura, podemos declarar variables de ese tipo.
177
Definicin
Una estructura es una combinacin de tipos de datos que se crea combinando otros tipos de
datos. Las estructuras son de tipo valor (es decir, una variable de tipo estructura contiene los
datos de la estructura, en lugar de una referencia a los datos como hace el tipo referencia). Las
estructuras pueden tener datos, propiedades, mtodos y procedimientos y pueden invocar y
manipular eventos.
Ejemplo
El uso ms simple y habitual de las estructuras es encapsular variables relacionadas, creando
un tipo de datos definido por el usuario. Por ejemplo, es posible que deseemos guardar juntos
el nombre, fecha de contratacin, cargo y salario de un empleado. Podramos utilizar varias
variables para esta informacin, o podemos definir una estructura y utilizarla como la variable
de un nico empleado. La ventaja de la estructura se hace patente cuando tiene muchos
empleados y, por tanto, muchas instancias de la variable. El siguiente ejemplo muestra una
estructura Employee simple:
Nota
El ejemplo anterior utiliza la estructura Employee para gestionar una sencilla lista de atributos.
La estructura Employee tambin podra tener miembros como un mtodo Hire y un evento
Promoted. Sin embargo, si el diseo de su aplicacin puede beneficiarse de utilizar Employee
como plantilla para otro elemento de programacin, como un Manager o un StaffMember, sera
mejor crear Employee como clase. Las clases pueden utilizarse como plantillas, y son ms
extensibles que las estructuras.
178
El primer paso para crear una estructura es declararla. Podemos declarar estructuras en un
archivo fuente o dentro de un mdulo o clase, pero no dentro de un procedimiento.
Sintaxis
179
Miembros de la estructura
Debemos declarar cada miembro de los datos de una estructura y especificar un nivel de
acceso. Esto significa que cada sentencia de la seccin de declaracin de variable de la
estructura debe utilizar Dim, Friend, Private o Public. Si Option Explicit est On, es una
buena idea incluir la clusula As en cada sentencia. Los miembros declarados con Dim tienen
por defecto acceso Public, y los miembros declarados sin la clusula As tienen por defecto el
tipo de datos Object.
Niveles de acceso Puede accederse a las estructuras desde cualquier lugar del archivo,
mdulo o clase en el que estn declaradas. Una estructura en un archivo es Friend por
defecto. Podemos especificar el nivel de acceso de una estructura utilizando el modificador de
acceso Public, Protected, Friend o Private como se describe en la siguiente tabla:
Ejemplo
El siguiente ejemplo muestra cmo declarar una estructura Employee para definir un conjunto
de datos relacionados con un empleado. Muestra cmo utilizar los modificadores de acceso
Public, Friend y Private para reflejar la sensibilidad de los elementos de datos.
180
181
Una vez creada una estructura, podemos declarar variables a nivel de procedimiento y a nivel
de mdulo como ese tipo estructura. Podemos asignar valores a los miembros de datos de la
estructura de la variable y escribir cdigo para utilizar los miembros de la estructura.
Procedimiento
Generalmente, los pasos para utilizar las estructuras son los siguientes:
1. Declarar una estructura.
Por ejemplo, podemos crear una estructura que registre informacin sobre el sistema
de un ordenador, como sigue:
182
mySystem.processor = "x86"
mySystem.purchaseDate = #1/1/2003#
mySystem.memory = TextBox1.Text
Nota
Una estructura puede contener cualquiera de los tipos de datos definidos en Visual Basic .NET,
incluyendo matrices, objetos y otras estructuras.
183
Enum Colores
Rojo
Verde
Azul
End Enum
Indicando el tipo de datos que realmente tendr:
<Flags()> _
184
Nota:
<Flags()> _
Enum Colores As Byte
Rojo = 1
Tcnica de Programacin Orientada a Objetos
185
Verde = 2
Azul = 4
End Enum
Dim c As Colores = Colores.Azul Or Colores.Rojo
Dim s As String = c.ToString
El contenido de la variable s ser: "Rojo, Azul", es decir, se asignan los nombres de los
miembros de la enumeracin que intervienen en ese valor, no el valor "interno".
1- Los valores de una enumeracin no son simples nmeros
Como hemos comentado, los miembros de las enumeraciones realmente son valores
de un tipo de datos entero (en cualquiera de sus variedades) tal como podemos
comprobar en la figura:
Por tanto, podemos pensar que podemos usar cualquier valor para asignar a una variable
declarada como una enumeracin, al menos si ese valor est dentro del rango adecuado.
En Visual Basic 2005 esto no es posible, al menos si lo hacemos de forma "directa" y con
Option Strict conectado, ya que recibiremos un error indicndonos que no podemos convertir,
por ejemplo, un valor entero en un valor del tipo de la enumeracin. En la figura podemos ver
ese error al intentar asignar el valor 3 a una variable del tipo Colores (definida con el tipo
predeterminado Integer).
El error nos indica que no podemos realizar esa asignacin, pero el entorno integrado de Visual
Studio 2005 tambin nos ofrece alternativas para que ese error no se produzca, esa ayuda se
obtiene presionando en el signo de admiracin que tenemos justo donde est el cursor del
mouse, pero no solo nos dice cmo corregirlo, sino que tambin nos da la posibilidad de que el
propio IDE se encargue de corregirlo, tal como podemos apreciar en la figura.
186
Lo nico que tendramos que hacer es presionar en la sugerencia de correccin, que en este
caso es la nica que hay, pero en otros casos pueden ser varias las opciones y tendramos que
elegir la que creamos adecuada.
Nota:
La funcin IsDefined slo comprueba los valores que se han
definido en la enumeracin, no las posibles combinaciones que
podemos conseguir sumando cada uno de sus miembros, incluso
aunque hayamos usado el atributo FlagsAttribute.
187
Ahora, lo que ms nos interesa, crear un nuevo proyecto, al dar clic en el botn nuevo proyecto
te aparecer el siguiente explorador
188
189
Para que se muestre el formulario (Form1), haz doble click en dicho "elemento" del explorador
de soluciones.
Lo que vamos a hacer ahora es cambiar la separacin de los puntos que se muestran en el
formulario, ese "grid" o grilla, servir para ajustar los controles (ya sabrs de qu hablo) que se
aadan a dicho formulario.
Por defecto la separacin es de 8x8 puntos o pixels... y vamos a ponerlo en 4x4.
Selecciona el formulario, simplemente con hacer un click en l es suficiente.
En el panel de la derecha, debajo del explorador de soluciones, est la ventana de propiedades
del elemento que actualmente est seleccionado.
en nuestro caso son las propiedades del Form1. Vamos a buscar el elemento GridSize para
poder cambiar el tamao de separacin. Vers que se muestran dos valores separados por
punto y coma, pero tambin hay una cruz a la izquierda de la palabra GridSize, si pulsas en esa
cruz, se mostrarn los tamaos a lo que se refiere esos valores separados por punto y coma:
190
Controles Bsicos
Label (Etiqueta)
Propiedades:
Font: Permite establecer el tipo de fuente (Name), tamao (Size), Negrita (Bold),
Cursiva (Italic), Subrayado (Underline).
Propiedades:
Enabled: el valor FALSE evita que el usuario pueda interactuar con el control.
Multiline: el valor TRUE permite que el textbox soporte varias lneas de texto.
Button (Botn)
Propiedades:
191
Disear una aplicacin que permita ingresar el nombre de un cliente, su clave de 3 caracteres,
y que luego se muestre un mensaje de bienvenida.
Objeto
Propiedad
Valor
Name
frmBienvenida
FormBorderStyle
FixedSingle
MaximizeBox
False
MinimizeBox
False
AceptButton
Button1
Text
INGRESO DE DATOS
Label1
Text
Label2
Text
Clave secreta:
Name
lblMensaje
Autosize
False
BorderStyle
FixedSingle
Formulario
Label3
Text
TextBox1
Name
txtCliente
BackColor
ForeColor
Blue
Font
Bold: True
Text
(Copiar y pegar el anterior, y modificar las siguientes
propiedades)
TextBox2
Name
txtClave
MaxLength
PasswordChar
Name
btnMostrar
Text
Mostrar
Button1
192
193
Contenido.
Estructuras de Control
Estructuras Condicionales.
Son procesos que permiten evaluar una condicin o expresin lgica, y realizar un
bloque de instrucciones si el resultado es Verdadero, u otro, si el resultado es Falso.
If ExpresinLgica Then
.
Instrucciones del Bloque de Verdad
Else
.
Instrucciones del Bloque de Falsedad
End If
194
Aplicacin de ejemplo:
Disear un programa que permita ingresar el nombre de un alumno, y sus dos notas
correspondientes a Examen Parcial y Examen Final. Mostrar el promedio de dichas
notas, y mostrar la condicin de APROBADO o DESAPROBADO.
If
Permitir End
que solamente
ingresen valores numricos en Examen Parcial y Final.
End Sub
Private Sub txtEP_TextChanged(..)
If not IsNumeric(txtEP.Text) then
txtEP.Text=0
txtEP.Focus()
If
Tcnica de Programacin End
Orientada
a Objetos
End Sub
195
End Sub
Private Sub btnCalcular_Click(..)
Dim P as Single
Dim EP as Single=CSng(txtEP.text)
Dim EF as Single=CSng(txtEF.text)
P=(EP+EF)/2
If P>=10.5 then
txtCondicion.Text=Aprobado
196
Aplicacin de ejemplo:
PROMEDIOS
20
Excelente
Entre 15 y 19
Bueno
Entre 11 y menor a 15
Regular
Menor que 11
Malo
197
Estructuras Repetitivas
Son procesos que permiten repetir una serie de instrucciones, ya sea controlada
mediante un contador o mediante el resultado de evaluar una expresin lgica.
Do While (ExprLgica)
Instrucciones (si la Exp. Lgica es Verdadera)
.
[Exit Do]
Loop
Do
Instrucciones (si la Exp. Lgica es Verdadera)
.
[Exit Do]
Do
Instrucciones (si la Exp. Lgica es Falsa)
.
[Exit Do]
198
Aplicacin de ejemplo:
Construir una aplicacin que permita generar los 10 primeros mltiplos de 5, en una
caja de texto de tipo multilnea.
Usando Do While
199
Usando For
200
Propiedades:
Propiedades:
3. Grupo de Botones(GroupBox)
Antes conocido como Frame, es un contenedor que se utiliza para agrupar varias
opciones, que pueden ser: de opcin nica como los RadioButton o de opcin mltiple
como los CheckBox. Este control se utiliza como contenedor y por si solo no tiene
mucha funcionalidad.
Propiedades:
201
Aplicacin de ejemplo:
Disear una aplicacin que permita ingresar el sueldo de una persona (Sueldo Bruto).
Se podrn seleccionar los descuentos a los cuales esta afecto como Impuesto a la
Renta (5%), descuento por AFP (2%) y descuento por ESSALUD (1%), todos se
aplican sobre el sueldo bruto. Adems, se dar una bonificacin de 100.00 a los
empleados que tienen estado civil CASADO. Mostrar los importes totales de los
descuentos, bonificaciones y Sueldo Neto.
202
Else
Ejecute la aplicacin y compruebe. A continuacin, se realizar el mismo
proceso de
manera
DAFP
= 0directa desde los radiobuttons y desde los checkbox.
End If
Private Sub rbtSol_CheckedChanged(..)
If chkEssalud.Checked Then
txtTBon.Text = 0
DESSALUD = 0.01 * SB
Else
End Sub Sub rbtCas_CheckedChanged(..)
Private
DESSALUD = 0
txtTBon.Text = 100
End If
End Sub
TDESC=IR+DAFP+DESSALUD
NETO=SB+TBON-TDESC
203
txtTBon.Text = 100
Segn la forma anterior, tambin se podra utilizar en la codificacin del grupo
deEnd
checkbox.
Select
204
Propiedades:
Aplicacin de ejemplo:
205
End Sub
Private Sub btnAgregar_Click(..)
Dim cad as String = Trim(txtSigno.Text)
lstSignos.Items.Add(cad)
txtSigno.Text=
txtSigno.Focus()
206
End Sub
o Eliminar todos los elementos del listbox.
End Sub
Propiedades:
Name: por motivos de reconocimiento, se puede anteceder el prefijo cbo al nombre.
DropDownStyle: determina el estilo del ComboBox.
207
Aplicacin de ejemplo:
End with
Dim signos()={Aries,Tauro,Geminis,Acuario,
Escorpio,Capricornio}
cboEstilo3.Items.Addrange(signos)
208
PictureBox (PictureBox)
El PictureBox es un control que permite insertar un archivo de formato grfico, el cual
puede ser importado desde un archivo de recursos, o como referencia a un archivo en
alguna ubicacin.
Propiedades:
Aplicacin de ejemplo:
209
Image:
210
211
En el combobox:
Private Sub cboImagenes_SelectedIndexChanged (..)
Select Case cboImagenes.SelectedIndex
Case 0
picEmoticon.Image = My.Resources.burlon
Case 1
picEmoticon.Image = My.Resources.golpeado
Case 2
picEmoticon.Image = My.Resources.tragon
Case 3
Aplicacin de ejemplo:
picEmoticon.Image = My.Resources.emoticon
Disear un formulario que muestre dos cuadros de lista y una serie de botones que
permitan pasar los elementos
de una lista a otra.
End Select
End Sub
212
Declarar tres constantes que almacenen textos que sern usados en cajas de mensaje:
"Lista de Elementos", "Para eliminar un dato, debe seleccionarlo previamente",
"Para pasar un dato, debe seleccionarlo previamente".
Private Const msgbox_Title As String = "Lista de
Elementos"
End Sub
213
MessageBox.Show(msgbox_Eliminar,
Pasar un elemento
del cuadro de lista 1 al cuadro de lista 2. msgbox_Title,
MessageBoxButtons.OK, MessageBoxIcon.Information)
Private Sub Button6_Click(..)
End If
'Eliminar ListBox1
End Sub
If ListBox1.SelectedIndex <> -1 Then
'Si hay datos seleccionados en el control,
'eliminamos el dato seleccionado
ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
Label1.Text = ListBox1.Items.Count & "
elemento(s)"
Else
MessageBox.Show(msgbox_Eliminar,
msgbox_Title,
Pasar todos los elementos
del cuadro de lista 1 al cuadro de lista
2.
MessageBoxButtons.OK, MessageBoxIcon.Information)
Private Sub
End Button2_Click(..)
If
End Sub Dim a As Integer = 0
'Pasa un dato seleccionado del control ListBox1
al
control ListBox2
If ListBox1.SelectedIndex <> -1 Then
'
'
214
End Sub
215
El botn Ordenar
datos permitir
ordenar alfabticamente los
de ambos
Label1.Text
= ListBox1.Items.Count
& elementos
" elemento(s)"
cuadros de lista.
Label2.Text = ListBox2.Items.Count & " elemento(s)"
Private Sub Button7_Click(ByVal ..)
End Sub
ListBox2.Sorted = True
ListBox2.Sorted = False
End Sub
216
Formulario Padre
Formulario 1
Formulario Hijo 1
Formulario 3
Formulario Hijo 2
Formulario 2
Para cargar formularios en un proyecto y poder interactuar entre ellos, tenemos diferentes
opciones:
1.- Instanciamos un formulario y lo cargamos. Este es la forma tradicional de la orientacin a
objetos clsica y que es la usada en VB.NET 2002 y VB.NET 2003. Tambin utilizada en VB
2005 por supuesto:
2.- Utilizamos una instancia por defecto para cargar el formulario utilizando el nombre de
espacio My (slo para Visual Basic 2005):
3.- Utilizamos una instancia por defecto para cargar el formulario de forma directa (slo para
Visual Basic 2005):
217
En esta sesin, crearemos un formulario de acceso que permita abrir un formulario principal de
tipo MDI, que a su vez contenga una barra de Men (MenuStrip) desde donde llame a otros
formularios hijos, y una barra de estado (StatusStrip) que permita mostrar cierta informacin.
Objeto
Formulario
TextBox1
Propiedad
Valor
Name
frmAcceso
FormBorderStyle
FixedSingle
MaximizeBox
False
MinimizeBox
False
Text
ACCESO AL SISTEMA
Name
txtUsuario
Name
txtPassword
PasswordChar
Name
btnIngresar
Text
&Ingresar
Enabled
False
Name
btnCancelar
Text
&Cancelar
TextBox2
Button1
Button2
218
Objeto
Propiedad
Valor
Name
frmPrincipal
IsMDIContainer
True
Text
PANEL PRINCIPAL
WindowState
Maximized
Formulario
El control MenuStrip
permite insertar una barra de Men que
presenta opciones que permiten realizar diferentes tipos de acciones, como
abrir formularios, cargar aplicaciones, salir del proyecto, etc.
219
Insertar un separador.
220
Para insertar las imgenes junto a las opciones del men, establecer en la
propiedad Image el valor de
El control StatusStrip
permite insertar una barra de Estado
que presenta paneles en los cuales se puede mostrar informacin como por
ejemplo, un mensaje de confirmacin, una accin a realizar, opciones activas
del sistema como activacin del teclado numrico o maysculas, etc.
221
Objeto
ToolStatusStrip3
ToolStatusStrip2
Propiedad
Valor
BorderSides
Todo (All)
Autosize
False
BorderStyle
SunkenOuter
150
Text
0:0:0
Image
ImageAlign
MiddleRight
BorderSides
Todo (All)
Autosize
False
BorderStyle
SunkenOuter
624
Text
ToolStatusStrip1
BorderSides
Todo (All)
Autosize
False
BorderStyle
SunkenOuter
150
Text
Usuario:
Image
ImageAlign
MiddleLeft
El control ToolStrip
permite insertar una barra de
herramientas que muestra botones que permitan realizar las acciones ms
importantes, como carga de formularios o aplicaciones.
222
Objeto
(Button)
Propiedad
DisplayStyle
Image
Image
ToolTipText
Calculadora
DisplayStyle
Image
Image
ToolTipText
MS Excel 2007
DisplayStyle
ImageAndText
Image
Text
Tabla de Multiplicar
ToolStripButton1
(Button)
Valor
ToolStripButton2
(Separator)
ToolStripSeparator1
(Button)
ToolStripButton4
223
btnIngresar.Enabled = False
Si el password ingresado es SISE (maysculas o minsculas), ocultar
frmAcceso
mostrar frmPrincipal.
End yIf
Private Sub txtUsuario_TextChanged(..)Handles
txtUsuario.TextChanged, txtPassword.TextChanged
End Sub
224
Como este bloque de acciones es el mismo que debe ser ejecutado al pulsar el
botn respectivo en el ToolStrip, entonces podramos modificar el Handles.
Private Sub CalculadoraDeWindowsToolStripMenuItem_Click(..)
Handles CalculadoraDeWindowsToolStripMenuItem.Click,
ToolStripButton1.Click
Try
Dim n = Shell("C:\Windows\System32\calc.exe",
AppWinStyle.NormalFocus)
Catch ex As Exception
MessageBox.Show("No se ha encontrado la
aplicacion", "Error", MessageBoxButtons.OK,
Se pueden heredarMessageBoxIcon.Warning)
las caractersticas de un formulario?
End Try
La herencia es una de las caractersticas resaltantes de la programacin orientada a objetos, y
cuando diseamos
un formulario con determinadas propiedades, podemos hacer que otros
End Sub
formularios hereden dichas propiedades, ahorrando bastante tiempo en el diseo de las
interfaces.
Objeto
Formulario
Propiedad
Valor
Name
frmPlantilla
Backcolor
(Amarillo claro)
FormBorderStyle
FixedSingle
True
MaximizedButton
False
MinimizeButton
False
Text
225
Ir al Men Generar > Generar Sistema (este nombre depende del nombre del
proyecto).
Seleccionar el formulario que ser usado para heredar las propiedades a los
hijos.
226
227
En la opcin Tabla de Multiplicar, del mismo men, escribir este otro cdigo, y
notar las diferencias entre ambos.
End Sub
En frmTabla, escribir el cdigo que debe ser usado en el botn Generar para
mostrar la tabla de multiplicar del 1 al 12 de un nmero entero cualquiera
ingresado en la caja de texto (Consistencie que solamente ingresen nmeros)
En frmArea, escribir el cdigo que debe ser usado en el botn Operar para
calcular el rea de un Rectngulo. Debe consistenciar que solamente ingresen
valores numricos en las cajas de texto de base y altura.
Ejercicios propuestos.
1- Ingrese por teclado en una caja de texto la hora en formato de 24 horas y en otra caja
de texto la cantidad de minutos al hacer clic en un botn deber salir la hora en
formato de 12 horas por ejemplo si se ingresa 23 en una caja y en la otra 12 el
resultado seria 11:12:PM
2- Ingrese la cantidad de minutos hablados por una persona y escoja el tipo de llamada
(Local, Nacional, Internacional).Se visualizara el importe de la llamada sabiendo que
por los 3 primeros minutos se paga S/ 1.00 y por cada minuto adicional se paga 0.50
en caso sea local si es nacional se incrementa el 25% y si es internacional se
incrementa el 60% a los precios por minuto.
4- Ingrese por teclado dos nmeros y al escoger un signo de operacin se deber mostrar
el resultado de la operacin.
228
6- Ingrese un nmero cualquiera y muestre la cantidad de cifras que tiene segn sea el
caso.
Ejemplo: 203 = Tiene 3 cifras, 45678 = Tiene 5 cifras tome en cuenta que el numero
mximo a ingresar es un milln.
229
12- Se deber ingresar el largo y el ancho del terreno y conforme vayan digitndolo
deber salir el total (Largo * ancho)
13- Se deber ingresar el precio por metro y al escoger una categora el precio se
incrementara en un 10, 20, y 30 % respectivamente segn la categora, adems de
salir el precio total que ser el total de rea * el precio y si se escogi en tipo de alquiler
Contado se le har un Descuento de 10% al precio total y si es crdito se le har un
recargo de 15 %.
15- Ingrese un numero y Genere las siguientes series: (el resultado se mostrara en un label
o en un text)
- 1,3,5,7,.....
- -1,+3,-5,+7...
- 1,3,2,5,3,7,4,9,5,11....
- 0,1,1,2,3,5,8,13...(Serie Fibonacci)
16- Genere 100 nmeros aleatorios y diga cuantos primos mayores a 50 hay, perfectos
menores a 10 hay, pares e impares.
230
17- Genere 100 nmeros aleatorios y al finalizar diga cual es el mayor y el menor.
23- Ingrese Una fecha y diga cuantos das faltan para acabar el ao, cuantos das han
pasado desde esa fecha hasta la fecha actual, que da cae esa fecha (Lunes, martes),
y muestre la misma fecha en el siguiente formato: Lunes 15 de Abril de 2003 (Por
ejemplo)
24- Ingrese en una caja de texto una cadena y al finalizar diga cuantas palabras tiene dicha
cadena y cual es la cantidad de caracteres que tiene la palabra con mayor longitud
231
28- Cuando se haga clic en Mostrar Resultado se debe mostrar la edad del trabajador, el
tiempo de servicio y el cdigo que se generara de la siguiente manera: el ao de
ingreso luego la letra M o F segn su sexo , los 2 primeros caracteres de su apellido
paterno, los 2 primeros caracteres de su apellido materno, el primer carcter de su
nombre y un correlativo
29- Adems al ingresar sus nombres al perder el enfoque se deber cambiar el texto por
maysculas y al entrar al enfoque de algn texto el color de fondo deber cambiar y al
salir del enfoque deber regresar al color original que tuvo.
232
Contenido.
Los Arrays (trmino en ingls que se refiere a los Arreglos), en las versiones anteriores de
Visual Basic eran tipos de datos de los llamados por valor, al igual que lo son los tipos Integer,
Double, etctera. Pero en Visual Basic .NET, los arrays realmente son tipos por referencia.
Las variables que hemos estado usando hasta ahora, eran de tipo escalar: slo pueden
contener un valor a la vez, pero resulta que en ocasiones nos podemos ver en la necesidad de
querer tener en una misma variable, valores que de alguna forma estn relacionados. Por
ejemplo, si tenemos una coleccin de discos, nos podra interesar tener esa discografa incluida
en una misma variable para poder acceder a cualquiera de esos discos sin necesidad de tener
que crear una variable distinta para cada uno de los discos, ya que sera totalmente ineficiente
si, por ejemplo, quisiramos imprimir una relacin de los mismos.
Realmente para el ejemplo, hay otros tipos de datos que seran ms prcticos, pero cuando
veamos esos otros tipos de datos, sers t el que decida cual utilizar.
Una de las formas en las que podemos agrupar varios datos es mediante los arrays (o
matrices). Usando un array, podemos acceder a cualquiera de los valores que tenemos
233
Sabiendo esto, podemos comprobar que sera fcil recorrer el contenido de los arrays mediante
un bucle For.
Los tipos de datos de las variables usadas como array, pueden ser de cualquier tipo,
dependiendo de lo que queramos guardar. Por ejemplo, si queremos guardar los nombres de
los discos que tenemos, podemos usar un array del tipo String, que lo que nos interesa es
saber el porcentaje de goles por partido de nuestro equipo de ftbol favorito, el tipo de datos
del array poda ser Integer. Incluso si queremos, tambin podemos crear un array de un tipo
que nosotros hayamos definido o de cualquier clase que exista en el .NET Framework.
De cualquiera de estas dos formas estaramos creando un array de tipo Integer llamada X.
Cuando declaramos una variable de esta forma, slo le estamos indicando al VB que nuestra
intencin es que la variable a sea un array de tipo Integer, pero ese array no tiene reservado
ningn espacio de memoria.
234
X(0)
10
12
X(2)
X(1)
X(3)
Por ejemplo, para almacenar el valor 3 en la posicin 3 del array X, haramos lo siguiente:
X(3) = 3
De igual forma, si queremos utilizar ese elemento que est en la posicin 3 para una operacin,
podemos hacerlo como con el resto de las variables, pero siempre usando el parntesis y el
nmero de elemento al que queremos acceder:
El ndice para poder acceder al elemento del array puede ser cualquier expresin numrica,
una variable o como hemos estado viendo en estos ejemplos, una constante. La nica
condicin es que el resultado sea un nmero entero.
Pero el ndice superior puede ser el que nosotros queramos, aunque sin pasarnos, que la
memoria disponible se puede agotar si pretendemos usar un valor exageradamente alto.
235
Esto es til si queremos acceder mediante un bucle For, en el siguiente cdigo se mostraran
todos los elementos del array a:
Aunque hay que tener presente que si inicializamos un array al declararla, no podemos indicar
el nmero de elementos que tendr, ya que el nmero de elementos estar supeditado a los
valores asignados.
Para inicializar un array debemos declarar ese array sin indicar el nmero de elementos que
contendr, seguida de un signo igual y a continuacin los valores encerrados en llaves.
Veamos un ejemplo:
236
Usando cualquiera de estas dos formas mostradas, el nmero de elementos ser 5, por tanto
los ndices irn desde 0 hasta 4.
237
Aplicacin de ejemplo:
Disear un formulario (frmDistritos) que al iniciar muestre los distritos Ate, Barranco y
Cercado de Lima, que sean ledos desde un arreglo de nombre Distritos y sea mostrado en un
ListBox.
238
End Sub
239
240
Ejemplo :
Dim v(4) as String
v.length() esto devolvera 5 , ya que el arreglo v tiene 5 elementos (0 al 4)
Ejemplo
Dim V(3) as Integer ={13,7,16}
Array.Sort(V) aqu la clase Array esta ordenado el Arreglo V
Ejemplo
Dim V1(3) as Integer ={13,7,16}
Dim V2(3) as Integer
V1.CopyTo(V2,0) Aqu se esta copiando en el arreglo V2 a partir de la posicin 0 los
datos que hay en el arreglo V1
241
Casi siempre el ndice menor ser 0 al no ser que el arreglo empiece con otro ndice.
242
Aplicaciones.
End Sub
243
2- Ingrese un numero en una caja de texto, al hacer click en el botn Agregar se debe
de agregar el numero a un arreglo dinmico adems de mostrador en un listbox
Tcnica de Programacin
Dim posOrientada
As Int16a Objetos
Capturamos el ndice mayor del arreglo
pos = V.GetUpperBound (0)
244
3- Llene un vector de 100 elementos con nmeros aleatorios sin que estos se repitan y
mustrelos en un listbox
Declaramos el vector
Private Vec (99) As Integer
Ahora creamos una funcin llamada BuscarItem, esta funcin recibir como
parmetro un numero y se buscara en todo el vector.
Si ese numero se encuentra la funcin devuelve True caso contrario False
Function BuscarItem(ByVal N%) As Boolean
Dim Estado As Boolean = False
Dim I As Integer
For I = 0 To Vec.GetUpperBound(0)
If Vec(I) = N Then
Estado = True
Exit For
End If
Next
BuscarItem = Estado
End Function
Private Sub Button1_Click(..)
Dim N As Int16
Dim J As Int16 = 0
Me.ListBox1.Items.Clear()
Aqu se inicia el bucle para llenar los datos al vector
Do While J <= Vec.GetUpperBound (0)
Se genera el numero aleatorio
N = CInt (Rnd () * 100)
Llamamos a la funcin BuscarItem y le enviamos el numero
generado si la funcin devuelve False quiere decir que no lo
encontr.
Si no lo encontr lo agrega al vector.
If Not BuscarItem(N) Then
Vec(J) = N
245
246
Adems hay un botn Buscar que mostrar un INPUTBOX donde se ingresara el nombre de un
pas, si ese pas existe en el arreglo se seleccionara del Listbox, caso contrario se mostrara un
mensaje indicando que No existe
247
Desarrollo
Se declara el arreglo dinmico
Private V () As String
Private Sub CmdAgregar_Click(..)
Dim Rpta As Integer, P As String
Dim I As Integer = 0
Empieza el proceso hasta que en el mensaje se responda No
Do
Se abre un cuadro de dialogo para ingresar un pas
P = InputBox ("Ingrese Pas")
Se agrega un elemento al vector
ReDim Preserve V (I)
Se agrega el pas al vector
V (I) = P
Se agrega el valor del vector al Listbox
Me.ListBox1.Items.Add (UCase (V (I)))
Se incrementa la variable I es la que controla la posicin
del elemento que se esta llenando en le vector
I = I + 1
Aqu se muestra el mensaje y la respuesta se guarda en la
variable Rpta (Son 2 posibles respuestas Si VbYes y No
VbNo)
Rpta = MsgBox ("Desea Continuar...?", MsgBoxStyle.Question +
MsgBoxStyle.YesNo, "Confirmar")
Loop Until Rpta = vbNo
End Sub
Private Sub CmdBuscar_Click(..)
Dim P As String
Dim Estado As Boolean = False
Se ingresa el pas a buscar
P = InputBox ("Ingrese pas a buscar")
Dim I%
For I = 0 To V.GetUpperBound(0)
Se busca y si e encuentra se selecciona el listbox
248
End If
Next
Al final si Estado es igual
249
250
Aqu se esta agregando una columna llamada 1 que tiene de ancho 40 y su alineacin ser al
centro
Esto hace que se vea las columnas, ya que sin esta propiedad no se podra ver los
encabezados de las columnas ni tampoco todas las filas creadas.
En este ejemplo se esta agregando Per al listview, cada vez que se agrega un tem al
Listview este toma un ndice que empezara de 0.
Que pasara si queremos seguir llenando mas pases en la misma fila pero en otras columnas?
La sentencia seria esta
Me.ListView1.Items(0).SubItems.Add(Bolivia)
Aqu dice que Bolivia ser un SubItem de la fila 0 sea se mostrara en otra columna que no sea
la principal (La principal seria la columna 0)
6- Llene 2 matrices con nmeros aleatorios y en una tercera matriz guarde la suma de las
2 anteriores, muestre las matrices en Listview
251
252
253
Me.ListView1.Columns.Add("5", 40,
HorizontalAlignment.Center)
254
Se le da formato al ListView
Me.ListView1.Columns.Add("1", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("2", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("3", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("4", 40, HorizontalAlignment.Center)
Me.ListView1.Columns.Add("5", 40, HorizontalAlignment.Center)
Me.ListView1.View = View.Details
Call Llenar()
End Sub
Private Sub CmdCalcular_Click(..)
Dim F%, C%, Suma1%, Suma2%
For F = 0 To m.GetUpperBound(0)
For C = 0 To m.GetUpperBound(1)
If F = C Then
suma1 = suma1 + m(F, C)
End If
If F + C = 4 Then
Suma2 = Suma2 + m(F, C)
End If
Next
Next
Me.lbldiag1.Text = Suma1
Me.lbldiag2.Text = Suma2
End Sub
255
Ejercicios propuestos.
2- Luego se deber de ingresar Una letra en una caja de texto, al hacer clic en un botn
Buscar se debe de mostrar la cantidad de veces que se repite esa letra en todo el
arreglo dinmico.
5- Llenar una matriz de 5 x 5 con nmeros aleatorios sin que estos se repitan, luego
mostrarlos en un ListView
6- Llenar un vector de 25 elementos con nmeros aleatorios, luego pasarlo a una matriz
de 5 x 5. Mostrar el arreglo en un listbox y la matriz en un Listview
5. Llenar un vector con nmeros aleatorios. Luego se debe de ingresar un nmero, si este
existe se debe de eliminar dicho nmero del arreglo. Utilice un arreglo dinmico.
256
Contenido.
Recursividad.
Tipos de Procedimientos.
Existen tres tipos de procedimientos en Microsoft Visual Basic .NET: procedimientos Sub,
procedimientos Function y procedimientos Property.
257
Los procedimientos Sub realizan acciones pero no devuelven un valor al procedimiento que
origina la llamada. Los controladores de eventos son procedimientos Sub que se ejecutan en
respuesta a un evento.
Los procedimientos Function pueden devolver un valor al procedimiento que origina la llamada.
La instruccin MessageBox.Show es un ejemplo de funcin.
Los procedimientos Property devuelven y asignan valores de propiedades de clases,
estructuras o mdulos.
Uso de Procedimientos.
Debido a esta funcionalidad, los procedimientos resultan tiles para realizar tareas repetidas o
compartidas. En lugar de escribir el mismo cdigo ms de una vez, podemos escribir un
procedimiento e invocarlo desde varios puntos de nuestra aplicacin o desde otras
aplicaciones.
Accesibilidad.
Modificador de
acceso
Descripcin
Public
Friend
Private
Nota.
El modificador de acceso Protected nicamente puede utilizarse en procedimientos declarados
dentro de una clase
258
El siguiente cdigo crea un procedimiento Sub (Sub AboutHelp) que utiliza un cuadro de
mensaje para mostrar un nombre de producto y un nmero de versin:
Private Sub AboutHelp( )
MessageBox.Show("MyProgram V1.0", "MyProgram Help")
End Sub
259
Valores de retorno
El valor que devuelve un procedimiento Function al programa que origina la llamada se
denomina valor de retorno. La funcin devuelve el valor en una de las dos formas siguientes:
-
260
Nota
A pesar de esta sutil diferencia, los trminos argumento y parmetro a menudo se utilizan
indistintamente. Este mdulo utiliza la terminologa utilizada en la documentacin de Visual
Studio .NET.
261
Por
referencia
Palabra
clave: ByRef
Explicacin
Implicaciones
Ventaja
El procedimiento
invocado recibe una
copia de los datos
cuando es invocado.
Si el procedimiento invocado
modifica la copia, el valor
original de la variable
permanece intacto. Cuando la
ejecucin retorna al
procedimiento de llamada, la
variable contiene el mismo
valor que tena antes de que el
valor se pasara.
Protege la variable
de ser cambiada por
el procedimiento
invocado.
El procedimiento
invocado recibe una
referencia a los datos
originales (la direccin
de los datos en
memoria) cuando es
invocado.
El procedimiento invocado
puede modificar la variable
directamente. Cuando la
ejecucin retorna al
procedimiento de llamada, la
variable contiene el valor
modificado.
El procedimiento
invocado puede
utilizar el argumento
para devolver un
nuevo valor al
cdigo de llamada.
Excepciones
El elemento de programacin que subyace en un argumento puede ser un elemento variable,
cuyo valor puede ser cambiado, o un elemento no variable. Los argumentos no variables nunca
son modificados en el cdigo de llamada, aunque se pasen por referencia. El procedimiento
invocado podra modificar su copia de ese argumento, pero la modificacin no afectara al
elemento subyacente en el cdigo de llamada.
Elementos no variables
Constantes
Literales
Elementos de matrices
Enumeraciones
Elementos de estructuras
Expresiones
262
Declarar argumentos
Utilizamos la misma sintaxis para declarar los argumentos para procedimientos Sub y
procedimientos Function. Declaramos cada argumento de un procedimiento del mismo modo
en que declaramos una variable, especificando el nombre del argumento y el tipo de datos.
Tambin podemos especificar el mecanismo de paso y si el argumento es opcional.
Nota
Si el argumento es opcional, debemos incluir tambin la palabra clave Opcional y proporcionar
un valor predeterminado en la declaracin, como sigue:
Opcional [ByVal|ByRef] nombreargumento As datatype = defaultvalue
En el siguiente ejemplo, el procedimiento Sub Hello est diseado para tomar un argumento
Name de tipo String por valor desde un procedimiento de llamada.
Nota
No es necesario que los nombres de argumentos utilizados cuando se invoca un procedimiento
coincidan con los nombres de parmetros utilizados para definir el procedimiento.
263
264
SubCount(arg1, , , arg4)
' Leaves out arg2 and arg3
Reutilizacin de cdigo
Uno de los procesos ms importantes en la creacin de una aplicacin basada en Visual Basic
es disear cdigo para su reutilizacin. El modo como escribimos el cdigo afecta a su
reutilizacin.
Usar
un(a)
para
Ejemplo
Estructura
Mdulo
Proporcionar funciones de
utilidad y datos globales para su
uso por mltiples mdulos o
clases
Clase
265
Structure TableDimensions
Private legHeight, topWidth, topDepth As Integer
Public Sub New(ByVal legHeight As Integer, _
ByVal topWidth As Integer, ByVal topDepth as Integer)
Me.legHeight = x
Me.topWidth = y
Me.topDepth = z
End Sub
End Structure
266
Crear un mdulo
Para crear un mdulo, aadimos primero un mdulo a nuestro proyecto. A continuacin,
escribimos las instrucciones del cdigo que definen los datos y procedimientos de nuestro
mdulo.
Sintaxis
La siguiente sintaxis declara un bloque de mdulo:
Accesibilidad de un mdulo
Al igual que con los procedimientos y las variables, utilizamos los modificadores de acceso para
definir la accesibilidad de un mdulo. Si no utilizamos un modificador de acceso, los mdulos
se declaran Friend de modo predeterminado.
Modificador de
acceso
Definicin
Public
Friend
267
Uso de procedimientos
Uno de los principales beneficios del uso eficaz de procedimientos es la reutilizacin de cdigo.
Los procedimientos que creamos en un programa pueden utilizarse en ese programa y en otros
proyectos, frecuentemente con poca o nula modificacin. Los procedimientos son tiles para
tareas repetidas o compartidas, como clculos utilizados frecuentemente.
Flujo de cdigo
Cada vez que se invoca un procedimiento Sub, se ejecutan sus instrucciones, empezando por
la primera instruccin ejecutable despus de la instruccin Sub y finalizando con la primera
instruccin End Sub, Exit Sub o Return encontrada. Despus de que el procedimiento Sub
ejecute nuestro cdigo, devuelve la ejecucin del programa a la lnea de cdigo que sigue a la
lnea que invoc el procedimiento Sub.
268
Nota
Los procedimientos Sub no devuelven un valor a la instruccin de llamada. Sin embargo, un
procedimiento Sub pasar informacin de retorno al cdigo de llamada modificando argumentos
pasados por referencia.
Sub DataButton_Click(...)
SetData( )
End Sub
Sub DataButton_Click(...)
MessageBox.Show(SetData( ))
End Sub
' Causes an error, because the Show method expects a String
' data type, not un procedure
269
Public Sub SetData(ByVal cars As Integer, ByVal trucks As _ Integer, ByVal vans As
Integer)
' Code for SetData Procedure
End Sub
La sintaxis para invocar este procedimiento incluye el nombre del procedimiento y la lista de
argumentos en parntesis, como se muestra en el siguiente cdigo:
Sub DataButton_Click(...)
SetData(10, 20, 30)
End Sub
Sub DataButton_Click( )
SetData(10, 20)
End Sub
' Causes an error, because there is no valor for the third
' parametre of the SetData procedure. The calling statement
' must provide values for all arguments that are not optional.
270
Las siguientes llamadas de ejemplo muestran cmo podramos invocar esta funcin:
271
Flujo de cdigo
Cada vez que se invoca la funcin se ejecutan sus instrucciones, empezando por la primera
instruccin ejecutable tras la instruccin Function y finalizando con la primera instruccin End
Function, Exit Function o Return encontrada.
Pasar matrices
Podemos pasar matrices unidimensionales o multidimensionales a procedimientos del mismo
modo que pasamos otros argumentos.
El siguiente ejemplo muestra cmo pasar una matriz unidimensional a un procedimiento:
272
Uso de ParamArray
Utilizamos la palabra clave ParamArray para denotar una matriz de parmetros. Esta palabra
clave indica que el argumento de un procedimiento es una matriz opcional de elementos de un
tipo especificado. Se aplican las siguientes reglas:
Un procedimiento slo puede tener una matriz de parmetros, y debe ser el ltimo
argumento de la definicin del procedimiento.
La matriz de parmetros debe pasarse por valor. Es una buena prctica de
programacin incluir explcitamente la palabra clave ByVal en la definicin del
procedimiento.
El cdigo dentro del procedimiento debe tratar la matriz de parmetros como una
matriz unidimensional, siendo cada elemento de la misma el mismo tipo de datos
que el tipo de datos ParamArray.
La matriz de parmetros es automticamente opcional. Su valor predeterminado es
una matriz unidimensional vaca del tipo de elemento del parmetro de la matriz.
Todos los argumentos que preceden a la matriz de parmetros deben ser
obligatorios. La matriz de parmetros debe ser el nico argumento opcional.
273
274
275
Utilizacin de Application.Exit
Para cerrar una aplicacin, invocamos el mtodo Application.Exit utilizando la siguiente
sintaxis:
Application.Exit( )
Por ejemplo, podemos insertar este cdigo en el controlador de eventos Click de un botn.
Cuando el usuario haga clic en el botn, la aplicacin se cerrar.
y = y + x
Llamado a la
procedimiento
Next x
funcion
al
intSum = y
End Sub
End Sub
277
Ejercicios propuestos
2- Escribir una funcin que dado un nmero entero, devuelva una seal que indique si
dicho nmero es primo o no.
3- Escribir una funcin que dados 2 nmeros, calcule el porcentaje que el primero
representa respecto del segundo.
4- Escribir una funcin que dados a y b devuelva el cociente de la divisin entera, sin
utilizar el operador correspondiente del lenguaje. Validar los tipos de datos de entrada.
5- Escribir una funcin que dados a y b devuelva el resto de la divisin entera, sin utilizar
el operador correspondiente de lenguaje. Validar los tipos de datos de entrada.
6- Escribir una funcin que dado un cdigo numrico de m dgitos, separe un sub-cdigo
consistente en una cantidad n<m de dgitos a partir del k-simo lugar a contar del dgito
menos significativo. Utilizarla en un programa que ingrese un listado de cdigos
numricos junto con sus correspondientes parmetros m,n y k y liste dichos cdigos
de entrada junto con el sub-cdigo deseado.
7- Un nmero entero positivo se dice perfecto si es igual a la suma de todos sus divisores,
excepto el mismo.
Se pide:
a) Escribir una funcin booleana que llamada desde un programa, permita discernir si
un nmero (nico parmetro) es perfecto.
b) Dar un ejemplo de cmo se hace referencia a dicha funcin desde un programa o
desde otro subprograma.
Nota: no usar variables globales.
8) Dos nmeros se dicen amigos cuando uno de ellos es igual a la suma de todos los
divisores
del otro excepto el mismo.
Ejemplo: los nmeros 220 (1+2+4+5+10+11+20+22+44+55+110=284)
y 284 (1+2+4+71+142=220) son amigos.
278
Se pide:
a) escribir una funcin booleana que llamada desde un programa, permita discernir si
dos nmeros (parmetros) son amigos.
b) Usar otra funcin para calcular la suma de los divisores de un nmero determinado.
c) Hacer referencia a dichas funciones desde un programa o desde otro subprograma.
4. Funcion MINIMO pasando tres valores numericos de tipo entero que devuelva el menor de
los tres numeros
5. Funcion MCD, pasando dos valore numericos, visualice el Maximo Comun Divisor de los
numeros
6. Funcin
SEGPALABRA el cual pasando como parmetro una FRASE, devuelva la
segunda palabra de dicha frase Ejemplo: SEGPALABRA(CURSO VISUAL BASIC) ------- VISUAL
7. Funcin PRIMO pasando por valor un nmero entero devuelva True si el nmero es
Primo y False si el nmero no es primo.
10. Pasando un nmero entero de cualquier longitud, devuelva el promedio de dichas cifras.
279
12. Pasando un nmero entero de cualquier longitud, devuelva el mismo valor de manera
ordenada.
14. Pasando una cadena, una posicin inicial y el nmero de caracteres a borrar ELIMINE una
subcadena de dicha cadena a partir de una posicin especificada.
Ejemplo : DELETEAR(VISUAL BASIC, 7, 6) ---- VISUAL
15. Pasando tres nmeros que representan el da, mes y ao devuelva una fecha como
cadena.
Ejemplo: FECHA(02, 12, 03) ---- 02 de Diciembre del 2003
280
Recursividad
Propiedad que tienen los subprogramas de poder ser re-invocados sin haber finalizado el
proceso de las sentencias correspondientes a una invocacin previa de si mismo. El concepto
deriva del de Relacin Recurrente.
En toda relacin recurrente / proceso recursivo se distinguen dos partes bien diferenciadas:
Caso Base
Caso Recursivo
Tipos de Recursividad
Subprograma 1
Indirecta
modulo.
Subprograma 1
Subprograma 2
281
Cmo funciona?
Cuando un subprograma se invoca a s mismo lo hace como si estuviera invocando a otro
subprograma, y en esto se cumplen todas las reglas de invocacin de subprogramas por parte
de otros subprogramas.
Es decir, todas las variables locales al programa invocante se almacenarn en el Stack, las
variables del programa invocado (el mismo) se inicializarn a basura y los parmetros tomaran
su valor correspondiente. Una vez finalizado el proceso, y no habiendo otra llamada recursiva,
se restauraran los valores de las variables del modulo invocante y se proseguir su ejecucin.
Ejemplos:
Forma Matemtica
Factorial
Implementacin Basic
Function fact(n as Integer) as Long
If n>0 then
Fact=N*Fact(N 1)
f(0) = 1
Else
Fact=1
End Function
Fibonaci
n>1
f(n) = 1
n<=1
If N>1 Then
Fib=Fib(N-1)+Fib(N-2)
Else
Fib=1
End If
282
Ejercicios Propuestos
1. Definir una funcin recursiva que dado un nmero entero, devuelva la suma de sus cifras.
Utilizarla para definir si un nmero es divisible por 3.
mediante multiplicaciones
3. Definir una funcin recursiva que devuelva la cantidad de dgitos de un nmero entero.
5. Definir una funcin recursiva para cada uno de los siguientes problemas
a) Calcular el promedio de los elementos del vector V de dimensin N.
b) Buscar el mnimo elemento del vector V de dimensin N.
c) Devolver la posicin del mximo elemento del vector V de dimensin N.
283
Contenido.
Funciones de Sistema
o Cadena
o Numericos
o Fecha
Formatenado la salida
FUNCIONES DE SISTEMA
Funciones de cadenas
Se denomina CADENA a una sucesin de caracteres. Una cadena puede tener uno o
varios caracteres alfanumricos. Una cadena es tambin una sucesin de nmeros.
Str(Expresin)
Cuando los nmeros se conviertan a cadenas, siempre se reservar un espacio inicial
para el signo de Number. Si Number es positivo, la cadena devuelta contiene un
espacio inicial; y el signo ms se da por supuesto. Un nmero negativo incluir el signo
menos (-) y ningn espacio inicial.
Right (cadena, n)
Extrae lo n ltimos caracteres de la cadena
284
Para utilizar las dos funciones anteriores que son propias de visual basic emplear
Microsoft.VisualBasic.Funcion
Resultado=Mid(cadena,6)
Retorna de visual net
LCase (cadena)
Devuelve otra cadena igual, pero con todos los caracteres en minsculas. (LCase =
Lower Case)
UCase (cadena)
Devuelve otra cadena igual, pero con todos loscaracteres en maysculas. (UCase =
Upper Case)
285
Len (cadena)
Devuelve la longitud de la cadena
Space (n)
Devuelve una cadena formada por n espacios.
LTrim
Elimina los posibles espacios que tenga una cadena por su izquierda.
Rtrim
Elimina los posibles espacios que tenga una cadena por su derecha.
Trim
Elimina los espacios que tenga una cadena, tanto por su izquierda como
derecha. (No elimina los espacios centrales de la cadena).
por su
StrConv
Convierte una cadena de caracteres en otra, segn las instrucciones que le sigan.
Puede sustituir a UCase o LCase si la instruccin es UpperCase o LowerCase
respectivamente, o poner la primera letra de todas las palabras de la cadena en
maysculas, si la instruccin es ProperCase.
286
Devuelve
Valor absoluto de un numero real
Parte entera de un real
Rnd
Exp
El objeto Math.
Funciones:
Math.round(n,d)
Redondea, con ciertos numeros de decimals
Math.Round(3.45, 1) 'Retorna 3.4
Math.Round(3.46, 1) 'Retorna 3.5
Math.PI
El valor de este campo es 3,14159265358979323846
Math.acos
Devuelve el ngulo cuyo coseno es el nmero especificado
287
Math.ceiling
Devuelve el nmero entero ms pequeo mayor o igual que el nmero especificado.
Math.ceiling(3.1) 'Retorna 4
Math.Floor
Devuelve el nmero entero ms grande menor o igual que el nmero especificado
Math.Floor(3.1) 'Retorna 3
Math.sqrt(n)
Devuelve la raz cuadrada de un nmero especificado.
Math.pow(n)
Devuelve un nmero especificado elevado a la potencia especificada
288
Aplicaciones
289
End If
lblres.Text = cadr
End Sub
290
En el Formulario 3.
Private Sub Button1_Click(..)
Dim x As New Form1()
x.ShowDialog()
End Sub
291
En el Formulario 1.
Private Sub btnSplit_Click(..)
Dim TempArray() As String
Dim CurIndex As Integer
lstOutput.Items.Clear()
If txtInput.Text.Length > 0 And
TempArray = txtInput.Text.Split(txtSeparator.Text)
End If
End Sub
292
En el Formulario 2.
Private Sub btnJoin_Click(..)
Dim TempArray() As String
Dim RandomInteger As New System.Random()
Dim CurIndex As Integer
Dim NumElements As Integer = Convert.ToInt32(txtArraySize.Text)
End Sub
293
Private Sub
CmdBin_Click(.)
N, r as String
n = Val(TxtNum.text)
cad = ""
Do While n <> 0
r = n Mod 2
n = n \ 2
cad = cad + Str(r)
Loop
LBR1 = StrReverse(cad)
End Sub
As String
, N, R as integer
Dim n%
n = Val(Text1)
cad = ""
Do While n <> 0
r = n Mod 16
n = n \ 16
If r > 9 Then
cad = cad + Chr(55 + r)
Else
cad = cad + Str(r)
End If
Loop
Lbr2 = StrReverse(cad)
End Sub
294
as Integer
as String
cad = Trim(Text1.text)
scad = ""
la Frase ingresada
PA = 1
For M = 1 To Len(cad)
Se pregunta si el caracter es un espacio blanco o M es la ultima posicion
If Mid(cad, M, 1) = " "
If
Then
M = Len(cad) Then P =M
PALABRA = ""
Else P = M - 1
For k = PA To P
PALABRA = Mid(cad, k, 1) + PALABRA
Next
scad = scad + " " + PALABRA
End If
PA = P + 1
Next
Text2.text
= scad
End Sub
295
P = Len(cad) \ 2 + 1
PL = Len(cad): a = 1: con = 1
CR = 1
CI = 1
CR
List1.AddItem cad3
For I = 1 To P
Cadena de la Izquierda
Cadena de La derecha
Unimos las tres Cadenas
Lo Colocamos en la lista
CI = CI + 1
cr = cr + 1
Next
End Sub
296
WeekDay
Devuelve el da de la semana (En nmero, 1=Domingo, 2=Lunes,...)
Month
Obtiene el mes a partir de una fecha.
Year
Obtiene el ao a partir de una fecha.
MyYear = Year(MyDate) ' MyYear contains 1969.
297
Hour
Obtiene la hora a partir de una hora
Minute
Obtiene el minuto a partir de una hora.
Second
Obtiene el segundo a partir de una hora.
DateAdd
Aade un intervalo de tiempo a una fecha
Interval
Requerido. Valor de enumeracin DateInterval o expresin String que representa el
intervalo de tiempo que se desea agregar.
Number
Requerido. Double. Expresin de punto flotante que representa el nmero de
intervalos que se desea agregar. Number puede ser un valor positivo (para obtener
fechas u horas futuras) o negativo (para obtener fechas u horas pasadas). Puede
contener una parte decimal cuando Interval especifica horas, minutos o segundos.
Para otros valores de Interval, se omite cualquier parte decimal de Number.
DateValue
Requerido. Date. Expresin que representa la fecha y la hora a la que debe agregarse
el intervalo. El propio DateValue no se modifica en el programa que realiza la llamada.
Valores
Cadena
DateInterval.Day
DateInterval.DayOfYear
DateInterval.Hour
298
DateInterval.Minute
DateInterval.Month
DateInterval.Quarter
DateInterval.Second
DateInterval.Weekday
DateInterval.WeekOfYear
ww
DateInterval.Year
yyyy
299
DateDiff
Obtiene el intervalo de tiempo entre dos fechas
DateDiff(intervalo, fecha1, fecha2[, primerdasemana[, primerasemanaao]])
Intervalo
Descripcin
yyyy
Ao
Trimestre
Mes
Da del ao
Da
Da de la semana
Ww
Semana
Hora
Minuto
Segundo
Este ejemplo utiliza la funcin DateDiff para mostrar el nmero de das entre una
fecha dada y hoy.
Dim DatTim1 As Date = #1/4/2004#
devuelve 5
Msgbox(meses)
devuelve 0
300
DatePart
Devuelve una parte de una fecha (semana, trimestre, etc.)
Cadena
DateInterval.Day
DateInterval.DayOfYear
DateInterval.Hour
Hora
DateInterval.Minute
Minuto
DateInterval.Month
Mes
DateInterval.Quarter
Trimestre
DateInterval.Second
Segundo
DateInterval.Weekday
Da de la semana (del 1 al 7)
DateInterval.WeekOfYear
DateInterval.Year
yyyy Ao
Este ejemplo obtiene una fecha y, utilizando la funcin DatePart, muestra el trimestre
del ao que ocurre.
Dim FirstDate, Msg As String 'Declare variables.
Dim SecondDate As Date
FirstDate = InputBox("Enter a date:")
SecondDate = CDate(FirstDate)
Msg = "Quarter: " & DatePart(DateInterval.Quarter, SecondDate)
MsgBox (Msg)
301
Datetime.
Representa un instante de tiempo, normalmente expresado en forma de fecha y hora
del da. (es propio del framework)
Funcin FORMAT
Esta funcin permite presentar cadenas de numricas o fechas de una determinada forma.
Permite establecer el Formato de esa cadena.
Valor
1
2
3
4
5
6
7
Descripcion
Domingo (valor por defecto)
Lunes
Martes
Miercoles
Jueves
Viernes
Sabado
302
303
FE = FE.AddMonths(MES)
If DN > DA Then
DIAS = DateDiff("D", FA, FE)
Else
DIAS = DateDiff("D", FE, FA)
End If
LBFE.Text = AA
LBDIA.Text = DIAS
LBMES.Text = MES
End Sub
End Class
304
fecha = 20/02/2001
Consideracin: el Campo apellido y nombre solo debe aceptar letras y espacios en Blanco,
La fecha debe ser correcta.
305
2.- Aplicando Fechas.- Ingrese como datos Monto de la cuota, fecha de vencimiento y
fecha de pago , calcular los das de mora , pago por mora y el pago total
Los pago por Mora es de acuerdo a:
Entre 2 y 3 semanas
Mayor a 3 semanas
2% por dia
3.- Ingrese por teclado cierta cantidad de Bolas de billar , con el cual se desea formar una
pirmide de base cuadrada, cada superficie esta formado por un numero cuadrado perfecto,
calcular el numero de superficies que se forman y el numero de bolas que
sobran
Ejemplo para 20 Bolas sern 3 superficies y sobran 6 bolas.
306
Publico S/2.00
Docente
S/1.0
4.- Realice una aplicacin en donde se ingrese a cuadros de texto el Da(entre 1 y 31),
Mes(entre 1 y 12) y Ao de Nacimiento(4 dgitos) de una persona, luego al pulsar un
clic sobre el botn Calcular mostrar su Edad y el signo Zodiacal (control Image) al
que pertenece.
NOTA: Validar que en los cuadros de texto slo se debe ingresar dgitos.
307
Contenido.
Recursividad.
1. Encapsulacin
Cuando creamos un componente .NET este se encuentra encapsulado, ya que oculta la
lgica de programacin a los usuarios que lo utilizan, permitiendo manejar dicho objeto a
travs de sus miembros, tales como propiedades y mtodos, realizando el desarrollo de
aplicaciones ms simple, al ocultar la complejidad del cdigo (encapsular).
2. Herencia
La herencia es la caracterstica en la cual una clase llamada Clase Base pasa o hereda
todas sus caractersticas a otra llamada Clase Derivada, permitiendo la total reusabilidad
del cdigo escrito en las aplicaciones. La herencia de clases es una nueva caracterstica de
Visual Basic .NET y no solo es a nivel de clases creadas en ste lenguaje sino a travs de
cualquier lenguaje del Marco .NET.
308
3. Polimorfismo
Otra caracterstica interesante de la POO es el polimorfismo, en el caso de Visual Basic
.NET ste se puede crear cuando en una clase derivada se implementa de manera distinta
un mtodo heredado de la clase base. Es decir, podemos tener un mismo mtodo con dos
comportamientos distintos (cdigos distintos) de acuerdo al tipo de objeto, que puede ser
creado de la clase base o de la derivada.
Para finalizar esta introduccin a los componentes .NET, la otra gran ventaja con respecto a
COM es la distribucin de componentes, que en este ltimo era una pesadilla debido haba que
registrar componentes y lidiar con los problemas de compatibilidad de versiones; en cambio
con .NET los componentes no se registran y su distribucin es automtica con solo copiar y
pegar la aplicacin.
Clase Derivada
Constantes
Constantes
Enumeraciones
Enumeraciones
Campos
Campos
Propiedades
Propiedades
Mtodos
Mtodos
Eventos
Eventos
Delegados
Delegados
Tcnica de Programacin
Orientada a Objetos
Constructores
Destructores
Constructores
Destructores
309
A diferencia de Visual Basic 6 en donde las clases podan tener solo propiedades, mtodos,
eventos y constantes enumeradas; en Visual Basic .NET las clases pueden tener campos,
delegados, constructores y destructores. Adems pueda ser que una clase herede de otra que
este dentro del componente o en otro componente .NET.
Clase
Una clase es la plantilla para crear el objeto, es aqu donde se definen las partes del objeto:
datos (propiedades, constantes, enumeraciones, campos) y procedimientos que operan sobre
los datos (mtodos).
La clase define un nuevo tipo de datos que resulta de la abstraccin de algn elemento en la
aplicacin, por tanto, es necesario disear bien la aplicacin antes de crear la clase, ya que
esta solo implementa el diseo de objetos previamente realizado.
Sintaxis:
310
Existen varias formas de declarar una clase, que detallamos a continuacin en la siguiente
tabla:
Declaracin
Alcance o mbito
Public
Private
Protected
Solo puede ser usada por las clases derivadas de ste, pero no por las
aplicaciones clientes.
Friend
Solo puede ser usada por las otras clases del componente, pero no por
las aplicaciones clientes.
Protected Friend
Shadows
MustInherit
NotInheritable
311
Ejemplo:
Si queremos crear una aplicacin de Planilla necesitamos disear un componente que
manipule informacin del empleado, sus horas trabajadas, tardanzas, faltas, etc.
Para crear la clase Empleado, de tal manera que pueda heredarse y utilizarse tanto dentro del
componente como en las aplicaciones clientes, definiramos la clase en Visual Basic, tal como
sigue:
End Class
Una constante es un dato que permanece fijo en toda la ejecucin de la aplicacin, a diferencia
de la variable, cuyo valor va cambindose en tiempo de ejecucin.
Se utiliza para facilitar el mantenimiento del cdigo, ya que si definimos un valor en una
constante, si este cambia, con solo cambiar el valor de la constante, la aplicacin trabajara con
el nuevo valor.
Sintaxis:
[Public | Private] Const <Nombre> [As <Tipo Dato>]=<Valor>
Ejemplo:
Podemos crear un par de constantes que almacenen el valor de las tasas de los impuestos a la
renta e impuesto extraordinario de solidaridad, para propsitos del clculo de descuentos.
312
Nota:
En Visual Basic .NET si no se define el tipo de dato de la constante se asume que es Object,
ya no Variant como en Visual Basic 6, debido a que ste tipo de dato ya no existe.
Campos
Un campo es una variable local para la clase, es decir, solo puede ser usada internamente por
los miembros de la clase pero no por otras clases o por aplicaciones clientes.
El campo solo puede ser una variable privada o protegida que se use dentro de la clase para
almacenar un valor usado por alguna propiedad o mtodo, sin que ste pueda ser visto o
instanciado por otras aplicaciones.
Sintaxis:
[Private | Friend] <Nombre Campo> [As <Tipo Dato>]
Ejemplo:
Podemos crear un par de campos que almacenen el clculo de los impuestos a la renta e
impuesto extraordinario de solidaridad, para el total de descuentos.
Enumeraciones
Una enumeracin es una estructura de datos personalizada que define un conjunto de valores
enteros. Por defecto, el primer dato enumerado empieza en 0, el segundo en 1 y as
sucesivamente, aunque esto puede cambiarse al momento de definir la enumeracin.
Las enumeraciones son tiles para dar claridad al programa y evitar errores de asignacin de
variables, ya que si definimos una variable de tipo enumerada, el valor que se puede asignar
est limitado por el rango de valores definido en la enumeracin.
313
Sintaxis:
[Public | Private | Protected | Friend] Enum <Nombre Enumeracin>
<Elemento1>[=<Valor1>]
<Elemento2>[=<Valor2>]
<Elemento3>[=<Valor3>]
<...>
End Enum
Ejemplo:
Vamos a crear dos enumeraciones, la primera que describa los cargos de los empleados que
se usar desde otras clases y aplicaciones, y la segunda que defina las reas de la empresa
para propsitos internos de trabajar con informacin del empleado.
End Enum
End Enum
314
Para usar estas enumeraciones creadas, tan solo basta declarar una variable de estos tipos y
asignarle un valor definido, por ejemplo, para el caso anterior sera como sigue:
Propiedades
Una propiedad es una caracterstica del objeto que tiene informacin sobre un cierto atributo de
ste como por ejemplo su nombre, descripcin, etc. Las propiedades son mtodos que se
trabajan como si fuesen campos, con la diferencia que el campo es interno solo para uso de la
clase, en cambio las propiedades se usan fuera de la clase.
A diferencia de la versin anterior de Visual Basic que existan 3 estructuras para declarar una
propiedad (Property Get, Let, y Set), ahora, en Visual Basic .NET solo existe una estructura
llamada Property donde internamente se define si la propiedad es de lectura (Get) y/o escritura
(Set), tal como se muestra debajo.
Sintaxis:
[Tipo de Declaracin] Property <Nombre > [As <Tipo Dato>]
[[ReadOnly] Get
<Instrucciones>
End Get]
[[WriteOnly] Set (ByVal Value [As <Tipo Dato>])
<Instrucciones>
End Set]
End Property
315
Existen muchas formas de declarar una propiedad, que explicamos en la sgte tabla:
Declaracin
Uso
Default
Public
Private
Protected
Friend
Puede ser usada desde otras clases del componente pero no fuera.
Protected Friend
ReadOnly
WriteOnly
Overloads
Overrides
Overridable
316
NotOverridable
MustOverride
Shadows
Shared
Ejemplo:
Para nuestra clase Empleado, podemos implementar las propiedades cdigo, nombre y bsico
del empleado, de tal manera que se puedan leer y escribir en cualquier parte.
End Property
317
Get
Nombre = mvarNombre
End Get
Set(ByVal Value As String)
mvarNombre = Value
End Set
End Property
End Property
Mtodos
Un mtodo es un conjunto de instrucciones que modifica el estado de las propiedades; en
trminos de objetos, un mtodo es un servicio o funcin del objeto, mientras que en trminos
de cdigo un mtodo es un procedimiento o funcin que realiza una tarea especfica.
En Visual Basic .NET todos los miembros de una clase (propiedades, eventos, constructores,
destructores, etc.) son en realidad mtodos; claro, estos ltimos son mtodos especiales.
Un procedimiento o funcin en una clase es un mtodo, y sus caractersticas son las mismas
que cuando se encuentran en un mdulo estndar, es decir, si es procedimiento la declaracin
es con Sub, y si es funcin la declaracin es con Function, tal como se muestra en la sintaxis
de abajo.
318
Sintaxis:
[Tipo Declaracin] [Sub | Function] <Nombre >([Param]) [As <Tipo Dato>]
<Instrucciones>
[Exit [Sub | Function]]
End Property
Tambin hay que recordar que si el mtodo es una funcin siempre se deber devolver un
valor, que se puede hacer de dos formas: de manera clsica asignando un valor al nombre de
la funcin o de una nueva forma escribiendo la sentencia return y el valor.
Ejemplo:
En nuestro ejemplo de Empleado, podemos implementar dos mtodos pblicos, uno que
permita asignar valores a las propiedades creadas: cdigo, nombre y sueldo del empleado y
otro mtodo que permita actualizar el sueldo.
End Sub
End Sub
319
Eventos
Un evento es un suceso que le ocurre al objeto y que le indica o notifica sobre un cambio en
sus atributos o propiedades. Un evento es necesario para controlar el estado de las
propiedades e informar a las aplicaciones del nuevo estado, para que estas realicen la accin
correspondiente.
Es fcil entender eventos asociados a objetos visuales como los controles, por ejemplo en el
objeto Button se tiene el evento Click que se desencadena al seleccionar el botn, el evento
MouseMove que ocurre al pasar el mouse por el botn, y as hay muchos eventos asociados
al objeto botn; pero, cuando trabajamos con clases, los eventos son ms abstractos y un poco
ms difciles de entender, ya que poda confundirse con los mtodos.
Para aclarar el concepto de eventos definamos mentalmente una clase llamada Cuenta para
un componente llamado Banco. Esta clase cuenta tiene propiedades como NumeroCta,
FechaApertura, TipoCta, NumeroTarjeta y Saldo. Adems tiene mtodos como
Depsito, Retiro y Transferencia que modifican el estado del saldo. Cuando hacemos un
Retiro de nuestra cuenta donde el monto a retirar supera al Saldo se desencadena un
evento llamado SaldoInsuficiente y tambin cuando durante el da hemos retirado ms del
monto permitido se desencadena el evento LimiteRetiroDiario.
Para crear un evento en la clase primero declare l evento con la sentencia Event y luego
llmelo con RaiseEvent, tal como se muestra en la sintaxis.
Declaracin Sintaxis:
[Tipo Declaracin] Event <Nombre > ([Parmetro(s)])
Declaracin Llamada:
RaiseEvent <Nombre > ([Parmetro(s)])
El tipo de declaracin, es igual que la de los mtodos, es decir, puede ser Public, Private,
Protected, Friend, Protected Friend y Shadows.
320
Ejemplo:
Crear dos eventos que nos informen cuando el sueldo es bajo o alto; para nuestra realidad un
sueldo ser bajo cuando es menor a 500 y alto cuando sea mayor a 3000.
321
Constructores y Destructores
Constructores
Un constructor es un mtodo que se usa para inicializar caractersticas del objeto. Todas las
clases de Visual Basic .NET tienen un constructor por defecto que es el mtodo New, pero se
pueden agregar varios constructores New diferencindose por el nmero de parmetros.
Sintaxis:
Public Sub New ()
<Instrucciones>
End Sub
Public Sub New ([<Param1> As <Tipo Dato>])
<Instrucciones>
End Sub
Public Sub New ([<Param1> As <Tipo Dato>,<Param2> As <Tipo Dato>])
<Instrucciones>
End Sub
Public Sub New ([<P1> As <Dato>,<P2> As <Dato>,,<PN> As <Dato>])
<Instrucciones>
End Sub
Nota:
Es requisito indispensable escribir los mtodos constructores al inicio de la clase, de lo
contrario no funcionaran.
322
Ejemplo:
Continuando con nuestro ejemplo de la clase Empleado podemos crear 4 constructores que
permitan crear de cuatro maneras distintas un objeto de tipo empleado.
323
Destructores
Un destructor es un mtodo que se usa para limpiar caractersticas del objeto antes que sea
destruido y liberado de la memoria. Por ejemplo, si tenemos una clase que accede a datos y
que abre una conexin hacia una base de datos para crear un Dataset, entonces recitamos un
destructor que permita cerrar el Dataset y la conexin antes de destruir el objeto que apunta a
dicha clase.
El FrameWork .NET solo provee de destructores a Visual C#, en cambio, en Visual Basic :NET
no existe un mtodo especial para crear destructores; en vez de ello se crea un mtodo
cualquiera que realice la labor de iniciar variables, liberar recursos, etc.
Sintaxis:
Public Sub <Nombre Destructor>()
<Instrucciones>
End Sub
Ejemplo:
Para la clase Empleado podemos crear un destructor llamado Finalizar que permita liberar
las variables usadas por las propiedades para almacenar sus valores.
End Sub
324
325
Escribimos el nombre fsico de la clase, este a su vez ser por defecto el nombre lgico y
damos clic en Open.
End Class
326
2. Dependiendo del alcance que queramos que tenga el objeto se puede modificar el tipo de
declaracin Public a una de las vistas anteriormente, tales como: Private, Protected,
Friend, Shadows, etc.
End Property
2. Aadiendo un mtodo:
End Sub
3. Aadiendo eventos:
4. Llamando eventos:
327
Sub ChequearSueldo()
If mvarSueldo < 500 Then
RaiseEvent SueldoBajo()
ElseIf mvarSueldo > 3000 Then
RaiseEvent SueldoAlto()
End If
End Sub
End Sub
328
Vamos a asumir que se desea crear una aplicacin cliente en Visual Basic .NET que pruebe la
librera de clases creada, para esto necesitamos realizar lo siguiente:
1. Del men File, elegir Add Project, y luego seleccionar New Project. Elegir una plantilla
de aplicacin para Windows o Web en Visual Basic .NET
2. Elegir el directorio donde se crear la aplicacin, escribir el nombre y OK. Aparecer un
nuevo proyecto en la solucin, el cual se ejecuta por defecto.
3. Para indicar que el proyecto de la aplicacin es el que se ejecuta dar clic derecho sobre el
nombre del proyecto en la ventana del Solution Explorer y elegir Set as StartUp Project.
329
4. Para usar la librera desde la aplicacin creada hacer una referencia a esta, desde el men
Project eligiendo Add Reference...
5. Elegir la ficha Projects de la ventana de aadir referencia y se mostrar la librera creada
en la misma solucin, tal como se muestra en la figura anterior.
6. Dar clic al botn Select y luego OK; inmediatamente, aparecer en la carpeta
References del proyecto en la ventana del Solution Explorer.
7. Declarar una variable objeto que apunte a una clase del componente o librera, para lo cual
existen 3 formas que ilustraremos con la clase empleado:
1. Primera forma:
Dim objEmpleado As ACME.Empleado
objEmpleado = New ACME.Empleado()
2. Segunda forma:
Dim objEmpleado As ACME.Empleado = New ACME.Empleado()
3. Tercera forma:
Dim objEmpleado As New ACME.Empleado
8. Usar las propiedades y mtodos del objeto, tal como se muestra en el ejemplo:
objEmpleado.CrearEmpleado(123, "Luis Dueas", 1000)
9. Si deseamos usar los eventos, entonces tendremos que declarar la variable en la seccin
de decalaraciones generales, de la siguiente forma:
Nota:
La anterior sentencia en realidad no destruye la variable, sino que la desactiva, el encargado
de destruir definitivamente al objeto es el Garbage Collector.
330
Herencia de Clases
La parte principal de la Programacin Orientada a Objetos (POO) es la herencia de clases, es
decir, la caracterstica de definir una clase que sirva de base para otras clases derivadas, las
clases derivadas tendrn los miembros de la clase base: propiedades, mtodos, eventos, etc.
Los miembros heredados por la clase derivada pueden sobre escribirse e implementarse de
otra forma, adems la clase derivada puede tener sus propios miembros y servir de clase base
para otras clases, logrndose la reutilizacin de objetos a travs de la herencia.
Otra forma de herencia es a travs del polimorfismo, que es una caracterstica de la POO que
consiste en definir una clase abstracta con propiedades y mtodos que sern implementados
de diferentes formas por otras clases, es decir, con un mismo nombre de propiedad o mtodo
se obtiene funcionalidad distinta de acuerdo al tipo de objeto.
En .NET solo existe herencia simple y no herencia mltiple, es decir, una clase derivada solo
puede heredar de una clase base. Haciendo una analoga, si a la clase base le llamamos
padre y a la clase derivada le llamamos hijo diramos que la herencia simple consiste en que
un hijo solo puede tener un solo padre, lo que parece algo natural y coherente.
Si deseamos simular herencia mltiple en Visual Basic .NET recurrimos a las interfaces, que
permiten definir propiedades y mtodos en una clase sin cdigo, luego desde una clase se
puede implementar varias interfaces, logrndose una herencia mltiple pero a nivel de
definicin y no de cdigo, ya que la implementacin ser distinta en cada clase.
Con .NET podemos implementar la herencia de cualquier clase pblica de la librera de clases
base, la cual tiene una gran cantidad de clases de diferentes tipos, tales como Windows, Data,
331
XML, ASP .NET, System, etc. Pero, tambin podemos implementar herencia de clases creadas
por nosotros, sin importar el lenguaje en que fueron creadas.
Sintaxis:
Inherits <Clase Base>
Notas:
Dos observaciones importantes que hay que tener en cuenta son:
1. La instruccin Inherits debe escribirse en la primera lnea de la clase derivada.
2. Solo puede existir una instruccin Inherits, ya que solo existe herencia simple.
Ejemplo:
Podemos crear una clase llamada Vendedor que herede de la clase Empleado que
habamos creado anteriormente, y crear dos propiedades, una llamada Venta y otra llamada
Comision, tal como sigue:
332
End Set
End Property
End Property
End Class
333
1. MustInherit
Permite crear una clase que solo sirva como clase base, es decir, que sirva solo para
implementar herencia en otras clases, pero no podr crearse objetos de esta clase.
Sintaxis:
MustInherit Class <Nombre Clase Base>
<Cdigo de la clase>
End Class
2. NotInheritable
Se usa para crear una clase que solo pueda crear objetos o aplicaciones clientes, pero que
no pueda servir para heredarse en otra clase.
Sintaxis:
NotInheritable Class <Nombre Clase>
<Cdigo de la clase>
End Class
334
1. Overridable
Permite crear una propiedad o mtodo que puede ser sobre escrito en una clase derivada.
Esta declaracin se hace en la propiedad o mtodo de la clase base.
2. Overrides
Se usa para sobre escribir una propiedad o mtodo que fue definido como Overridable en
la clase base. Esta declaracin se hace en la propiedad o mtodo de la clase derivada.
3. NotOverridable
Impide que una propiedad o mtodo pueda ser sobre escrito en una clase derivada. La
definicin se realiza en la propiedad o mtodo de la clase base.
Por defecto, todas las propiedades o mtodos pblicos definidos en una clase base no
pueden ser sobre escritos en la clase derivada.
4. MustOverride
Permite crear una propiedad o mtodo que ser obligatorio sobre escribirlo en la clase
derivada. Esta declaracin se realiza en la propiedad o mtodo de la clase base que ha
sido definida como MustInherit.
1. MyBase
Se usa para llamar a miembros de la clase base desde la clase derivada. Es decir en vez
de usar el nombre de la clase seguido de la propiedad o mtodo se usa la palabra clave
MyBase seguida de la propiedad o mtodo.
Este tipo de llamada es til cuando se trabaja con mtodos sobre escritos en una clase
derivada y se necesita invocar al mtodo de la clase base que ser sobre escrito, tal como
se muestra en el siguiente ejemplo.
335
Ejemplo:
Suponiendo que el mtodo CrearEmpleado de la clase Empleado haya sido creado
como Overridable, y se desea sobre escribir en la clase Vendedor para calcular
correctamente el sueldo del vendedor incluyendo las comisiones, entonces, tendriamos lo
siguiente:
End Class
2. MyClass
Se usa para llamar a mtodos sobre escribibles desde la clase derivada, y diferenciarlos de
los mtodos heredados desde la clase base.
336
Polimorfismo
El polimorfismo consiste en la funcionalidad mltiple que puede tener un miembro de una clase
para comportarse de diversas maneras de acuerdo al tipo de objeto que lo implemente.
Ejemplo:
Tomemos como caso el ejemplo anterior donde habamos sobre escrito el mtodo
CrearEmpleado de la clase Empleado modificandose en la clase derivada Vendedor
para incluir lo recibido por comisiones de ventas. Crearemos el mtodo llamado
MostrarSueldo que permita crear el empleado y mostrar cuanto gana, usando el
polimorfismo dependeiendo si es vendedor o no.
End Sub
Sub ProbarPolimorfismo()
Dim objEmpleado As New Empleado
Dim objVendedor As New Vendedor
objEmpleado.CrearEmpleado(100, "Luis Dueas", 1000)
objVendedor.Venta=1000
objVendedor.Comision=0.10
objVendedor.CrearEmpleado(100, "Luis Dueas", 1000)
End Sub
Tcnica de Programacin Orientada a Objetos
337
En este ejemplo el resultado ser para el primer caso el mensaje Luis Dueas gana 1000
y en el segundo caso el mensaje Luis Dueas gana 1100.
Las interfaces son un elemento bastante importante en .NET Framework, ya que de hecho
se utiliza con bastante frecuencia, en esta leccin veremos que son las interfaces y como
utilizarlas en nuestros proyectos, tambin veremos que papel juegan en .NET y cmo
aplicar algunas de las definidas en la biblioteca base.
338
Qu es una interfaz?
Las interfaces son una forma especial de una clase, aunque la diferencia principal con las
clases es que las interfaces no contienen cdigo ejecutable, solo definen los miembros.
Las interfaces se utilizan para indicar el "comportamiento" que tendr una clase, o al
menos qu miembros debe definir esa clase.
Para definir una interfaz en Visual Basic 2005 tenemos que usar la instruccin Interface
seguida del nombre de la interfaz y terminar la declaracin con End Interface:
Nota:
Segn las indicaciones de nomenclatura de .NET Framework, se recomienda que todas las
interfaces empiecen con una I mayscula seguida del nombre al que hacer referencia la
interfaz.
En el siguiente cdigo definimos una interfaz que contiene los cuatros tipos de miembros
tpicos de cualquier clase:
339
El primer miembro de esta interfaz, es un mtodo de tipo Sub que no recibe parmetros.
El siguiente mtodo es una funcin que devuelve un valor de tipo String y recibe un
parmetro tambin de tipo cadena.
Como podemos observar, lo nico que tenemos que hacer es indicar el tipo de miembro y
si recibe o no algn parmetro o argumento.
Si en una clase indicamos que queremos "implementar" una interfaz, esa clase debe definir
cada uno de los miembros que la interfaz expone. De esta forma nos aseguramos de que si
una clase implementa una interfaz, tambin implementa todos los miembros definidos en
dicha interfaz.
Cuando una clase implementa una interfaz est firmando un contrato con el que se
compromete a definir todos los miembros que la clase define, de hecho el propio
compilador nos obliga a hacerlo.
340
tanto podemos acceder a esa clase, que en principio pude sernos desconocida, desde un
objeto del mismo tipo que la interfaz.
Y como comentbamos, cualquier clase que implemente una interfaz debe definir cada uno
de los miembros de esa interfaz, por eso es el propio Visual Basic el encargado de crear
automticamente los mtodos y propiedades que la interfaz implementa, aunque solo
inserta el "prototipo" de cada uno de esos miembros, dejando para nosotros el trabajo de
escribir el cdigo.
Usando la definicin de la interfaz IPrueba que vimos antes, el cdigo que aadir VB ser
el siguiente:
End Sub
End Get
341
End Set
End Property
End Function
End Class
La utilidad de que en cada uno de los miembros se indique expresamente el mtodo al que
se hace referencia, es que podemos usar nombres diferentes al indicado en la interfaz. Por
ejemplo, si implementamos esta interfaz en una clase que solo utilizar la impresora, al
mtodo Mostrar lo podramos llamar Imprimir que sera ms adecuado, en ese caso
simplemente cambiamos el nombre del mtodo de la clase para que implemente el mtodo
Mostrar de la interfaz:
End Sub
De esta forma, aunque en la clase se llame de forma diferente, realmente hace referencia
al mtodo de la interfaz.
Una vez que tenemos implementada una interfaz en nuestra clase, podemos acceder a
esos miembros de forma directa, es decir, usando un objeto creado a partir de la clase:
342
prueba1.Mostrar()
O bien de forma indirecta, por medio de una variable del mismo tipo que la interfaz:
Qu ha ocurre aqu?
Como ya comentamos anteriormente, cuando asignamos variables por referencia,
realmente lo que asignamos son referencias a los objetos creados en la memoria, por tanto
la variable interfaz1 est haciendo referencia al mismo objeto que prueba1, aunque esa
variable solo tendr acceso a los miembros de la clase Prueba que conoce, es decir, los
miembros definidos en IPrueba.
Si la clase define otros miembros que no estn en la interfaz, la variable interfaz1 no podr
acceder a ellos.
Para realizar esta comprobacin podemos usar en una expresin If/Then la instruccin
TypeOf... Is, de forma que si la variable indicada despus de TypeOf contiene el tipo
especificado despus de Is, la condicin se cumple:
interfaz1.Mostrar()
End If
343
Como acabamos de comprobar, una misma clase puede implementar ms de una interfaz,
y esto nos puede causar una duda:
344
End Sub
Aunque si ambos mtodos hacen lo mismo, en este ejemplo mostrar algo, podramos hacer
que el mismo mtodo de la clase sirva para implementar el de las dos interfaces:
Public Sub Mostrar() Implements IPrueba.Mostrar, IMostrar.Mostrar
End Sub
Es decir, lo nico que tendramos que hacer es indicar la otra implementacin separndola
con una coma.
345
Nota:
Cuando una interfaz implementa otras interfaces, stas no se pueden indicar mediante
Implements, en lugar de usar esa instruccin debemos usar Inherits.
Public Interface IPrueba2
Inherits IMostrar
Si en una clase implementamos una interfaz que a su vez implementa otras interfaces, esa
clase tendr definiciones de todos los miembros de todas las interfaces, por ejemplo, si
tenemos la siguiente definicin de la interfaz IPrueba2 que "implementa" la interfaz
IMostrar:
End Sub
346
End Get
Set(ByVal value As String)
End Set
End Property
End Function
End Class
En este cdigo, el mtodo Mostrar se indica mediante la interfaz IMostrar, pero tambin se
puede hacer por medio de IPrueba2.Mostrar, ya que IPrueba2 tambin lo implementa (o
hereda).
Si dejamos que Visual Basic cree los miembros, no tendremos problemas a la hora de
definirlos. Pero si lo hacemos manualmente, aunque dentro del IDE de Visual Basic, ste
nos ayuda indicndonos que interfaces implementamos y qu miembros son los que se
adecuan a la declaracin que estamos usando, tal como podemos comprobar en la figura
2.16:
347
End Sub
348
End If
End Function
End Class
Si el objeto que recibe el mtodo no es del tipo Empleado, devolvemos un cero, para
indicar que no haga ninguna clasificacin, ya que ese valor indica que los dos objetos son
iguales.
349
Contenido.
Manejo de Colecciones
o Concepto de Colecciones. Tipos.
o Agregar y remover tems de una coleccin.
o Recorrer los tems de una coleccin.
Colecciones Especializadas: ArrayList, HashTable
Interfaces
o IEnumerable e IEnumerator
o ICloneable
o IComparable
Las Colecciones
En el tema sobre arrays hemos comprobado cmo a travs de la clase Array, podemos
manipular estos elementos del lenguaje con una mayor potencia y flexibilidad que en pasadas
versiones del lenguaje. No obstante, en muchas ocasiones nos encontraremos con situaciones
en las que sera muy de agradecer que los arrays dispusieran de algunas caractersticas
adicionales, dependiendo del problema que tengamos que resolver en ese preciso momento.
Por ejemplo, sera una gran idea poder manejar un array que creciera dinmicamente, sin tener
que preocuparnos por aumentar o disminuir su tamao; o tambin, disponer de un array a
cuyos valores pudiramos acceder, a travs de identificadores claves, y no por el nmero de
ndice, que en algunas situaciones es ms incmodo de manejar.
Aun as no hay que preocuparse, ya que no va a necesitar escribir complicados algoritmos para
implementar estas caractersticas en sus arrays. Todas las funcionalidades mencionadas, y
algunas ms, se encuentran disponibles en un tipo especial de array denominado coleccin
(collection).
Una coleccin es un objeto que internamente gestiona un array, pero que est preparado,
dependiendo del tipo de coleccin, para manejar el array que contiene de una manera especial;
podramos definirlo como un array optimizado o especializado en ciertas tareas.
350
Para hacer uso de colecciones en una aplicacin VB.NET creada desde VS.NET, no es
necesario importar este espacio de nombres, ya que como habr observado el lector en
ejemplos anteriores, el propio IDE incluye por defecto la importacin del espacio System al
proyecto.
Todo ello significa, que adems de las clases con las funcionalidades especiales de
Collections, podemos crear nuestras propias clases, para aquellos casos en los que
necesitemos disponer de un array con funcionalidades especiales, no contempladas por los
arrays base, y que adems tampoco exista como coleccin. La manera de crear nuestro propio
tipo de coleccin sera heredando de una clase collection existente y/o la implementacin de
alguno de los interfaces de Collections.
Seguidamente realizaremos una descripcin general y pruebas con algunas de las colecciones
existentes en el entorno, remitiendo al lector a la documentacin de la plataforma accesible
desde Visual Studio .NET para los detalles ms especficos.
351
La clase ArrayList
Los objetos de tipo coleccin creados con esta clase, implementan un array cuyo nmero de
elementos puede modificarse dinmicamente.
Podemos instanciar una coleccin ArrayList en alguno los modos mostrados en el Cdigo
fuente. Observe cmo en el ltimo ejemplo de este fuente, el constructor de ArrayList recibe
como parmetro una coleccin dinmica.
Sub Main()
' crear una lista sin elementos
Dim alEstaciones As New ArrayList()
' crear una lista indicando el nmero de elementos
' pero sin darles valor
Dim alDatos As New ArrayList(3)
' crear una lista utilizando una coleccin dinmica
Dim alLetras As New ArrayList(New String() {"a", "b", "c"})
End Sub
Una coleccin dinmica se crea de forma muy similar a un array, con la diferencia de que no es
necesario usar una variable a la que asignar la coleccin, ya que en su lugar, se pasa como
parmetro al constructor de ArrayList. El modo de creacin de una coleccin dinmica consiste
en utilizar la palabra clave New, seguida del tipo de dato de la coleccin, los parntesis
indicativos de array, y por ltimo, encerrados entre llaves, los valores de la coleccin.
352
Sub Main()
Dim alDatos As New ArrayList(10)
alDatos.Add("a")
alDatos.AddRange(New String() {"b", "c", "d"})
Console.WriteLine("ArrayList despus de usar Add() y AddRange()")
RecorrerAList(alDatos)
alDatos.Insert(2, "hola")
Console.WriteLine("ArrayList despus de usar Insert()")
RecorrerAList(alDatos)
alDatos.InsertRange(1, New Integer() {55, 77, 88})
Console.WriteLine("ArrayList despus de usar InsertRange()")
RecorrerAList(alDatos)
alDatos.SetRange(3, New String() {"zzz", "yyy"})
Console.WriteLine("ArrayList despus de usar SetRange()")
RecorrerAList(alDatos)
Console.ReadLine()
End Sub
353
Los valores que espera recibir una coleccin son del tipo genrico Object, por lo que podemos
insertar valores de diferentes tipos de dato.
Para recorrer un array podemos emplear la tcnica habitual del bucle For...Next y la propiedad
Count del objeto ArrayList, que devuelve el nmero de elementos que tiene el objeto; o bien
podemos usar un objeto del interfaz IEnumerator, proporcionado por el mtodo
GetEnumerator(), mucho ms simple de recorrer.
Sub Main()
' crear ArrayList y aadir valores
354
Cuando creamos un objeto ArrayList con un tamao como el del ltimo ejemplo, la accin de
aadir un valor a la coleccin no redimensiona su array subyacente, puesto que ya est creado
con un tamao determinado, sino que asigna un valor al siguiente elemento libre que no
hubiera sido previamente asignado.
355
Este comportamiento del objeto tiene la ventaja de que mejora el rendimiento y optimiza
recursos, puesto que cada vez que aadimos o eliminamos valores, el array _items no siempre
tiene que ser redimensionado.
Qu sucede, sin embargo, cuando se han aadido valores y el array est completo?, pues
que el objeto ArrayList detecta esta situacin y en la siguiente ocasin en que se aade un
nuevo valor, automticamente redimensiona el array _items, duplicando el nmero de
elementos inicial que contena.
En el caso que muestra la anterior figura, despus de aadir la letra m al objeto, la propiedad
Capacity devolvera 12 y la propiedad Count devolvera 9.
356
Un detalle muy importante que debe tener en cuenta el lector, es que al crear un objeto
ArrayList, si no especificamos el tamao, la propiedad _items tiene una capacidad por defecto
de 16 elementos.
Sub Main()
Dim alLetras As New ArrayList(10)
alLetras.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
Console.WriteLine("Array alLetras")
RecorrerAList(alLetras)
' obtener un subarray con un rango determinado
Dim alRangoLetras As ArrayList
alRangoLetras = alLetras.GetRange(4, 2)
Console.WriteLine("Array alRangoLetras")
RecorrerAList(alRangoLetras)
' obtener un subarray de tamao fijo,
' se pueden modificar sus elementos,
' no se pueden aadir valores
Dim alLetrasFijo As ArrayList = ArrayList.FixedSize(alLetras)
Tcnica de Programacin Orientada a Objetos
357
358
Respecto a los ArrayList de tamao fijo, tipo FixedSize, queremos advertir al lector que a la
hora de ver su contenido en el depurador, no debe consultar la propiedad _items mencionada
anteriormente, ya que esta contendr un array de valores vacos.
Este punto puede crear confusin, ya que el lector al ejecutar la aplicacin s obtendr los
valores de la coleccin FixedSize, por lo que se preguntar dnde han ido a parar esos valores.
El secreto reside en el siguiente lugar: al ejecutar con el depurador, debemos expandir la
propiedad [System.Collections.ArrayList.FixedSizeArrayList] del ArrayList con tamao fijo.
Dentro de esta propiedad, que es realmente una variante del objeto ArrayList, abriremos la
propiedad _list, y de nuevo dentro de esta propiedad encontraremos otra con el nombre _items,
la cual ser la que contiene realmente los valores del array de tamao fijo.
359
Sub Main()
Dim alLetras As New ArrayList(10)
alLetras.AddRange(New String() {"jj", "oo", "aa", _
"jj", "ee", "tt", "mm", "xx"})
Dim iPosicIndexOf As Integer
' buscar un elemento de la coleccin desde el principio
iPosicIndexOf = alLetras.IndexOf("aa")
Console.WriteLine("Posicin al buscar con IndexOf: {0}", iPosicIndexOf)
Dim iPosicLastIndexOf As Integer
' buscar un elemento de la coleccin desde el final
iPosicLastIndexOf = alLetras.LastIndexOf("jj")
Console.WriteLine("Posicin al buscar con LastIndexOf: {0}", _
iPosicLastIndexOf)
Dim bEncontrado As Boolean
' comprobar si existe un valor en la coleccin
bEncontrado = alLetras.Contains("oo")
Console.WriteLine("Resultado de la bsqueda con Contains: {0}", bEncontrado)
Console.ReadLine()
End Sub
360
Sub Main()
' borra todos los elementos
Dim alLetras1 As New ArrayList(10)
alLetras1.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras1.Clear()
Estado("alLetras1", alLetras1)
' borra un elemento por el valor
Dim alLetras2 As New ArrayList(10)
alLetras2.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras2.Remove("c")
Estado("alLetras2", alLetras2)
' borra un elemento por posicin
Dim alLetras3 As New ArrayList(10)
alLetras3.AddRange(New String() {"a", "b", "c", "d", "e", "f", "g"})
alLetras3.RemoveAt(5)
Estado("alLetras3", alLetras3)
Tcnica de Programacin Orientada a Objetos
361
Sub Main()
Dim alLetras As New ArrayList(10)
alLetras.AddRange(New String() {"z", "t", "c", "a", "k", "f", "m"})
' ordenar
alLetras.Sort()
Tcnica de Programacin Orientada a Objetos
362
363
La clase Hashtable
Esta clase tiene la particularidad de que el acceso a los valores del array que gestiona
internamente se realiza a travs de una clave asociada a cada elemento, al estilo de los
objetos Dictionary de versiones anteriores de VB. Como dato significativo, esta clase
implementa el interfaz IDictionary, por lo que si hemos utilizado anteriormente objetos
Dictionary, ya conocemos gran parte de su filosofa de trabajo.
En un planteamiento como el anterior, debemos acordarnos, a la hora de obtener los datos del
array, que la primera posicin corresponde al cdigo de cliente, la siguiente al nombre, etc.,.
Bien es cierto que podemos utilizar constantes numricas para cada posicin, pero sigue
siendo una solucin poco flexible.
Utilizando un objeto Hashtable sin embargo, tenemos la ventaja de que no necesitamos saber
la posicin en que se encuentra cada valor, ya que precisamente a cada posicin le damos un
nombre clave que es mediante el que accedemos posteriormente cuando queremos obtener
los valores.
364
Sub Main()
' declarar coleccin Hashtable
Dim htCliente As Hashtable
htCliente = New Hashtable()
' aadir valores
htCliente.Add("ID", 22)
htCliente.Add("Nombre", "Pedro")
htCliente.Add("Apellidos", "Naranjo")
htCliente.Add("Domicilio", "C/Rio Bravo, 25")
htCliente.Add("Edad", 35)
htCliente.Add("Credito", 250)
' mostrar el nmero de elementos que contiene
Console.WriteLine("El objeto Hashtable tiene {0} elementos", _
htCliente.Count)
Console.WriteLine()
' obtener algunos valores
Console.WriteLine("Obtener algunos valores del objeto Hashtable")
Console.WriteLine("Domicilio: {0} ", htCliente.Item("Domicilio"))
Console.WriteLine("Nombre: {0} ", htCliente("Nombre"))
Console.WriteLine("Credito: {0} ", htCliente("Credito"))
Console.WriteLine()
' recorrer el array al completo
Console.WriteLine("Recorrer objeto Hashtable con un enumerador")
Dim oEnumerador As IDictionaryEnumerator
oEnumerador = htCliente.GetEnumerator()
365
While oEnumerador.MoveNext()
Console.WriteLine("Clave: {0} / Valor: {1}", _
oEnumerador.Key, oEnumerador.Value)
End While
Console.ReadLine()
End Sub
Para crear un nuevo objeto Hashtable hemos utilizado el constructor sin parmetros, que es el
ms bsico disponible. Puesto que se trata de un constructor sobrecargado, sugerimos al lector
que consulte la documentacin de .NET Framework para ver una lista completa de todos los
constructores disponibles.
Respecto a la asignacin de valores a la coleccin, esta clase utiliza el mtodo Add( ), cuyo
primer parmetro corresponde a la clave del elemento y el segundo corresponde al valor que
vamos a asignar a la posicin de su array.
Para obtener un valor del array utilizamos el mtodo Item( ), pasando como parmetro el
nombre de la clave de la que vamos a obtener el valor correspondiente. Al tratarse del mtodo
por defecto de esta clase no es necesario especificarlo. Como hemos podido comprobar, el
resultado es el mismo tanto si especificamos como si no el nombre del mtodo.
366
Por otra parte, el mtodo Remove( ), elimina un elemento del objeto, pasndole como
parmetro la clave a borrar, mientras que el mtodo Clear( ), elimina el contenido completo de
la coleccin.
Sub Main()
' crear coleccin Hashtable y aadir valores
Dim htCliente As New Hashtable()
htCliente.Add("ID", 22)
htCliente.Add("Nombre", "Pedro")
htCliente.Add("Apellidos", "Naranjo")
htCliente.Add("Domicilio", "C/Rio Bravo, 25")
htCliente.Add("Edad", 35)
htCliente.Add("Credito", 250)
' comprobar la existencia de elementos por la clave
Dim sClave As String
Console.WriteLine("Introducir la clave a buscar")
sClave = Console.ReadLine()
If htCliente.ContainsKey(sClave) Then
Console.WriteLine("La clave {0} existe, su valor es: {1}", _
sClave, htCliente(sClave))
Else
Console.WriteLine("La clave {0} no existe", sClave)
End If
Console.WriteLine()
Tcnica de Programacin Orientada a Objetos
367
368
Las propiedades Keys y Values de la clase Hashtable, devuelven un array con los nombres de
las claves y los valores de un objeto Hashtable respectivamente. Realmente devuelven un
objeto del interfaz ICollection, pero ya que un array implementa este interfaz, dicho objeto
podemos manipularlo como un array.
Observar que el modo de declarar y obtener los objetos ICollection e IEnumerator, que en
definitiva, nos llevan al mismo resultado, demostrando as, la gran flexibilidad sintctica que la
especificacin CLS proporciona al lenguaje.
Sub Main()
' crear y llenar la coleccin
Dim htCliente As New Hashtable()
htCliente.Add("ID", 22)
htCliente.Add("Nombre", "Pedro")
htCliente.Add("Apellidos", "Naranjo")
htCliente.Add("Domicilio", "C/Rio Bravo, 25")
htCliente.Add("Edad", 35)
htCliente.Add("Credito", 250)
' obtener un array con las claves,
' y recorrer con un enumerador
Dim aClaves As ICollection
aClaves = htCliente.Keys
Tcnica de Programacin Orientada a Objetos
369
370
El cdigo siguiente muestra un ejemplo, en el cual, despus de crear un objeto Hashtable con
sus correspondientes valores, creamos un array normal de tipo Object al que traspasamos los
elementos desde el Hashtable.
Sub Main()
' crear un array Hashtable
Dim htCliente As New Hashtable()
htCliente.Add("ID", 22)
htCliente.Add("Nombre", "Pedro")
htCliente.Add("Apellidos", "Naranjo")
htCliente.Add("Domicilio", "C/Rio Bravo, 25")
htCliente.Add("Edad", 35)
htCliente.Add("Credito", 250)
' crear un array estndar
Dim aDeposito(10) As Object
aDeposito(0) = "aaa"
aDeposito(1) = "bbb"
aDeposito(2) = "ccc"
aDeposito(3) = "ddd"
' volcar elementos del Hashtable al array estndar,
' comenzando a copiar desde una posicin determinada
' del array estndar
htCliente.CopyTo(aDeposito, 2)
' obtener algunos valores del objeto Hashtable
' que se han pasado al array normal
Dim oEntradaDicc As DictionaryEntry
Dim iContador As Integer
For iContador = 3 To 6
oEntradaDicc = aDeposito(iContador)
371
Como el array normal tena valores asignados previamente, algunos de ellos se pierden,
puesto que el mtodo CopyTo( ) no redimensiona el array normal. Tenga este hecho en cuenta
el lector, ya que el array destino deber tener el suficiente tamao cuando traspasamos valores
desde una coleccin de este tipo.
372
Aplicaciones
Este laboratorio pretende ensear como se trabajan con componentes en Visual Basic .NET,
primero se ver un laboratorio de cmo crear una librera de clases y luego veremos como
trabajar con herencia de clases..
Elegir un nuevo proyecto Visual Basic y una plantilla Class Library, seleccionar en
ubicacin la carpeta C:\VBNET\Labs y como nombre escribir Libreria_Clases.
Escribir Producto como nombre fsico y lgico de la clase:
End Class
373
End Set
End Property
374
End Set
End Property
375
Luego, aadimos una aplicacin para Windows que permita realizar el mantenimiento
de productos usando la librera creada.
Del men File elegimos Add Project, y seleccionamos New Project. Elegimos una
Aplicacin para Windows y le damos el nombre de Prueba_Libreria_Clases.
Configuramos para que la aplicacin sea la que inicia, dando clic derecho al nombre en
la ventana del Solution Explorer y eligiendo Set as StartUp Project.
Diseamos un formulario llamado frmProducto que tenga un TabControl con 3
fichas, una de ingreso de productos, otra de actualizacin de precios y stock y otra de
consulta, diseadas tal como muestran las figuras de abajo:
376
377
Despus de realizar el diseo y antes de escribir cdigo, para usar la librera primero
debemos hacer una referencia a sta.
Del men Project elegir Add Reference..., seleccionar la ficha Projects, elegir la
librera creada y clic en Select, luego OK.
Declarar e inicializar una variable objeto de tipo de la clase producto, tal como sigue:
378
379
380
Elegir un nuevo proyecto Visual Basic y una plantilla Class Library, seleccionar en
ubicacin la carpeta C:\VBNET\Labs y como nombre escribir Libreria_Herencia.
Crear la clase Persona, modificando el nombre de la clase Class1 por el de
Persona, tanto fsica como lgicamente; luego escribir cdigo para crear las
propiedades: nombre, fechanac, edad y direccion; y el mtodo crearpersona:
381
382
Crear la clase Alumno que hereda de Persona, para lo cual aadimos una clase al
componente; del men Project elegimos Add Class... y escribimos como nombre
Persona.vb y Open. Luego escribimos el siguiente cdigo:
383
Crear la clase Profesor que tambin hereda de Persona, para lo cual aadimos una
clase al componente; del men Project elegimos Add Class... y escribimos como
nombre Profesor.vb y Open. Luego escribimos el siguiente cdigo:
384
End Property
Finalmente, crear la clase Curso, para lo cual aadimos una clase al componente; del
men Project elegimos Add Class... y escribimos como nombre Curso.vb y Open.
Luego escribimos el siguiente cdigo:
385
Get
Nombre = mvarNombre
End Get
Set(ByVal Value As String)
mvarNombre = Value
End Set
End Property
386
Para probar la librera de clase aadimos un proyecto a la solucin, del men File,
elegimos Add Project y luego New Project..., seleccionando una aplicacin para
Windows a la cual llamaremos Prueba_Libreria_Herencia.
La aplicacin tendr un formulario llamado frmMatricula con 3 fichas, donde se
realizarn el ingreso de datos del alumno, el curso y el profesor para la matrcula, tal
como se muestran en las figuras de abajo.
387
Lo primero que tenemos que hacer para probar la librera en la aplicacin es hacer una
referencia a esta, eligiendo del men Project, Add References..., seleccionar la ficha
Projects y elegir la librera, clic en Select y OK.
Para que la aplicacin Windows que vamos a crear sea la que se ejecute dar clic
derecho al nombre del proyecto en la ventana del Solution Explorer y elegir Set as
StartUp Project.
En las declaraciones generales definimos variables objetos para manipular datos del
alumno, curso y el profesor, as como una rutina que permita limpiar textos.
388
Sub LimpiarTextos()
txtAlumno_Codigo.Clear()
txtAlumno_Nombre.Clear()
txtAlumno_FechaNac.Clear()
txtAlumno_Direccion.Clear()
txtAlumno_Edad.Clear()
txtAlumno_Especialidad.Clear()
txtCurso_Codigo.Clear()
txtCurso_Nombre.Clear()
txtCurso_TotalHoras.Clear()
txtCurso_CostoTotal.Clear()
txtCurso_CostoHora.Clear()
txtProfesor_Codigo.Clear()
txtProfesor_Nombre.Clear()
txtProfesor_FechaNac.Clear()
txtProfesor_Direccion.Clear()
txtProfesor_Edad.Clear()
txtProfesor_Tipo.Clear()
End Sub
Programamos el botn Matricular para que guarde los datos de los objetos creados
anteriormente.
Private Sub btnMatricular_Click() Handles btnMatricular.Click
objAlumno.CrearAlumno(txtAlumno_Nombre.Text, _
Convert.ToDateTime(txtAlumno_FechaNac.Text), _
txtAlumno_Direccion.Text, txtAlumno_Codigo.Text, _
txtAlumno_Especialidad.Text)
objCurso.CrearCurso(txtCurso_Codigo.Text, _
389
txtCurso_Nombre.Text, _
Convert.ToByte(txtCurso_TotalHoras.Text), _
Convert.ToSingle(txtCurso_CostoTotal.Text))
objProfesor.CrearProfesor(txtProfesor_Nombre.Text, _
Convert.ToDateTime(txtProfesor_FechaNac.Text), _
txtProfesor_Direccion.Text, _
txtProfesor_Codigo.Text, txtProfesor_Tipo.Text)
LimpiarTextos()
End Sub
Escribimos cdigo en el botn Consultar para mostrar los datos almacenados en los
objetos.
Private Sub btnConsultar_Click() Handles btnConsultar.Click
With objAlumno
txtAlumno_Codigo.Text = .Codigo
txtAlumno_Nombre.Text = .Nombre
txtAlumno_FechaNac.Text=Format(.FechaNac, "dd/MM/yyyy")
txtAlumno_Direccion.Text = .Direccion
txtAlumno_Edad.Text = .Edad.ToString
txtAlumno_Especialidad.Text = .Especialidad
End With
With objCurso
txtCurso_Codigo.Text = .Codigo
txtCurso_Nombre.Text = .Nombre
txtCurso_TotalHoras.Text = .TotalHoras.ToString
txtCurso_CostoTotal.Text = .CostoTotal.ToString
txtCurso_CostoHora.Text = .CostoHora.ToString
End With
With objProfesor
390
txtProfesor_Codigo.Text = .Codigo
txtProfesor_Nombre.Text = .Nombre
txtProfesor_FechaNac.Text=Format(.FechaNac, "dd/MM/yyyy")
txtProfesor_Direccion.Text = .Direccion
txtProfesor_Edad.Text = .Edad.ToString
txtProfesor_Tipo.Text = .Tipo
End With
End Sub
391
Contenido.
El espacio de nombres System.IO es el que contiene todas las clases relacionadas con los
ficheros y directorios, en ese mismo espacio de nombres estn las clases dedicada a los
streams de .NET, ya que al fin y al cabo, cuando tratamos con los ficheros, estaremos tratando
con una secuencia de caracteres o bytes, secuencia a la que accederemos con las clases
especializadas.
o
o
392
Veamos primero una relacin de esas clases y enumeraciones y despus veremos algunas de
ellas con ms detalle.
Entre las clases que nos permiten trabajar con los ficheros, directorios y las unidades de disco,
podemos destacar las siguientes:
Directory, proporciona mtodos estticos para crear, mover y enumerar los ficheros de
directorios y subdirectorios.
DirectoryInfo, al igual que la clase Directory, pero los mtodos son de instancia, dicha
instancia se crear a partir de un directorio determinado.
File, proporciona mtodos estticos para crear, copiar, eliminar, mover y abrir ficheros,
adems de ayudar a la creacin de objetos FileStream.
FileInfo, igual que la clase File, pero los mtodos son de instancia, dicha instancia se
crear a partir de un fichero determinado.
Path, proporciona mtodos y propiedades para procesar cadenas relacionadas con los
directorios.
FileAccess, define constantes para el tipo de acceso a los ficheros: lectura, escritura o
lectura/escritura.
FileMode, define las constantes que podemos usar para controlar como abrimos un
fichero.
FileShare, define las constantes para controlar el tipo de acceso que otros objetos
FileStream pueden tener al mismo fichero.
393
Entre las clases que nos permiten trabajar con los ficheros, directorios y las unidades de disco,
podemos destacar las siguientes:
Directory, proporciona mtodos estticos para crear, mover y enumerar los ficheros de
directorios y subdirectorios.
DirectoryInfo, al igual que la clase Directory, pero los mtodos son de instancia, dicha
instancia se crear a partir de un directorio determinado.
File, proporciona mtodos estticos para crear, copiar, eliminar, mover y abrir ficheros,
adems de ayudar a la creacin de objetos FileStream.
FileInfo, igual que la clase File, pero los mtodos son de instancia, dicha instancia se
crear a partir de un fichero determinado.
Path, proporciona mtodos y propiedades para procesar cadenas relacionadas con los
directorios.
FileAccess, define constantes para el tipo de acceso a los ficheros: lectura, escritura o
lectura/escritura.
FileMode, define las constantes que podemos usar para controlar como abrimos un
fichero.
FileShare, define las constantes para controlar el tipo de acceso que otros objetos
FileStream pueden tener al mismo fichero.
394
Cuando necesitemos acceder a un directorio, por ejemplo, para saber que subdirectorios y
ficheros contiene o para obtener otro tipo de informacin, incluso para saber si existe o no, en
esos casos podemos utilizar las clases Directory o DirectoryInfo.
La primera de ellas: Directory, proporciona mtodos estticos, es decir, los mtodos que
contienen siempre estarn disponibles sin necesidad de crear una nueva instancia de la clase.
Por tanto, podremos usar esos mtodos simplemente usando la propia clase.
La segunda: DirectoryInfo, proporciona los mismos mtodos que Directory, pero en lugar de
ser mtodos estticos, son mtodos de instancia, es decir, esos mtodos solamente se podrn
usar despus de haber creado una instancia (u objeto en memoria) de esta clase.
Cada una de las instancias de DirectoryInfo, har referencia a un directorio en particular, ese
directorio se indicar al crear el objeto, aunque tambin puede ser que est referenciado al
obtenerlo mediante otros mtodos que devuelven este tipo de objetos.
Nota:
El directorio asignado al crear la instancia de DirectoryInfo no tiene porqu existir.
De esa forma podemos comprobar si existe, y en caso de que no exista, crearlo, etc.
Por ejemplo, si queremos saber si un directorio existe, utilizaremos el mtodo Exists, en el caso
de la clase Directory, como parmetro le indicaremos el directorio del que queremos comprobar
su existencia, sin embargo, si usamos un objeto del tipo DirectoryInfo, no necesitamos indicar
ningn parmetro, ya que el directorio que est asociado con esa clase lo habremos indicado al
crear el objeto.
395
El resto de mtodos de estas dos clases funcionan de forma similar, al menos en el sentido de
que si usamos la clase Directory, siempre habr un parmetro que haga referencia al directorio
que queremos usar, mientras que con DirectoryInfo siempre estar haciendo referencia al
directorio usado al crear la instancia.
Nota:
No queremos parecer repetitivos, pero nos interesa que quede claro como funcionan este tipo
de clases, que por otro lado, ser similar al de las clases File y FileInfo, al menos en el sentido
de que la clase con los mtodos estticos siempre necesitar saber a que elemento del
sistema de archivos estamos refirindonos, mientras que las clases que debemos instanciar,
siempre sabrn con que elemento trabajarn.
Estas clases siempre manejarn directorios y entre los mtodos que podemos utilizar,
destacamos los siguientes, empezamos por la clase Directory:
GetDirectories, devuelve un array de String con todos los subdirectorios del directorio
indicado. Se puede indicar un "pattern" de bsqueda y si queremos incluir los
subdirectorios que tenga el directorio indicado.
396
GetFiles, devuelve un array de tipo String con los ficheros del directorio indicado. Se
puede indicar un filtro de bsqueda.
Como hemos comentado, la clase DirectoryInfo siempre har referencia al directorio utilizado
para instanciarla, por tanto algunos de los mtodos de la clase Directory se convierten en
propiedades de esta clase y otros cambian de nombre para adecuarlos mejor a la accin a
realizar con ellos.
Por ejemplo, en la clase Directory tenemos el mtodo Exists, que en DirectoryInfo es una
propiedad. De igual forma, el mtodo Move de la clase Directory es el mtodo MoveTo de
DirectoryInfo.
En cuanto a los mtodos de Directory para obtener o asignar la fecha de creacin, acceso, etc.,
en DirectoryInfo son propiedades de lectura/escritura.
Tambin debemos indicar que la clase DirectoryInfo tiene ciertas propiedades, como FullName
o Name, que nos dan informacin del nombre de la ruta completa o del nombre del directorio.
Y como nota final sobre Directory y DirectoryInfo, aclarar que el "filtro" (o pattern) que podemos
usar para filtrar los directorios o ficheros obtenidos con GetDirectories o GetFiles solo pueden
tener un filtro o especificacin, queremos aclarar este punto, ya que en Visual Basic 6.0, si
indicbamos un filtro en los controles File o Directory, podamos indicar varios filtros separados
por punto y coma (;), en las clases de .NET esto no se puede hacer.
Para dejar claro estos puntos, veremos un ejemplo de cmo usar GetDirectories y GetFiles, con
estas dos clases.
397
Imports System
Imports System.IO
Module Module
Const dir1 As String = "E:\Pruebas"
Sub Main()
Console.WriteLine("Ejemplo de la clase Directory:")
claseDirectory()
Console.WriteLine()
Console.WriteLine("Ejemplo de la clase DirectoryInfo:")
claseDirectoryInfo()
Console.WriteLine()
'
Console.ReadLine()
End Sub
Sub claseDirectory()
' Recorrer los subdirectorios de un directorio
Dim dirs() As String
dirs = Directory.GetDirectories(dir1)
mostrarFicheros(dir1, "*.txt")
' recorrer los ficheros de cada uno de estos directorios
For Each dir As String In dirs
mostrarFicheros(dir, "*.txt")
Next
End Sub
Sub mostrarFicheros(ByVal dir As String, ByVal filtro As String)
Console.WriteLine("Los ficheros {0} del directorio: {1}", _
filtro, dir)
Dim fics() As String
fics = Directory.GetFiles(dir, filtro)
For Each fic As String In fics
Console.WriteLine(" Fichero: {0}", fic)
Next
End Sub
Sub claseDirectoryInfo()
Dim di As New DirectoryInfo(dir1)
Dim dirs() As DirectoryInfo
dirs = di.GetDirectories
mostrarFicheros(di, "*.*")
For Each dir As DirectoryInfo In dirs
mostrarFicheros(dir, "*.*")
Next
End Sub
Sub mostrarFicheros(ByVal dir As DirectoryInfo, ByVal filtro As String)
Console.WriteLine("Los ficheros {0} del directorio: {1}", _
filtro, dir.FullName)
Dim fics() As FileInfo
fics = dir.GetFiles(filtro)
For Each fic As FileInfo In fics
Console.WriteLine(" Fichero: {0}", fic.Name)
Next
End Sub
End Module
398
Al igual que ocurre con las clases para manejar los directorios, tenemos dos clases diferentes
para manejar los ficheros, una de ellas (File) todos los mtodos que tiene son estticos, por
tanto podemos usarlos directamente, sin crear una nueva instancia de la clase. Por otro lado la
clase FileInfo es una clase de la que tenemos que crear un nuevo objeto para poder usarla, al
crear ese objeto (o instancia), tenemos que indicar el fichero al que har referencia, ese fichero
no tiene porqu existir previamente.
Imports System
Imports System.IO
Module Module1
Const fic1 As String = "E:\Pruebas\Prueba.txt"
Const fic2 As String = "E:\Pruebas\SubDir\Prueba3.txt"
Sub Main()
Console.WriteLine("Ejemplo de la clase File:")
claseFile()
Console.WriteLine()
Console.WriteLine("Ejemplo de la clase FileInfo:")
claseFileInfo()
Console.WriteLine()
'
Console.ReadLine()
End Sub
Sub claseFile()
' comprobar si el fichero existe
If File.Exists(fic1) Then
Console.WriteLine("El fichero '{0}' SI existe", fic1)
Console.WriteLine("Fecha creacin: {0}", File.GetCreationTime(fic1))
Else
Console.WriteLine("El fichero '{0}' NO existe", fic1)
End If
End Sub
Sub claseFileInfo()
Dim fi As New FileInfo(fic2)
'
' Comprobar si existe el fichero:
If fi.Exists Then
Console.WriteLine("El fichero '{0}' SI existe", fic2)
Console.WriteLine("Fecha creacin: {0}", fi.CreationTime)
agregarTexto(fi)
Else
Console.WriteLine("El fichero '{0}' NO existe", fic2)
' lo creamos
fi.Create()
End If
End Sub
Sub agregarTexto(ByVal fi As FileInfo)
Dim fs As StreamWriter
fs = fi.CreateText
fs.WriteLine("Hola, Mundo")
fs.Flush()
fs.Close()
'
fi.Refresh()
399
Tanto la clase File como FileInfo tienen mtodos para realizar esta operacin, as como la
inversa: descifrarlo. Cuando ciframos un fichero, solo el usuario actual podr acceder a su
contenido (y el resto de administradores), la forma de hacerlo es bien simple: solo tenemos que
llamar al mtodo Encrypt o Decrypt para cifrarlo o descifrarlo. Cuando est cifrado, el nombre
del fichero se mostrar en un color diferente al del resto de ficheros (de forma predeterminada
en verde).
Esta forma de cifrado es diferente a la que vimos en la leccin anterior, ya que si ciframos el
contenido de un fichero de forma "manual", siempre estar cifrado, independientemente de
quin acceda al fichero.
Cuando utilizamos los mtodos para cifrar o descifrar un fichero, no recibiremos ninguna
excepcin si aplicamos el mtodo de cifrar sobre un fichero ya cifrado. Pero si queremos saber
si un determinado fichero est o no cifrado, lo podemos averiguar mediante la propiedad
Attribute de la clase FileInfo, particularmente comprobando si tiene activado el atributo
FileAttributes.Encrypted.
400
En el siguiente cdigo tenemos ejemplos de cmo usar las clases File y FileInfo para
comprobar si un fichero ya est cifrado, en cuyo caso lo desciframos, y si resulta que no est
cifrado, lo ciframos.
Imports System
Imports System.IO
Module Module1
Const fic1 As String = "E:\Pruebas\Prueba.txt"
Sub Main()
cifradoFile(fic1)
Console.WriteLine()
cifradoFileInfo(fic2)
Console.WriteLine()
'
Console.ReadLine()
End Sub
' Cifrar / Descifrar ficheros
' y comprobar si ya estn cifrados...
Sub cifradoFile(ByVal fichero As String)
' comprobar si est cifrado,
Dim atrib As FileAttributes
atrib = File.GetAttributes(fichero)
If (atrib And FileAttributes.Encrypted) = FileAttributes.Encrypted Then
Console.WriteLine("El fichero {0} ya estaba cifrado.", fichero)
File.Decrypt(fichero)
Else
File.Encrypt(fichero)
Console.WriteLine("El fichero {0} no estaba cifrado.", fichero)
End If
End Sub
Sub cifradoFileInfo(ByVal fichero As String)
' comprobar si est cifrado,
Dim fi As New FileInfo(fichero)
Dim atrib As FileAttributes
atrib = fi.Attributes
If (atrib And FileAttributes.Encrypted) = FileAttributes.Encrypted Then
Console.WriteLine("El fichero {0} ya estaba cifrado.", fi.FullName)
fi.Decrypt()
Else
fi.Encrypt()
Console.WriteLine("El fichero {0} no estaba cifrado.", fi.FullName)
End If
End Sub
End Module
401
Veamos un par de ejemplos que nos permitan leer el contenido o agregar nuevo texto a los
ficheros.
Imports System
Imports System.IO
Module Module1
Const fic3 As String = "E:\Pruebas\Prueba4.txt"
Const fic4 As String = "E:\Pruebas\SubDir\Prueba4.txt"
Sub Main()
abrirFile(fic3)
Console.WriteLine()
abrirFileInfo(fic4)
Console.WriteLine()
'
Console.ReadLine()
End Sub
' Abrir ficheros para leer el contenido o escribir en l
Sub abrirFile(ByVal fichero As String)
If File.Exists(fichero) Then
Dim fs As FileStream = File.OpenRead(fichero)
Dim enc As New System.Text.UTF8Encoding()
Dim datos(1024) As Byte
fs.Read(datos, 0, datos.Length)
fs.Close()
Dim s As String = enc.GetString(datos, 0, datos.Length)
Console.WriteLine("El contenido de: {0}{2} es:{2}{1}", _
fichero, s, vbCrLf)
Else
Console.WriteLine("Guardando algo en el fichero {0}", fichero)
Dim fs As FileStream = File.OpenWrite(fichero)
Dim enc As New System.Text.UTF8Encoding()
Dim datos() As Byte = enc.GetBytes("Hola bytes!")
fs.Write(datos, 0, datos.Length)
fs.Close()
End If
End Sub
Sub abrirFileInfo(ByVal fichero As String)
Dim fi As New FileInfo(fichero)
If fi.Exists Then
' abrir el fichero como texto y leemos el contenido
Dim sr As StreamReader = fi.OpenText
Dim s As String = sr.ReadToEnd
Console.WriteLine("El contenido de: {0}{2} es:{2}{1}", _
fichero, s, vbCrLf)
Else
Console.WriteLine("Guardando algo en el fichero {0}", fichero)
Dim sw As New StreamWriter(fi.OpenWrite)
sw.WriteLine("Hello bytes!")
sw.Close()
End If
End Sub
End Module
En el mtodo abrirFile utilizamos la clase File para abrir, leer y escribir en un fichero. En este
caso estamos usando un objeto del tipo FileStream para acceder al contenido de dicho fichero,
402
como sabemos, esta clase solo trabaja con bytes, por tanto si queremos leer el contenido del
mismo, debemos hacerlo mediante un array de bytes y para mostrar en formato texto ese
contenido, tenemos que aplicarle la codificacin correspondiente para extraer el contenido en
forma de una cadena. Lo mismo hacemos para guardar una cadena en el fichero, (en caso de
que no exista previamente).
Nota:
Como hemos podido comprobar, cuando tratamos con las clases DirectoryInfo o
FileInfo, siempre estamos tratando con instancias que pueden ser diferentes y por tanto
mltiples, esas instancias siempre manejan el directorio o fichero usado en el
constructor, por tanto, ser preferible usar estas clases cuando tengamos que hacer
varias operaciones sobre el mismo directorio o fichero.
Por otro lado, si solo queremos hacer pocas operaciones, podemos usar las clases Directory o
File, ya que no necesitaremos crear un objeto en memoria para hacer las tareas que
necesitemos hacer.
Por ejemplo, podemos usar esta clase para obtener informacin sobre un fichero, como el
nombre completo, el nombre del directorio o la extensin.
403
Nota:
Debido a que la clase Path solo maneja cadenas, podemos usar los mtodos de esta
clase con nombres de ficheros o directorios que no existen, y por tanto, cualquier
cambio que hagamos en esos parmetros, no afectarn a ningn fichero ni directorio.
Debido a que los ensamblados de .NET podemos usarlos con diferentes sistemas operativos
(al menos en teora), esta clase proporciona ciertas propiedades que nos permiten averiguar
los caracteres especiales de cada sistema, por ejemplo para saber el separador usado por los
directorios.
Con esta clase tambin podemos crear ficheros con nombres temporales, de forma que nos
aseguremos de que no habr otro fichero "temporal" con el mismo nombre. Igualmente, por
medio del mtodo GetTempPath podemos averiguar el directorio temporal del sistema.
Incluso podemos generar nombres aleatorios "seguros" para ficheros o directorios mediante el
mtodo GetRandomFileName.
En los dos primeros casos, se usa el directorio %TEMP% del sistema. Y en el caso del fichero
temporal, la extensin es .tmp
En el nombre aleatorio, tanto el nombre como la extensin estn formados por caracteres
"imprimibles" aleatorios.
404
3- Crear un archivo plano y aadirle texto (mtodo WriteLine del objeto StreamWriter.
Espacio de nombres System.IO )
405
406
8- Mover. ( My.Computer.FileSystem.MoveFile )
407
).
408
11- Leer todo el contenido de un archivo de texto en una solo operacin, y almacenarlo en
una variable. ( My.Computer.FileSystem.ReadAllText )
409
13- Obtener propiedades. Ejemplo que usa la clase FileInfo de system.IO para obtener
algunas propiedades y datos de archivos ( el nombre , la fecha y la hora de
modificacin en formato corto , el tamao en bytes y la extensin )
Colocar un control Listview, un button y un control TextBox
410
411
Contenido.
412
Streams en .NET
Segn hemos comentado en la introduccin, los streams (o secuencias o flujos) nos permiten
abstraernos de la forma en que estn implementados los procesos de acceso a los ficheros u
otros recursos. Todas las clases que manejan este tipo de flujos de datos estn basadas
(directa o indirectamente) en la clase Stream, la cual nos ofrece ciertos mtodos que nos
permiten, entre otras cosas, leer y escribir en esos flujos de informacin.
Adems de poder leer o escribir, tambin podemos realizar bsquedas o, dicho de otro modo,
podemos movernos a travs de esa secuencia de datos. Pero debido a que no todos los flujos
de datos nos permiten realizar todas las operaciones de la clase Stream, existen ciertas
propiedades por medio de las cuales podemos saber si se permiten todas las operaciones
"bsicas" que normalmente podremos hacer con los streams. Por ejemplo, es posible que no
podamos leer o escribir en una secuencia o que no podamos cambiar la posicin del "puntero"
de lectura o escritura. Para todas estas comprobaciones podremos usar las propiedades
CanRead, CanWrite o CanSeek, pero creo que antes de entrar en detalles, deberamos ver
algunos de las clases que .NET pone a nuestra disposicin para poder realizar este tipo de
operaciones con "las secuencias" de datos.
Entre las clases que estn basadas en esta clase abstracta tenemos las siguientes:
o
Nota:
Las clases DeflateStream y GZipSteam estn incluidas en el espacio de nombres
System.IO.Compression.
La
clase
CryptoStream
est
incluida
en
el
espacio
de
nombres
System.Security.Cryptography.
La clase NetworkStream est incluida en el espacio de nombres System.Net.Sockets.
413
Adems de estas clases que se derivan directamente de la clase Stream, y que normalmente
se usan como "secuencias" a usar por otras clases de entrada/salida, tenemos otras que nos
permitirn acceder a esas secuencias de datos de una forma ms directa, (algunas de estas
las veremos con algo de ms detalle en el prximo captulo dedicado al sistema de archivos de
.NET), por ejemplo:
o
Cuando trabajamos con los streams debemos olvidarnos de las "cosas simples" y debemos
tener en cuenta que trataremos casi siempre con secuencias de bytes, ya que al fin y al cabo
esa es la forma de almacenar la informacin en los streams. Por tanto cuando veamos los
ejemplos que la documentacin de Visual Basic 2005 nos proporciona no debemos extraarnos
de que haya que hacer tantas "cosas" para acceder o manipular la informacin almacenada en
esas "secuencias" de datos. Si bien, esa "complicacin" nos da mayor control sorbe el formato
de la informacin contenida en los streams. Por suerte, para los que nos gustan las cosas
"simples" las clases especficas nos facilitan mucho las cosas.
A continuacin veremos un par de ejemplos en los que manipularemos cierta informacin tanto
en la memoria usando un objeto del tipo MemoryStream, como en un fichero de disco usando
FileStream y las clases que casi con seguridad usaremos habitualmente para acceder al
contenido de los ficheros: StreamReader y StreamWriter.
Manejar un fichero usando FileStream
En este primer ejemplo veremos lo complicado que pude parecer acceder a un fichero usando
la clase FileStream y por extensin cualquier mtodo de otras clases que devuelvan este tipo
de secuencia, como por ejemplo los mtodos OpenRead, OpenWrite, etc. de la clase File.
La "complejidad" de esta clase es que realmente obtiene o guarda la informacin por medio de
un array de tipo Byte, cuando a lo que estamos acostumbrados es a usar cadenas.
Nota:
Realmente, esta forma "binaria" de acceder a la informacin de un fichero no la tenemos
que ver como un inconveniente, ya que nos puede servir para acceder de forma "binaria"
a ese fichero, en caso de que nuestra intencin sea acceder de forma "normal" para, por
ejemplo, leer solo texto, deberamos usar otras clases ms especializadas para esa
tarea, como lo es StreamReader.
414
En el siguiente cdigo tenemos dos mtodos, uno que guarda una cadena en el fichero
indicado:
Como hemos comentado, la clase FileStream (y en general todos los streams) trabaja con
bytes, por tanto para poder almacenar algo en ese fichero debemos hacerlo mediante un array
de tipo Byte.
En el caso de las cadenas, stas siempre deben estar codificadas, es decir, deben usar el
juego de caracteres que creamos conveniente, en el mundo de .NET ese juego de caracteres
es Unicode, ms concretamente usando la codificacin UTF-8, la cual permite trabajar con
cualquier carcter de cualquier cultura.
Como lo que nos interesa es convertir una cadena en un array de bytes, usamos el mtodo
GetBytes de un objeto UTF8Encoding, el cual convierte la cadena en una "ristra" de bytes con
el formato adecuado, en este caso UTF-8.
Si en lugar de usar UTF-8 quisiramos usar otro "codificador", por ejemplo el predeterminado
de Windows, con idea de que los ficheros sean compatibles con otras aplicaciones que utilizan
el formato predeterminado de Windows, tendremos que declarar la variable enc de la siguiente
forma:
415
En esta funcin vamos a leer los datos del fichero indicado, como ya hemos vistos, la clase
FileStream trabaja con bytes y esos bytes los convertimos a caracteres por medio de las clases
de codificacin especializadas.
Por regla general, esas lecturas las haremos de forma parcial, es decir leyendo bloques de
bytes y como tenemos que convertir esos bytes en caracteres, y puede ser que el fichero sea
muy grande, en lugar de concatenar una cadena para almacenar las lecturas parciales, vamos
a usar un objeto del tipo StringBuilder en el que iremos "agregando" cada trozo ledo, de forma
que el rendimiento no se vea penalizado por la forma de ser de las cadenas, ya que cada vez
que hacemos una concatenacin en una variable de tipo String, realmente estamos creando
nuevos objetos en la memoria y si son muchos, pues la verdad es que tendremos al recolector
de basura (GC) trabajando a tope, y si usamos un objeto StringBuilder el rendimiento mejora
una barbaridad.
La lectura de cada bloque de bytes lo hacemos en un bucle While, tambin podramos haberlo
hecho en un bucle Do While, pero en estos casos, el rendimiento de While es un "poquitn"
mayor.
416
Los datos ledos los agregamos al objeto StringBuilder por medio del mtodo Append que se
encarga de agregarlo a la cadena interna.
Finalmente cerramos el stream y devolvemos la cadena leda.
Para usar estas dos funciones lo podemos hacer de la siguiente forma:
A continuacin veremos cmo crear las dos funciones del ejemplo anterior para que utilicen las
clases "especializadas" para leer y escribir cadenas en un fichero.
Como podremos comprobar, esta es una forma muchsimo ms simple y, por tanto
recomendada para este tipo de acceso a los ficheros. Aunque debemos recordar que solo
servir para leer la informacin de forma secuencial y en formato cadena.
La funcin para guardar una cadena en un fichero:
Private Sub guardarDatos(ByVal fichero As String, ByVal cadena As String)
' Abrimos el fichero para escribir, (no aadir),
' usando la codificacin predeterminada: UTF-8
Dim sw As New System.IO.StreamWriter(fichero, False)
' guardamos toda la cadena
sw.WriteLine(cadena)
' Cerramos el fichero
sw.Close()
End Sub
Como podemos apreciar, esta es una forma mucho ms "compacta" que la anterior, ya que
solo tenemos que indicar en el constructor lo que queremos hacer y usar el mtodo Write o
WriteLine para guardar lo que queramos en el fichero.
Para guardarlo usando la codificacin predeterminada del Sistema Operativo en el que se
utilice la aplicacin, (en Windows ser ANSI), simplemente usamos este constructor:
Dim sw As New System.IO.StreamWriter(fichero, False, System.Text.Encoding.Default)
Para leer los datos podemos hacerlo de dos formas: lnea a lnea o todo el contenido de una
sola vez.
417
En el cdigo siguiente se muestra lnea a lnea, y al final, (comentado), cmo hacerlo en una
sola pasada.
Private Function leerDatos(ByVal fichero As String) As String
' Abrimos el fichero para leer
' usando la codificacin UTF-8 (la predeterminada de .NET)
Dim sr As New System.IO.StreamReader(fichero, True)
' si queremos usar la predeterminada de Windows
'Dim sr As New System.IO.StreamReader(fichero, System.Text.Encoding.Default)
' Podemos leer cada una de las lneas del fichero o todo el contenido
' Forma larga:
' si vamos a leer el fichero lnea por lnea, mejor usar un StringBuilder
Dim ret As New System.Text.StringBuilder
' recorremos el fichero hasta que no haya nada que leer
While sr.Peek <> -1
ret.Append(sr.ReadLine)
End While
' cerramos el fichero
sr.Close()
' devolvemos lo ledo
Return ret.ToString
'
'' Forma corta:
'' leemos todo el contenido del fichero
'Dim ret As String = sr.ReadToEnd()
'' lo cerramos
'sr.Close()
'' devolvemos lo ledo
'Return ret
End Function
Si nos decidimos a leer el contenido del fichero lnea a lnea, podemos usar el mtodo Peek, el
cual devolver el siguiente carcter del buffer del stream, o -1 si no hay nada que leer. Peek no
"consume" el carcter, simplemente comprueba si hay algo que leer.
Si hay algo que leer, leemos la lnea completa y la aadimos al objeto StringBuilder, el bucle se
repetir mientras haya informacin pendiente de leer.
Pero si optamos por la va rpida, porque realmente no nos interese procesar cada lnea,
podemos usar el mtodo ReadToEnd, que en nuestro ejemplo, el valor devuelto ser todo el
contenido del fichero, el cual asignamos a una variable de tipo String para usarla como valor
devuelto por la funcin, despus de cerrar el fichero.
Try
Return sr.ReadToEnd()
Finally
sr.Close()
End Try
Tcnica de Programacin Orientada a Objetos
418
Ya que el bloque Finally siempre se ejecutar, se produzca o no un error, por tanto nos
aseguramos de que el fichero se cierra.
O si lo preferimos, podemos usar la nueva forma de asegurarnos de que los recursos usados
se liberan:
En este cdigo, cuando usamos Using sr, al ejecutarse End Using, el CLR se encargar de
llamar al mtodo Dispose de la clase, de forma que se liberen los recursos que estemos
usando, en este ejemplo: el fichero abierto.
Estos dos ltimos ejemplos seran equivalentes a los anteriores, ms seguros, pero tambin
con ms "trabajo" para el CLR.
Nota:
Using... End Using solo se puede usar con clases que implementen la interfaz
IDisposable, que es la que asegura que el objeto implementa el mtodo Dispose.
Por tanto, si implementamos el mtodo IDisposable.Dispose en nuestras clases, en ese
mtodo nos tenemos que asegurar que liberamos los recursos que nuestra clase est
utilizando.
fichero.
419
420
Bibliografa
JOYANES AGUILAR, Luis. Fundamentos de Programacin, Estructura de
Datos y Programacin Orienta Objetos. 3era Edicin
McGrawHill/Interamericana de Espaa
Manuales Oficiales de Preparacin para los Exmenes de Certificacin
Microsoft Curso 2546: Core Windows Application Development with
Visual Studio 2005
MCTS Self-Paced Training Kit (Exam 70-536): Microsoft .NET Framework
2.0 Application Development Foundation
Programming Microsoft Visual Basic 2005: The Language
421