Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

1/27
Cuadros de diálogo
En general, las cuadros de diálogo se utilizan para pedir datos o configurar variables
desde una aplicación. La plataforma .NET proporciona cuadros de diálogo predefinidos
pero también permite que el programador configure cuadros de diálogo según sus
necesidades. A continuación se estudian estos últimos y posteriormente se verán los que
proporciona la plataforma.

Cuadros de diálogo definidos por el usuario
En C#no existe una clase Di al og o Di al ogBox. Las cajas de diálogo son formularios
con unas propiedades predeterminadas:
a) Tiene tamaño fijo. La propiedad For mBor der St yl e debe ser Fi xedDi al og.
b) No suelen tener los tres botones de la parte superior derecha de las ventanas
comunes de Windows –Minimizar, Maximizar y Control- . Por eso, sus
propiedades Mi ni mi zedBox, Maxi mi zedBox y Cont r ol Box deben ser f al se.

Un cuadro de diálogo puede ser modal -cuando la propia aplicación o formulario que
lo ha llamado no puede recibir ningún evento hasta que se ha cerrado el cuadro de
diálogo- o no modal –el caso contrario-.

Para ejecutar un cuadro de dialogo modal se siguen los siguientes pasos:

• Se crea y diseña el formulario correspondiente al cuadro de diálogo. Dicho
formulario tendrá en cuenta lo dicho anteriormente en los apartados a y b. En
general, el cuadro tendrá, al menos, un botón Acept ar y un botón Cancel ar ,
con la función de cerrar el cuadro y de informar a la aplicación que se
aceptan los datos que se han introducido o que se desea anular la
introducción de dichos datos. También se diseñan cuadros de diálogo con
solo el botón de Aceptar.
• En el método de la aplicación que llama al cuadro de diálogo modal se crea
un objeto de la clase del cuadro de diálogo y dicho objeto invoca al método
ShowDi al og( ) . En ese momento la aplicación detiene su ejecución hasta que
se haya cerrado el cuadro de diálogo que le informa de cuál ha sido el botón
pulsado. El código podría ser algo así:

Di al ogo dl g = new Di al ogo( ) ;
dl g. ShowDi al og( ) ;
Met odoQueHaceAl go( ) ;

En este ejemplo, el método Met odoQueHaceAl go( ) no se ejecuta hasta que
se ha cerrado el cuadro de diálogo.

Si se llama a un cuadro de diálogo no modal habría que llamar al método Show( ) en
lugar de ShowDi al og( ) . Se abre entonces el cuadro de diálogo y se ejecutaría el método
Met odoQueHaceAl go( ) sin esperar a que se cierre el cuadro. El control de este tipo de
cuadros es mucho más complejo.

Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

2/27
Ejemplo: trabajando con cuadros de diálogo definidos por el usuario
Esta aplicación tiene un formulario llamado For mul ar i oPr i nci pal , y un cuadro de
diálogo modal. El For mul ar i oPr i nci pal puede abrir el cuadro de diálogo para
solicitar un dato -en este caso una frase- que se introduce en una caja de texto y se
devuelve como una cadena al propio formulario (figura 18.1).
El formulario For mul ar i oPr i nci pal tiene una etiqueta para recoger la cadena desde el
cuadro de dialogo y dos botones bt nDef i ni r Fr ase y bt nSal i r . El cuadro de diálogo
Di al ogo tiene una caja de texto t ext o y dos botones bt nOk y bt nCancel ar .
For mul ar i oPr i nci pal llama al cuadro de diálogo desde bt nDef i ni r Fr ase.



Figura 18.1. Se llama desde formulario principal a un cuadro de diálogo.

Una vez que se despliega el cuadro de diálogo, el usuario debe rellenar la caja de texto.
Posteriormente, si pulsa el bt nOk, la cadena de la caja de texto debe pasar a la etiqueta
del For mul ar i oPr i nci pal . Si se pulsase bt nCancel ar , se debe cancelar la operación.

El botón bt nOk del diálogo en realidad significa: “Estoy de acuerdo con la elección. Por
favor, utiliza este valor en el programa y cierra el cuadro de diálogo”. Y el
bt nCancel ar : ”Anula la elección, vuelve al estado anterior y cierra el cuadro de
diálogo”.

Para asignar esta funcionalidad a los botones del formulario, deben utilizarse las
propiedades Di al ogResul t de los botones bt nOk y bt nCancel ar . Se le asigna el valor
Di al ogResul t . Ok al primero y Di al ogResul t . Cancel al segundo.

Pero, ¿qué significa exactamente asignar un valor a la propiedad Di al ogResul t de un
botón?.
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

3/27

Para contestar a esta pregunta es necesario saber que cuando se pulsa un botón del
diálogo suceden las siguientes cosas:

a) Se ejecuta el código asociado al botón.
b) Inmediatamente después, se cierra el cuadro de diálogo.
c) Se asigna a la propiedad Di al ogResul t del cuadro de diálogo el valor de la
propiedad Di al ogResul t del botón que se ha pulsado.

El código del botón bt nDef i ni r Fr ase del formulario principal es:

/ / Se cr ea un obj et o de l a cl ase del Cuadr o de Di al ogo
Di al ogo dl g = new Di al ogo( ) ;

/ / Cuando se ci er r e dl g se asi gna a l a pr opi edad Di al ogResul t del
/ / f or mul ar i o, l a pr opi edad Di al ogResul t del bot ón
/ / cor r espondi ent e al bot ón pul sado
dl g. ShowDi al og( t hi s) ;

/ / Si se pul sa bt nOk
i f ( dl g. Di al ogResul t == Di al ogResul t . Ok)
/ / Codi goQueSeEj ecut aDespuesDePul sar Ok( )

/ / si se pul sa bt nCancel ar
el se i f ( dl g. Di al ogResul t == Di al ogResul t . Cancel )
/ / Codi goQueSeEj ecut aDespuesDePul sar Cancel ( )

Met odoQueHaceMasCosas( ) ;


Di al ogResul t es una enumeración pública. Su definición es:

publ i c enumDi al ogResul t ;

Los valores que puede tomar Di al ogResul t son:

Di al ogResul t . Abor t
Di al ogResul t . Cancel
Di al ogResul t . I gnor e
Di al ogResul t . No
Di al ogResul t . OK
Di al ogResul t . Ret r y
Di al ogResul t . Yes
None

El método ShowDi al og( ) devuelve un objeto de tipo Di al ogResul t que se asigna a la
propiedad Di al ogResul t del cuadro de diálogo. Su estructura es:

publ i c Di al ogResul t ShowDi al og( ) ;

Para construir esta aplicación siga los siguientes pasos:

• Comience creando una nueva aplicación y llámele Cuadr oDeDi al ogo
• Propiedades del formulario:
Text = For mul ar i o Pr i nci pal
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

4/27
Name = For mul ar i oPr i nci pal
• A continuación añada dos botones al formulario principal. Asigne las propiedades
siguientes:
Name = bt nI r Cuadr oDi al ogo
Text = I r al cuadr o de di al ogo
Name = bt nSal i r
Text = Sal i r

• Se añade una etiqueta con las propiedades siguientes:
Name = et i quet a
Text = ( si n t ext o)

El resultado del diseño debe ser parecido al de la figura 18.2:


Figura 18.2. Diseño de la aplicación

• Este es un buen momento para guardar el proyecto.
• A continuación, cree el cuadro de diálogo:
a) Añada un formulario al proyecto (Proyecto/Agregar formulario de
Windows) o bien, en la ventana Explorador de Soluciones pulse –
como indica la figura 18.3- con el botón derecho del ratón sobre el
nombre del proyecto, elegir Agregar/Agregar formulario de
Windows... , y asigne al fichero el nombre Mi Di al ogo. cs (figuras
18.3 y 18.4)

Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

5/27


Figura 18.3. Añadiendo un nuevo formulario a la aplicación.



Figura 18.4. Cuadro de diálogo para configurar el nuevo formulario.

Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

6/27
Al pulsar Abr i r se añadirá un nuevo formulario a la aplicación.


b) En la ventana de propiedades del formulario Mi Di al ogo:
Bor der St yl e = Fi xedDi al og. (No puede cambiarse el tamaño)
Cont r ol Box = f al se (No aparece el botón control )
Mi ni mi zeBox = f al se (No aparece el botón minimizar )
Maxi mi zeBox = f al se. (No aparece el botón maximizar )

c) Añada una caja de texto al cuadro de diálogo:
Name = t ext o
Text = ( si n t ext o)

d) Añada una etiqueta al cuadro de diálogo, para “etiquetarlo”:
Text = Escr i ba el f i cher o con su pat h compl et o
Aut osi ze = Tr ue ( opt i mi za su t amaño aut omát i cament e)

e) Añada dos botones al cuadro de diálogo, bt nOK y bt nCancel ar .
Cuando se pulse bt nOK, se debe cerrar el cuadro de diálogo y el texto
de la caja de texto, debe ser “recogido” por el cuadro de diálogo y
enviado al formulario principal. Sin embargo, si se pulsa el botón
bt nCancel ar , simplemente se sale del cuadro de diálogo y se cancela
la operación.

Propiedades de los botones:

Name = bt nOK
Text = Acept ar
Di al ogResul t = Ok

Name = bt nCancel ar
Text = Cancel ar
Di al ogResul t = cancel

El aspecto final del cuadro de diálogo es el de la figura 18.5:



Figura 18.5: Diseño final del cuadro de diálogo

f) La misión de los dos botones es cerrar el cuadro de diálogo y asignar
a la propiedad Di al ogResul t del cuadro de diálogo el valor
correspondiente de la propiedad Modal Resul t del botón pulsado–en
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

7/27
este caso Modal Resul t . OK o Modal Resul t . Cancel - . Además, esos
botones pueden ejecutar un código, si se desea, antes de que se cierre
el cuadro. En este caso, el botón bt nCancel ar no ejecutará nada y el
bt nOk asignará la cadena de la caja de texto a una variable privada de
la clase Mi Di al ogo.

Para hacer esto de manera correcta, defina un campo privado
nombr eFi cher o de tipo st r i ng, para almacenar o recoger el texto de la caja
de texto t ext o en la clase Mi Di al ogo. Añada la línea siguiente en la zona de
la clase Mi Di al ogo reservada para los campos de la clase:

pr i vat e st r i ng nombr eFi cher o;

Para poder acceder a este campo de modo sencillo defina una propiedad
pública, de nombre Nombr eFi cher o para leer y almacenar un st r i ng en el
campo nombr eFi cher o.

Para ello, en la ventana Vista de clases pulse con botón derecho sobre el
nombre de la clase –Mi Di al ogo- y seleccione la opción Agregar/Agregar
Propiedad, como se indica en la figura 18.6)




Figura 18.6. Forma de agregar visualmente una propiedad a una clase

Aparece el cuadro de diálogo de la figura 18.7:


Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

8/27

Figura 18.7. Cuadro de diálogo de definición de una propiedad.

Rellene los datos correspondientes: tipo devuelto –será un st r i ng- y el nombre
de la propiedad, que además será de lectura/escritura (figura 18.7). Visual Studio
escribe el código siguiente:

publ i c st r i ng Nombr eFi cher o
{
get
{
r et ur n nombr eFi cher o;
}
set
{
nombr eFi cher o = val ue;
}
}

El botón bt nOk debe cerrar el cuadro, pero también asignar la cadena
introducida a la variable nombr eFi cher o. Por eso, en su evento Cl i ck se le asocia el
código siguiente:

Nombr eFi cher o=t ext o. Text ;

Sólo resta llamar al diálogo como modal desde el For mul ar i oPr i nci pal y
asignar código a los eventos Cl i ck de ambos botones:

Mi Di al ogo dl g = new Mi Di al ogo( ) ;
dl g. ShowDi al og( t hi s) ;

Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

9/27
/ / Si se pul sa bt nOk
i f ( dl g. Di al ogResul t == Di al ogResul t . OK)
et i quet a. Text = dl g. Nombr eFi cher o;
/ / si se pul sa bt nCancel ar
el se i f ( dl g. Di al ogResul t == Di al ogResul t . Cancel )
/ / No hacer nada
;

Guarde la aplicación y ejecútela.



Figura 18.8. Aspecto final de la aplicación.

El código completo de los dos formularios es el siguiente:

/ / *************For mul ar i oPr i nci pal . cs********************
usi ng Syst em;
usi ng Syst em. Dr awi ng;
usi ng Syst em. Col l ect i ons;
usi ng Syst em. Component Model ;
usi ng Syst em. Wi ndows. For ms;
usi ng Syst em. Dat a;

namespace Cuadr oDi al ogo
{
publ i c cl ass For mul ar i oPr i nci pal : Syst em. Wi ndows. For ms. For m
{
pr i vat e Syst em. Wi ndows. For ms. But t on bt nI r Cuadr oDi al ogo;
pr i vat e Syst em. Wi ndows. For ms. But t on bt nSal i r ;
pr i vat e Syst em. Wi ndows. For ms. Label et i quet a;
pr i vat e Syst em. Component Model . Cont ai ner component s = nul l ;

publ i c For mul ar i oPr i nci pal ( )
{
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

10/27
I ni t i al i zeComponent ( ) ;
}

pr ot ect ed over r i de voi d Di spose( bool di sposi ng )
{
i f ( di sposi ng )
{
i f ( component s ! = nul l )
{
component s. Di spose( ) ;
}
}
base. Di spose( di sposi ng ) ;
}

#r egi on Wi ndows For mDesi gner gener at ed code
pr i vat e voi d I ni t i al i zeComponent ( )
{
t hi s. bt nSal i r = new Syst em. Wi ndows. For ms. But t on( ) ;
t hi s. et i quet a = new Syst em. Wi ndows. For ms. Label ( ) ;
t hi s. bt nI r Cuadr oDi al ogo = new But t on( ) ;
t hi s. SuspendLayout ( ) ;
/ /
/ / bt nSal i r
/ /
t hi s. bt nSal i r . Locat i on = new Poi nt ( 176, 152) ;
t hi s. bt nSal i r . Name = " bt nSal i r " ;
t hi s. bt nSal i r . TabI ndex = 1;
t hi s. bt nSal i r . Text = " Sal i r " ;
/ /

t hi s. Aut oScal eBaseSi ze = new Si ze( 5, 13) ;
t hi s. Cl i ent Si ze = new Syst em. Dr awi ng. Si ze( 292, 273) ;
t hi s. Cont r ol s. AddRange( new Cont r ol [ ] {
t hi s. et i quet a,
t hi s. bt nSal i r ,
t hi s. bt nI r Cuadr oDi al ogo}) ;
t hi s. Name = " For mul ar i oPr i nci pal " ;
t hi s. Text = " For mul ar i o Pr i nci pal " ; / / et i quet a
/ /
t hi s. et i quet a. Locat i on = new Poi nt ( 48, 72) ;
t hi s. et i quet a. Name = " et i quet a" ;
t hi s. et i quet a. Si ze=new Syst em. Dr awi ng. Si ze( 184, 23) ;
t hi s. et i quet a. TabI ndex = 2;
/ /
/ / bt nI r Cuadr oDi al ogo
/ /
t hi s. bt nI r Cuadr oDi al ogo. Locat i on=new Poi nt ( 32, 152) ;
t hi s. bt nI r Cuadr oDi al ogo. Name = " bt nI r Cuadr oDi al ogo" ;
t hi s. bt nI r Cuadr oDi al ogo. Si ze = new Si ze( 128, 23) ;
t hi s. bt nI r Cuadr oDi al ogo. TabI ndex = 0;
t hi s. bt nI r Cuadr oDi al ogo. Text =
" I r al cuadr o de di ál ogo" ;
t hi s. bt nI r Cuadr oDi al ogo. Cl i ck +=
new
Syst em. Event Handl er ( t hi s. bt nI r Cuadr oDi al ogo_Cl i ck) ;
/ /
/ / For mul ar i oPr i nci pal
//
t hi s. ResumeLayout ( f al se) ;

Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

11/27
}
#endr egi on

[ STAThr ead]
st at i c voi d Mai n( )
{
Appl i cat i on. Run( new For mul ar i oPr i nci pal ( ) ) ;
}

pr i vat e voi d bt nI r Cuadr oDi al ogo_Cl i ck( obj ect sender ,
Syst em. Event Ar gs e)
{
Mi Di al ogo dl g = new Mi Di al ogo( ) ;
dl g. ShowDi al og( t hi s) ;

/ / Si se pul sa bt nOk
i f ( dl g. Di al ogResul t == Di al ogResul t . OK)
et i quet a. Text = dl g. Nombr eFi cher o;
/ / si se pul sa bt nCancel ar
el se i f ( dl g. Di al ogResul t == Di al ogResul t . Cancel )
/ / No hacer nada
;

}
}
}


/ / ***************Mi Di al ogo. cs**************************
usi ng Syst em;
usi ng Syst em. Dr awi ng;
usi ng Syst em. Col l ect i ons;
usi ng Syst em. Component Model ;
usi ng Syst em. Wi ndows. For ms;

namespace Cuadr oDi al ogo
{
publ i c cl ass Mi Di al ogo : Syst em. Wi ndows. For ms. For m
{
pr i vat e Syst em. Wi ndows. For ms. Text Box t ext o;
pr i vat e Syst em. Wi ndows. For ms. But t on bt nOk;
pr i vat e Syst em. Wi ndows. For ms. But t on bt nCancel ar ;
pr i vat e Syst em. Wi ndows. For ms. Label l abel 1;

pr i vat e Syst em. Component Model . Cont ai ner component s = nul l ;

/ / Mi s var i abl es
private string nombreFichero;
public string NombreFichero
{
get
{
return nombreFichero;
}
set
{
nombreFichero=value;
}
}
publ i c Mi Di al ogo( )
{
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

12/27
I ni t i al i zeComponent ( ) ;
}
pr ot ect ed over r i de voi d Di spose( bool di sposi ng )
{
i f ( di sposi ng )
{
i f ( component s ! = nul l )
{
component s. Di spose( ) ;
}
}
base. Di spose( di sposi ng ) ;
}
#r egi on Wi ndows For mDesi gner gener at ed code
pr i vat e voi d I ni t i al i zeComponent ( )
{
t hi s. t ext o = new Syst em. Wi ndows. For ms. Text Box( ) ;
t hi s. bt nOk = new Syst em. Wi ndows. For ms. But t on( ) ;
t hi s. bt nCancel ar = new Syst em. Wi ndows. For ms. But t on( ) ;
t hi s. l abel 1 = new Syst em. Wi ndows. For ms. Label ( ) ;
t hi s. SuspendLayout ( ) ;
/ /
/ / t ext o
/ /
t hi s. t ext o. Locat i on=new Syst em. Dr awi ng. Poi nt ( 56, 56) ;
t hi s. t ext o. Name = " t ext o" ;
t hi s. t ext o. Si ze = new Syst em. Dr awi ng. Si ze( 184, 20) ;
t hi s. t ext o. TabI ndex = 0;
t hi s. t ext o. Text = " " ;
/ /
/ / bt nOk
/ /
t hi s. bt nOk. Di al ogResul t = Di al ogResul t . OK;
t hi s. bt nOk. Locat i on = new Poi nt ( 56, 104) ;
t hi s. bt nOk. Name = " bt nOk" ;
t hi s. bt nOk. TabI ndex = 1;
t hi s. bt nOk. Text = " Ok" ;
t hi s. bt nOk. Cl i ck +=
new Syst em. Event Handl er ( t hi s. bt nOk_Cl i ck) ;
/ /
/ / bt nCancel ar
/ /
t hi s. bt nCancel ar . Di al ogResul t = Di al ogResul t . Cancel ;
t hi s. bt nCancel ar . Locat i on = new Poi nt ( 160, 104) ;
t hi s. bt nCancel ar . Name = " bt nCancel ar " ;
t hi s. bt nCancel ar . TabI ndex = 2;
t hi s. bt nCancel ar . Text = " Cancel ar " ;
/ /
/ / l abel 1
/ /
t hi s. l abel 1. Aut oSi ze = t r ue;
t hi s. l abel 1. Locat i on = new Poi nt ( 40, 24) ;
t hi s. l abel 1. Name = " l abel 1" ;
t hi s. l abel 1. Si ze = new Si ze( 201, 13) ;
t hi s. l abel 1. TabI ndex = 3;
t hi s. l abel 1. Text =
“Escr i ba el f i cher o con su pat h compl et o" ;
/ /
/ / Mi Di al ogo
/ /
t hi s. Aut oScal eBaseSi ze = new Si ze( 5, 13) ;
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

13/27
t hi s. Cl i ent Si ze = new Si ze( 292, 157) ;
t hi s. Cont r ol s. AddRange( new Cont r ol [ ] {
t hi s. l abel 1,
t hi s. bt nCancel ar ,
t hi s. bt nOk,
t hi s. t ext o}) ;
t hi s. Name = " Mi Di al ogo" ;
t hi s. Text = " Mi Di al ogo" ;
t hi s. ResumeLayout ( f al se) ;

}
#endr egi on

pr i vat e voi d bt nOk_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
/ / Asi gnamos el val or i nt r oduci do
/ / en l a caj a de t ext o al campo nombr eFi cher o
/ / Podr í a escr i bi r se t ambi én
/ / nombr eFi cher o=t ext o. Text ;
Nombr eFi cher o=t ext o. Text ;
}
}
}


Por último y aunque no se ha indicado, el código correspondiente al botón bt nSal i r es:

pr i vat e voi d bt nSal i r _Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
Appl i cat i on. Exi t ( ) ;
}

Cuadros de dialogo proporcionados por .NET
Todos los cuadros de diálogo que se estudian a continuación son proporcionados por la
librería .NET. El programador no los diseña. Sólo define algunas de sus propiedades
La clase MessageBox
Presenta un cuadro de diálogo muy simple por pantalla. Un cuadro de diálogo
MessageBox es un cuadro de diálogo modal que, en general, se utiliza para informar o
avisar al usuario de algo que ha ocurrido pero no para introducir datos.
No tiene constructor público, por lo que no es posible crear un objeto o instancia de esta
clase. Para visualizar un MessageBox se invoca al método estático Show( ) .
El aspecto de un MessageBox es el de la figura 18.9.

Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

14/27
Figura 18.9
Se puede definir el título, el mensaje, los botones e iconos del MessageBox
determinando los parámetros que se pasan en el método Show( ) .
Si, por ejemplo, en un formulario se ha situado un botón y una caja de texto y se desea
que si se pulsa el botón estando la caja de texto vacía, se avise al usuario con un
MessageBox que le indique que la caja de texto debe rellenarse con algún dato, el
código del botón sería algo parecido al siguiente:

pr ot ect ed voi d but t on1_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
i f ( t ext Box1. Text == " " )
{
MessageBox. Show( " I nt r oduce t u nombr e" ,
" Er r or al i nt r oduci r el nombr e”,
MessageBoxBut t ons. OK,
MessageBoxI con. Excl amat i on) ;
}
el se
{
/ / Códi go en caso de que se haya i nt r oduci do al go.
}
}


Esta clase hereda directamente de la clase Obj ect y sólo tiene un método que no sea
heredado que es precisamente Show( ) . Devuelve el valor de la propiedad
Di al ogResul t del botón pulsado.

Show( ) está sobrecargado y tiene muchas maneras de ser invocado:

Desde el simple:
publ i c st at i c Di al ogResul t Show( st r i ng mensaj e) ;
hasta
publ i c st at i c Di al ogResul t Show( I Wi n32Wi ndow vent ana,
st r i ng mensaj e,
st r i ng t i t ul o,
MessageBoxBut t ons bot ones,
MessageBoxI con i cono,
MessageBoxDef aul t But t on bt n,
MessageBoxOpt i ons op) ;
La enumeración MessageBoxBut t ons es:
Abor t Ret r yI gnor e
La ventana contiene los botones Anul ar , Rei nt ent ar y Omi t i r .
OK
La ventana contiene el boton Acept ar .
OKCancel
La ventana contiene los botones Acept ar y Cancel ar .
Ret r yCancel
La ventana contiene los botones Rei nt ent ar y Cancel ar .
YesNo
La ventana contiene los botones Sí, No
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

15/27
YesNoCancel
La ventana contiene los botones Sí , No y Cancel ar .
La enumeración MessageBoxI con es:
Ast er i sk
El icono es una interrogación (una letra “i” en un signo de
interrogación).
Er r or
El icono es una X blanca sobre un cículo de fondo rojo
Excl amat i on
El icono es una exclamación en un triángulo de fondo amarillo
Hand
El icono es una X blanca sobre un cículo de fondo rojo.
I nf or mat i on
El icono es una interrogación (una letra “i” en un signo de
interrogación).
None
No hay icono.
Quest i on
El icono es una interrogación en un círculo.
St op
El icono es una X blanca sobre un cículo de fondo rojo.
War ni ng
El icono es una exclamación en un triángulo de fondo amarillo.

Enumeración correspondiente a MessageBoxDef aul t But t on
But t on1
El botón por defecto es el primero.
But t on2
Idem el segundo.
But t on3
Idem el tercero.


Enumeración correspondiente a MessageBoxOptions

Def aul t Deskt opOnl y,
Ser vi ceNot i f i cat i on
Se visualiza el mensaje en la ventana activa.
Ri ght Al i gn, Rt l Readi ng
Formas de alinear el texto

A continuación se destacan varios ejemplos y se representa la salida de esas
líneas de código.
a) MessageBox. Show( t hi s, " Hol a" ) ;
b) MessageBox. Show( " Hol a" ) ;

Figura 18.10
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

16/27
b) MessageBox. Show( t hi s, " Hol a" , " Est e es el t í t ul o del mensaj e" ) ;

Figura 18.11
c) MessageBox. Show( t hi s, " Hol a" , " Tí t ul o mensaj e" , MessageBoxBut t ons. OK) ;



Figura 18.12

c) MessageBox. Show( t hi s,
" Hol a" ,
" Tí t ul o mensaj e" ,
MessageBoxBut t ons. YesNoCancel ) ;



Figura 18.13

d) MessageBox. Show( t hi s,
" Hol a" ,
" Tí t ul o mensaj e" ,
MessageBoxBut t ons. Abor t Ret r yI gnor e) ;



Figura 18.14

e) MessageBox. Show( t hi s,
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

17/27
" Hol a" ,
" Tí t ul o mensaj e" ,
MessageBoxBut t ons. Abor t Ret r yI gnor e,
MessageBoxI con. Ast er i sk) ;



Figura 18.15

f) MessageBox. Show( t hi s,
" Hol a" ,
" Tí t ul o mensaj e" ,
MessageBoxBut t ons. OKCancel ,
MessageBoxI con. St op,
MessageBoxDef aul t But t on. But t on2) ;



Figura 18.16

Cuadros de diálogo estándar proporcionados por .NET

El Framework .NET proporciona otras clases para algunos cuadros de diálogo
predefinidos para abrir y guardar ficheros, imprimir, para la elegir de la fuente, etc.
Cada uno de estos cuadros de diálogo se corresponde con una clase del Framework. La
jerarquía de dichas clases es la que se representa en la figura 18.17.















CommonDi al og
Component
Obj ect
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

18/27


















Figura 18.17. J erarquía de las clases correspondientes a los cuadros de diálogo estándar.

Todas estas clases derivan de la clase CommonDi al og, excepto la clase
Pr i nt Pr evi ewDi al og que deriva directamente de la clase For m.

La clase CommonDialog
Esta clase base define los siguientes métodos y eventos, que son comunes a todas las
clases que derivan de ella (Figura 18.17). Los más importantes son:


Di al ogResul t
ShowDi al og( )
Este método despliega el cuadro de diálogo
voi d Reset ( )
Pone los valores predeterminados.
Event Handl er
Hel pRequest
Este evento se lanza cuando el usuario pulsa el botón de
ayuda en el cuadro de diálogo

El método más importante de CommonDi al og es ShowDi al og( ) que devuelve un objeto
de tipo Di al ogResul t que en estos cuadros de diálogo puede tomar dos valores:

Di al ogResul t . OK si el usuario pulsa el botón Ok en el cuadro de diálogo.
Di al ogResul t . CANCEL, en cualquier otro caso.

Cómo utilizar los cuadros de diálogo estándar
En general, todas las clases que corresponden a cuadros de diálogo estándar son muy
parecidas. Para presentar en pantalla el cuadro de diálogo se invoca el método
ShowDi al og( ) y éste, a su vez, invoca al método RunDi al og( ) . Una vez que se ha
cerrado el cuadro, ShowDi al og( ) devuelve un objeto de tipo Di al ogResul t que
encapsula la información acerca de cómo el usuario ha interactuiado con la caja de
diálogo.
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

19/27

En general, los pasos a seguir para utilizar un cuadro de diálogo estándar son:

• Crear una instancia del cuadro de diálogo.
• Definir las propiedades y estado del cuadro de diálogo. Este paso puede
también hacerse en tiempo de diseño.
• Llamar al método ShowDi al og( ) y esperar la actuación del usuario.

Suponga, por ejemplo que se desea llamar al cuadro de diálogo correspondiente a abrir
un fichero. Después de haber realizado los tres pasos anteriores, el usuario selecciona un
fichero y pulsa el botón OK. Se asocia a la propiedad Fi l eName el nombre del fichero
que se ha selecionado, se cierra el cuadro y se chequea si el valor devuelto por el
método ShowDi al og( ) es Di al ogResul t . Ok. Después se leen las propiedades que se
necesiten del cuadro de diálogo. El código podría ser:

st r i ng nombr eFi cher o;
OpenFi l eDi al og dl g=new OpenFi l eDi al og( ) ;
dl g. Ti t l e= " Cuadr o de di al ogo Abr i r " ;
i f ( dl g. ShowDi al og( ) ==Di al ogResul t . OK)
nombr eFi cher o = dl g. Fi l eName;
el se
/ / Ot r oMet odo( ) ;


Realmente, para abrir el cuadro de diálogo, sólo son necesarias estas dos líneas de
código:

OpenFi l eDi al og dl g=new OpenFi l eDi al og( ) ;
dl g. ShowDi al og( ) ;

Observe que el cuadro de diálogo sólo selecciona el fichero y no lo abre. Para ello. el
programador debe escribir un determinado código.

El resto de los cuadros de dialogo estándar funcionan de una manera muy parecida pero
cada uno de ellos tiene una funcionalidad específica y pueden seleccionar de manera
visual un fichero, una fuente, un color, etc... y lo asignan a la propiedad
correspondiente.

Si se ejecuta el código anterior, por ejemplo, desde un botón, se despliega en la pantalla
el formulario de la figura 18.18:

Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

20/27

Figura 18.18. Cuadro de diálogo estándar para abrir ficheros.

A continuación, se estudian con cierto detalle algunas de las clases correspondientes a
los distintos cuadros de diálogo.
La clase FileDialog
Fi l eDi al og es una clase abstracta y no puede ser instanciada directamente. De esta
clase heredan las clases OpenFi l eDi al og y SaveFi l eDi al og.
Fi l eDi al og es un cuadro de diálogo modal.
Propiedades
bool AddExt ensi on
Indica si se añade una extensión de un tipo de fichero si el
usuario omite la extensión.
bool CheckFi l eExi st s
Indica si se presenta un cuadro de diálogo de aviso si el
usuario especifica un nombre de fichero que no existe.
bool CheckPat hExi st s
Indica si se presenta un cuadro de diálogo de aviso si el
usuario especifica un path que no existe.
st r i ng Def aul t Ext
La extensión por defecto. Por defecto, si no se ha
especificado ninguna, se añade esta extensión a los
ficheros cuando el usuario guarda el fichero.
st r i ng Fi l eName
Es un string con el nombre del fichero seleccionado en el
cuadro de diálogo.
st r i ng[ ] Fi l eNames
Obtiene todos los ficheros seleccionados en el cuadro de
diálogo.
st r i ng Fi l t er
Determina el “filtro” que determina los tipos de ficheros
que aparecen en las cajas de texto “Guardar como tipo
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

21/27
…” o “Tipo de archivo….”
i nt Fi l t er I ndex
El índice del filtro actualmente seleccionado. El primer
índice es el 1.
st r i ng I ni t i al Di r ect or y
Directorio inicial al abrirse el cuadro de diálogo.
bool Rest or eDi r ect or y
Especifica si se restaura los valores del cuadro de diálogo
antes de cerrarlo.
bool ShowHel p
Indica si se despliega el botón Hel p en el cuadro de
diálogo.
st r i ng Ti t l e
Título del cuadro de diálogo.
Eventos
Cancel Event handl er Fi l eOk
Ocurre cuando el usuario pulsa el botón Abr i r o
Guar dar del cuadro de diálogo.
Las clases OpenFileDialog y SaveFileDialog
El objetivo final de estos controles es proporcionar el nombre de un fichero de forma
segura y visual. El nombre del archivo viene especificado en la propiedad Fi l eName del
diálogo.
Representan dos cuadros de diálogo que presentan en pantalla controles que permiten
seleccionar un fichero, abrirlo o salvarlo chequeando si el fichero existe o no. La
propiedad ShowReadOnl y determina si aparece un CheckBox en el cuadro para indicar
la opción de sólo lectura. La propiedad ReadOnl yChecked indica el estado del
CheckBox de sólo lectura.
Ambas clases tienen miembros muy parecidos, por lo que se estudiarán juntas. La
mayor parte de la funcionalidad de estas clases la proporciona la clase Fi l eDi al og. A
continuación se estudian los miembros de Fi l eDi al og.
Propiedades
bool Mul t i sel ect
Indica si puede hacerse una selección múltiple o no.
bool ReadOnl yChecked
Indica si el CheckBox está seleccionado o no.
bool ShowReadOnl y
Indica si el cuadro de diálogo contiene una opción –un
CheckBox- de sólo lectura.
Métodos
St r eamOpenFi l e( )
Abre el fichero especificado en la propiedad Fi l eName
seleccionado por el usuario con permiso de sólo lectura.
Por ejemplo, éste podía ser un código para este control:
St r eammi St r eam;
OpenFi l eDi al og openDi al og = new OpenFi l eDi al og( ) ;

openDi al og. I ni t i al Di r ect or y = " c: \ \ " ;
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

22/27
openDi al og. Fi l t er = " t xt f i l es ( *. t xt ) | *. t xt | Al l f i l es ( *. *) | *. *"
;
openDi al og. Fi l t er I ndex = 2 ;
openDi al og. Rest or eDi r ect or y = t r ue ;

i f ( openDi al og. ShowDi al og( ) == Di al ogResul t . OK)
{
i f ( ( mi St r eam= openDi al og. OpenFi l e( ) ) ! = nul l )
{
/ / Códi go par a l eer el St r eam.
mi St r eam. Cl ose( ) ;
}
}

Las dos siguientes propiedades son específicas de la clase SaveFi l eDi al og.

bool Cr eat ePr ompt
Indica si el usuario puede crear un fichero que no existe.
bool Over wr i t ePr ompt
Indica si el cuadro de diálogo Guar dar como despliega un
aviso especificando el fichero que ya existe.


La clase ColorDialog
Esta clase se utiliza para seleccionar un color mediante un cuadro de diálogo. Su
aspecto es el de la figura 18.19.



Figura 18.19. Cuadro de dialogo Color
Propiedades.
bool Al l owFul l Open
Indica si el usuario puede utilizar el cuadro de diálogo para
definir colores personalizados.
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

23/27
bool AnyCol or
Indica si el cuadro de diálogo presenta todos los colores
disponibles del juego básico de colores.
Col or Col or
Color actual o color seleccionado por el usuario.
bool Cust omCol or s
Indica si se pueden definir colores personalizados.
bool Ful l Open
Indica si se enseña el cuadro de diálogo completo, es decir,
con la parte de los colores personalizados.
bool ShowHel p
Indica si hay botón de ayuda en el cuadro de diálogo.

La clase FontDialog
Esta clase se utiliza para la selección de una fuente. Su aspecto es el de la figura 20.



Figura 18.20. Cuadro de diálogo Fuente
Propiedades
Col or Col or
Indica el color de la fuente seleccionada.
Font Font
Indica la fuente actual o la fuente seleccionada por el usuario.
i nt MaxSi ze
Indica el valor de tamaño máximo de la fuente.
i nt Mi nSi ze
Idem, mínimo.
bool ShowAppl y
Indica si el cuadro de diálogo tiene botón Apl i car .
bool ShowCol or
Indica si el cuadro de diálogo proporciona la opción de color de la
letra.
bool ShowEf f ect s
Indica si el cuadro de diálogo contiene controles que permitan
especificar las características de tachado, subrayado y color del
texto.
bool ShowHel p
Indica si se presenta en el cuadro de diálogo un botón de ayuda.
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

24/27


Ejemplo: trabajando con cuadros de diálogo estándar y el control
RichTextBox: Un sencillo editor de textos.

A continuación se implementa un sencillo editor de textos con una serie de menús que
permite cambiar la fuente y el color, así como abrir y salvar ficheros de texto. Se utiliza
un control que no ha sido estudiado, Ri chText Box, que es una caja de texto
enriquecido. Dicho control tiene dos métodos para leer y guardar un fichero en formato
RTF o de texto La estructura de estos dos métodos es la siguiente:
publ i c voi d LoadFi l e( st r i ng nombr eDel Fi cher o) ;
publ i c voi d SaveFi l e( st r i ng nombr eDel Fi cher o) ;
El aspecto final de la aplicación es el de la figura 21.

Los pasos necesarios para implementar la aplicación son los siguientes:

a) Cree un nuevo proyecto y llámelo Pr oyect oDi al ogosEst andar .
b) Cambie el nombre del fichero For m1. cs a Pr ocesador DeText os. cs.
c) Cambie las siguientes propiedades del formulario:

Name: Pr ocesador DeText os
Text : Pr ocesador de Text os

Cambie la línea del método Mai n( )

Appl i cat i on. Run( new For m1( ) ) ;

por la línea:

Appl i cat i on. Run( new Pr ocesador DeText os( ) ) ;

OJ O con esto que puede ser sólo para la versión beta

d) Sitúe un control Ri chText Box en el formulario con las siguientes propiedades:
Name: t ext o
Text : ( Vací o)
Dock: Fi l l
Con esta última propiedad se asegura que siempre que se redimensione la
ventana del formulario también se redimensiona la superficie del control para ocupar
toda la superficie del formulario.

e) Añada un control Mai nMenu al formulario con las propiedades siguientes:
Name: menu
Opci ones de Menu:
Diseñe el menú con dos opciones principales, Ar chi vo y For mat o y en cada una
de ellas las siguienetes opciones de menú:

Menu Propiedades Propiedad Text
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

25/27
Archivo
mAr chi vo Ar chi vo
Nuevo
mNuevo Nuevo
Abrir
mAbr i r Abr i r
Guardar
mGuar dar Guar dar
- (Signo -)
mSepar ador -
Salir
mSal i r Sal i r
Formato
mFor mat o For mat o
Fuente
mFuent e Fuent e
Color de fondo
mCol or Fondo Col or de f ondo


f) Añada los cuatro controles siguientes con las propiedades que se indican:

• OpenFi l eDi al og

Name: dl gAbr i r
Fi l t er : Document os de t ext ( *. t xt ) | *. t xt | Todos ( *. *) | *. *
Def aul t Ext : t xt
ShowHel p: Tr ue
ShowReadOnl y: Fal se
Ti t l e: Di ál ogo Abr i r f i cher o

• SaveFi l eDi al og

Name: dl gGuar dar
AddExt ensi on: t r ue
Fi l t er : Document os de t ext ( *. t xt ) | *. t xt | Todos ( *. *) | *. *
Fi l eName: doc1
Def aul t Ext : t xt
Rest or eDi r ect or y: Fal se
ShowHel p: Tr ue
Ti t l e: Di ál ogo Guar dar f i cher o


• Col or Di al og

Name: dl gCol or
Al l owFul l Open: Tr ue
Ful l Open: Fal se
ShowHel p: Tr ue
Sol i dCol or Onl y: Fal se


• Font Di al og

Name: dl gFuent e
ShowAppl y: Tr ue
ShowCol or : Tr ue
ShowEf f ect s: Tr ue
ShowHel p: Tr ue

Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

26/27


Figura 18.21. Editor de textos

g) Cree un miembro privado, denominado nombr eFi cher o de tipo st r i ng, e
inícielo en el constructor del formulario de la siguiente manera:

/ / mi embr o
pr i vat e st r i ng nombr eFi cher o;
/ / const r uct or
publ i c Pr ocesador DeText os( )
{
I ni t i al i zeComponent ( ) ;
nombr eFi cher o=" Si nt i t ul o" ;
t hi s. Text =nombr eFi cher o;
}

h) Escriba, para cada una de las opciones de menú, el siguiente código:


Menú Nuevo:

pr i vat e voi d mNuevo_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
nombr eFi cher o=" Si nt i t ul o" ;
t ext o. Cl ear ( ) ;
t hi s. Text =nombr eFi cher o;
}

Menú Abr i r :

pr i vat e voi d mAbr i r _Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
i f ( dl gAbr i r . ShowDi al og( ) == Di al ogResul t . OK) {
nombr eFi cher o=dl gAbr i r . Fi l eName;
t ext o. LoadFi l e( nombr eFi cher o) ;
t hi s. Text =nombr eFi cher o;
}
}

Menú Guar dar

pr i vat e voi d mGuar dar _Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
i f ( dl gGuar dar . ShowDi al og( ) == Di al ogResul t . OK)
Marco Besteiro y Miguel Rodríguez Cuadros de Diálogo

27/27
{
nombr eFi cher o=dl gAbr i r . Fi l eName;
t ext o. SaveFi l e( nombr eFi cher o) ;
t hi s. Text =nombr eFi cher o;
}
}

Menú Sal i r

pr i vat e voi d mSal i r _Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
Appl i cat i on. Exi t ( ) ;
}

Menú Fuent e

pr i vat e voi d mFuent e_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
i f ( dl gFuent e. ShowDi al og( ) == Di al ogResul t . OK)
{
t ext o. Font =dl gFuent e. Font ;
t ext o. For eCol or =dl gFuent e. Col or ;
}
}

Menú Col or de Fondo:

pr i vat e voi d mCol or Fondo_Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
i f ( dl gCol or . ShowDi al og( ) == Di al ogResul t . OK)
t ext o. BackCol or =dl gCol or . Col or ;

}

Guarde, compile y ejecute la aplicación. Compruebe las distintas posibilidades del
programa. Observe que en el título de la aplicación se escribe el nombre completo
del fichero (Figura 18.21).


Sign up to vote on this title
UsefulNot useful