scieee AI-readable full text Open interactive document viewer

Scripting en Rational Rose (LSI-2000-01) : Versión Borrador

Martín Díaz, Octavio

Full text

Scripting en Rational Rose (Version b orrador) Octavio Martn Daz Dpto. de Lengua jes y Sistemas Informaticos Facultad de Informatica y Estadstica, Universidad de Sevilla Avda. de la Reina Mercedes s/n, Sevilla 41.012 Tel/Fax: 95.455.71.39, e-mail: octa[email protected] 26 de Enero de 2.000 Captulo 1 Intro duccion El presente manual se ha realizado a partir de la ayuda ofrecida p or Rational Rose 98 . 1.1 Extensibilidad de Rational Rose Rational Rose p ermite la p osibilidad de extender y p ersonalizar su funcionalidad a aquellas necesidades de desarrollo de software esp eccas para un proyecto determinado. Son entre otras:  Automatizar las acciones del usuario en el entorno de Rational Rose con scripts (p or ejemplo, creacion de diagramas y clases, mo dicaciones del mo delo, generacion de do cumentos y otras).  Ejecutar las funciones de Rose desde otras aplicaciones mediante la automatizacion OLE .  Acceder a las clases, propiedades y meto dos de un mo delo de Rose desde un entorno de desarrollo de softw are mediante la inclusion de la librera de extension de tip os.  Personalizar los men us de la aplicacion.  Utilizar el administrador de anexos ( Add{ins ). 1.1.1 Scripting El lengua je de scripting de Rational Rose es una version ampliada del lengua je Summit BasicScript . Las extensiones realizadas a este lengua je permiten automatizar las acciones del usuario en el entorno de la aplicacion yen algunos casos realizar funciones que no estan disp onibles directamente a traves del interfaz de usuario. 1.1.2 Automatizacion OLE La automatizacion OLE p ermite la integracion de otras aplicaciones con Rational Rose de dos formas:  Utilizando R ose como un controlador de la automatizacion: un ob jeto OLE puede ser llamado desde un script . Por ejemplo: un script puede ejecutar funciones en aplicaciones tales como Word o Visual Basic . 1 Script de Rose Elementos del Modelo Diagramas Interfaz de Extensión de Rose (REI) Aplicación Rose Automatización de Rose Figura 1.1: El diagrama de comp onentes de Rational Rose .  Utilizando Rose como un servidor de automatizacion: el ob jeto OLE de la aplicacion puede ser llamado desde otras aplicaciones que act uen como un controlador OLE . Por ejemplo: Visual Basic , Excel , Summit BasicScript , Softbridge Basic Language , C++ yotros. 1.1.3 El mo delo de comp onentes de Rational Rose La aplicacion Rational Rose esta basada en comp onentes y esta enfo cada hacia el desarrollo de software basado en comp onentes. To da la funcionalidad de la aplicacion es accesible a traves del Mo delo del Interfaz de Extension de Rose ( REI ) que esencialmente es un metamo delo de un mo delo de Rose que exp one los paquetes, clases, propiedades y meto dos que denen y controlan la aplicacion y to das sus funciones. La comunicacion con este interfaz se realiza a traves de scripts o de la automatizacion OLE . La librera de extension de tip os RationalRose.tlb p ermite acceder al interfaz REI desde un entorno de programacion. El diagrama de la gura 1.1 muestra los comp onentes del nucleo de Rational Rose , los comp onentes del interfaz REI y las relaciones entre ellos:  Interfaz de extension El conjunto com un de interfaces utilizados por un script o una automatizacion OLE para acceder a Rational Rose . A su vez se sub dividen en tres interfaces muy imp ortantes: { Aplicacion Rose Los ob jetos de extension que forman el interfaz a las funciones de la aplicacion. { Diagramas Los ob jetos de extension que forman el interfaz a los diagramas y vistas. { Elementos del modelo Los ob jetos de extension que forman el interfaz a los elementos de un mo delo.  Scripting El conjunto de scripts que incrementan la funcionalidad de Rational Rose .  Automatizacion El conjunto de ob jetos de automatizacion que p ermiten a Rational Rose funcionar como un controlador o un servidor OLE . 2 1.1.4 Personalizacion de los men us los men us de la aplicacion se pueden extender o adaptar mo dicando el chero de men us ( Rose.mnu ) que Rose lee al inicio de su ejecucion. Se p ermiten a ~nadir:  Submen us.  Op ciones de men u que ejecuten: { Primitivas de Rose . { Scripts . { Comandos de sistema. { Programas externos.  Separadores de men us. 1.1.5 Administrador de anexos ( add{ins ) El administrador de anexos de Rational Rose ofrece algunas facilidades para instalar nuevos pro ductos y extensiones en el entorno de la aplicacion. 1.2 Creacion y mo dicacion de scripts Para crear un nuevo script se realizan los siguientes pasos: 1. Seleccionar Tools/New Script del men ude R ose . 2. Escribir el texto del script . 3. Seleccionar File/Save As del men u para salvar el nuevo script . Y para mo dicar un script ya existente: 1. Seleccionar Tools/Open Script del men ude Rose . 2. Seleccionar alguno de los scripts disp onibles. 3. Pulsar Ok para entrar en el editor de scripts y visualizarlo. 4. Seleccionar el texto del script y copiarlo al p ortapap eles. 5. Seleccionar Tools/New Script . 6. Pegar el contenido del p ortapap eles en el nuevo script . 7. Seleccionar File/Save As para salvar el nuevo script . 3 1.3 Asp ectos basicos del lengua je de scripts 1.3.1 Inicio y nalizacion de scripts Al igual que en muchos otros lengua jes, la ejecucion del script comienza en la subrutina M ain . Por lo tanto, to do script deb e tenerla denida. Cuando la ejecucion llega al End Sub corresp ondiente a la subrutina M ain esta se termina. El siguiente ejemplo muestra la denicion habitual de M ain : Sub Main() MsgBox ``Esta es la subrutina Main().'' End Sub La sentencia End naliza de manera forzada la ejecucion del script , cerrando to dos los cheros abiertos. Este segundo ejemplo adelanta la nalizacion del script con la sentencia End : Sub Main() MsgBox "La proxima lnea terminaralaejecucion del script." End End Sub 1.3.2 Los comentarios En el siguiente ejemplo se pueden observar varias formas de intro ducir comentariosenelcodigo de un script : MsgBo x ``Hola'' 'Visualiza un mensa je. REM Esto es un comentario. MsgBox ``Antes del comentario'' /* Este parrafo esta to do comentado. Esta lnea tambien sera ignorada. Esta es la ultima lnea del comentario. */ MsgBox ``Despues del comentario'' 1.3.3 Un asp ecto sintactico El caracter de continuacion de lnea ( ) p ermite dividir una sentencia compleja en varias lneas. 4 Captulo 2 Intro duccion al lengua je Summit BasicScript Como se ha dicho anteriormente, el lengua je de scripting de Rational Rose esta basado en una version de Basic ,por lo que su aprendiza je resulta sencillo. A continuacion se describ en las principales caractersticas del lengua je y que se p o dran utilizar cuando se escriba un script para Rational Rose . 2.1 Tip os de datos simples En primer lugar se muestran los principales tip os que ofrece el lengua je. 2.1.1 Tip os logicos Bo olean Este tip o de datos representa a los valores logicos True y False . Por defecto, una v ariable b o oleana tendraelvalor False . 2.1.2 Tip os numericos Integer (%) Este tip o de datos representa a los numeros enteros de hasta cuatro dgito de precision en el siguiente rango: ; 32768  integ er  32767 Long (&) Este tip o de datos representa a los n umeros enteros largos de hasta 10 dgitos de precision en el siguiente rango: ; 2  147  483  648  Long  2  147  483  647 5 Currency (@) Este tip o de datos representa a los n umeros en punto{jo con 15 dgitos a la izquierda del punto decimal y cuatro a la derecha, por lo que son utiles para calculos monetarios. El rango es el siguiente: ; 922  337  203  685  477 : 5808  currency  922  337  203  685  477 : 5807 Single (!) Este tip o de datos representa a los numeros reales con 7 dgitos de precision en los siguientes rangos: ; 3 : 402823 E 38  sing l e ; 1 : 401298 E ; 45 1 : 401298 E ; 45  sing l e  3 : 402823 E 38 Double (#) Este tip o de datos representa a los n umeros reales con 15{16 dgitos de precision en los siguientes rangos: ; 1 : 797693134862315 E 308  doubl e ; 4 : 94066 E ; 324 4 : 94066 E ; 324  doubl e  1 : 797693134862315 E 308 2.1.3 Tip os de cadenas de caracteres String ($) Este tip o de datos representa a las cadenas de caracteres. Cada caracter tiene un valor entre 0 y255 (el habitual codigo ASCI I )yla longitud maxima de una cadena es de 32767 caracteres. Al contrario que en otros lengua jes, las cadenas pueden contener nulos, como se muestra en el siguiente ejemplo: s$ = ``<''+``Hola''+Chr$(0)+``!'' 'Esta cadena incluyeuncaracter nulo. La funci on Len devuelveelnumero de caracteres de la cadena (incluyendo los caracteres no imprimibles). Normalmente una cadena se declara con longitud variable (la memoria requerida para su almacenamiento dep endera de su longitud). Las variables cadena no asignadas tienen por defecto una longitud 0. Tambien se pueden declarar con un tama ~no jo (mas apropiadas para el paso de estructuras con tama ~no jo a rutinas externas). Por ejemplo: Dim s As String s = ``Hola'' 'Esta cadena tiene longitud 4. Dim s As String * 20 s = ``Hola'' 'Esta cadena tiene longitud 20 (el espacio sobrante es rellenado con espacios). 6 Al asignar una expresion (de tip o cadena) a una variable (tambien de tip o cadena) se aplican las siguientes reglas:  Se rellena con espacios hasta alcanzar la longitud de la cadena (en caso de que fuera menor).  Se trunca a la longitud de la cadena (en caso de que sea mayor). 2.1.4 Tip os de fechas y horas Date Este tip o de datos representa a las fechas y horas de manera conjunta. Su rango es el siguiente: J anuar y 1  100 00 : 00 : 00  date  December 31  9999 23:59:59 ; 6574340  date  2958465 : 99998843 En el formato numerico, la parte entera almacena el n umero de das desde el 31{Dic{1899 , y la parte fraccional el n umero de segundos transcurridos del da. El valor p or defecto es 0. Por ejemplo: Dim d As Date d=#January 1, 1990# Para evitar ambig "uedades debidas a los div ersos formatos utilizados en distintos paises se recomienda la utilizacion del formato de fecha universal: VariableFecha = #YY/MM/DD HH:MM:SS# 2.1.5 Tip os variantes Variant Es el tip o p or defecto en BasicScript y se utiliza para declarar variables que puedan contener datos de diferentes tip os. Durante la existencia de un Variant su tip o puede cambiar entre: Numericos I nteg er , Long , S ing l e , Double , B ool ean , C urrency . Logico B ool ean . Temp oral D ate . Cadena String . Ob jecto O bj ect . Dato invalido Un Variant con datos invalidos se considera nulo ( Null ). Dato sin iniciar Un V ar iant sin inicializar se considera vaco ( Empty ). Las siguientes funciones se utilizan para determinar el tip o del dato contenido: 7 VarTyp e Devuelve una constante que representa al tip o. IsNumeric Devuelve True si el tip o es numerico, una cadena que contiene un numero o un ob jecto cuya propiedad p or defecto sea numerica. IsDate Devuelve True si contiene una fecha, una cadena convertible a fecha o un ob jecto cuya propiedad p or defecto sea una fecha. IsOb ject Devuelve True si contiene un ob jeto. IsNull Devuelve True si no contiene un dato valido. IsEmpty Devuelve True si no esta inicializado. Asignacion a una variable de tipo variante Inicialmente se le considera vaco ( V arT ype devolvera ebE mpty ). Si no esta inicializado devolvera 0 en las expresiones numericas o una cadena de longitud cero en una expresion de cadenas. Si se quiere dar un valor nulo a un V ar iant que yaesta inicializado hay que asignarle otro V ar iant que estevaco. Cuando se le asigna un valor tambien se le asigna un tip o y p or lo tanto en to das las op eraciones p osteriores se comp ortara como cualquier variable de ese tip o. Operaciones sobre variables de tipo variante Normalmente, un V ar iant se comp ortara seg un el tip o de datos que contenga. La unica excep cion es la promo cion automatica de los tip os numericos en caso de salidas de rangos. Por ejemplo: Dim a As Integer, b As Integer, c As Integer Dim x As Variant, y As Variant, z As Variant a% = 32767 b% = 1 c% = a% + b% 'Esta op eracion se saldra de rango x = 32767 y=1 z=x+y 'z se convierte a Long p orque la suma esta fuera del rango entero Sumas con variables de tipo variante Seg un el contenido de un V ar iant el op erador \+" puede realizar una de dos funciones: concatenar cadenas o sumar n umeros. Debido a que el tip o no es cono cido hasta el momento de la ejecucion se pueden realizar op eraciones erroneas. Se recomienda utilizar el op erador \&" para concatenar dos V ar iant que contengan cadenas. Variables de tipo variante sin contenido Una variable V ar iant puede tener asignado un valor esp ecial que indica que no contiene dato valido ( Null ). El valor Null se puede utilizar para buscar errores p orque este valor se propaga a tra ves de las expresiones. Por ejemplo: Dim a As Variant a=Null Desventajas de los tipos variantes 1. La evolucion del programa es mas lenta comparada con los tip os fundamentales p orque cada op eracion implica el examen del tip o contenido. 8 MyApp.To olbar.Buttons(0) MyApp.To olbar.Buttons(``Tuesday'') Cada elemento de una coleccion es en s mismo un ob jeto. Por ejemplo: Dim MyTo olbarButton As Ob ject Set MyTo olbarButton = MyApp.To olbar.Buttons(``Save'') MyAppp.To olbar.Buttons(1).Caption = ``Op en'' Una coleccion tiene propiedades para obtener informacion sobre ella y meto dos que p ermiten la navegacion p or sus miembros. Por ejemplo: Dim MyTo olbarButton As Ob ject NumButtons% = MyApp.To olbar.Buttons.Count MyApp.To olbar.Buttons.MoveNext MyApp.To olbar.Buttons.FindNext ``Save'' For i = 1 To MyApp.To olbar.Buttons.Count Set MyTo olbarButton = MyApp.To olbar.Buttons(i) MyTo olbarButton.Caption = ``Copy'' Next i Propiedades de una coleccion Count es la unica propiedad aplicable a las colecciones. Es el n umero de ob jetos contenidos en la coleccion que p ermite la utilizacion de un contador para recorrer la coleccion mediante una iteracion. Meto dos de las colecciones A contin uacion se describ en los meto dos de una coleccion, que p ermiten la lo calizacion y pro cesamiento de elementos en ella. Aunque to das las propiedades y meto dos sean los mismos, act uan sobre tip os diferentes de ob jetos seg un el tip o de ob jeto contenido. Por ejemplo, el meto do C l assC oll ection:GetAt obtiene una ob jeto \clase", y el meto do C ateg or y C oll ection:GetAt obtiene un ob jeto \categora", etc. Estos meto dos son: Exists Indica si un ob jeto existe en una coleccion. FindFirst Obtiene el ndice (p osicion) de la primera instancia de un ob jeto en una coleccion. FindNext Obtiene el ndice (p osicion) de la siguiente instancia de un ob jeto en una coleccion. GetWithUniqueID Obtiene la instancia de un ob jeto en una coleccion, dado su identicador ID unico, excepto para aquellos tip os de ob jetos que no tienen ID unico (como los ob jetos E xter nal D ocument o P r oper ty ). GetAt Obtiene una instancia esp ecca de un ob jeto en una coleccion. GetFirst Obtiene la primera instancia de un ob jeto en una coleccion. GetOb ject Obtiene el interfaz OLE aso ciado con una coleccion dada. IndexOf Obtiene el ndice (p osicion) de un ob jeto en una coleccion dada. 15 Meto dos para las colecciones denidas por el usuario Acontinuacion se describ en cuatro meto dos de colecciones adicionales, que p ermiten a~nadir o quitar ob jetos de una coleccion. Sin embargo, estos meto dos solo son validos para aquellas colecciones denidas p or el usuario y no pueden ser utilizadas en las colecciones corresp ondientes de un mo delo de Rational Rose . Add A~nade un ob jeto a la coleccion de ob jetos. AddCollection A~nade una coleccion a una coleccion de ob jetos. Remove Elimina una coleccion de una coleccion de ob jetos. RemoveAll Elimina el contenido completo de una coleccion. 2.3 Constantes, variables y expresiones 2.3.1 Denicion de constantes Se puede declarar una constante para ser utilizada en el script .En el momento de la declaracion, p o dra asignarse una expresion formada por literales y otras constantes (no se permiten las llamadas a funcion, excepto Chr $). Por ejemplo: Const s$ = ``Hola'' + Chr(44) Const a% = 5 'Constante entera cuyovalor es 5 Const b# = 5 'Constante real doble cuyovalor es 5.0 Const c$ = ``5'' 'Constante cadena cuyovalor es ``5'' Const d! = 5 'Constante real simple cuyovalor es 5.0 Const e& = 5 'Constante entera larga cuyovalor es 5 Const a As Integer = 5 'Constante entera cuyovalor es 5 ConstbAsDouble=5 'Constante real doble cuyovalor es 5.0 Const c As String = ``5'' 'Constante cadena cuyovalor es ``5'' Const d As Single = 5 'Constante real simple cuyovalor es 5.0 Const e As Long = 5 'Constante entera larga cuyovalor es 5 Const a = 5 'Constante entera Const b = 5.5 'Constante real simple Const c = 5.5E200 'Constante real doble Const FichDef = ``Defecto.txt'' Sub Test1 Const FichDef = ``Fichero.txt'' MsgBox FichDef 'Visualiza ``Fic hero.txt''. End Sub Sub Test2 MsgBox FichDef 'Visualiza ``Defecto.txt''. End Sub 16 En el siguiente ejemplo se muestran las constantes declaradas en una ventana de mensa je ( cr l f pro duce un salto de lnea en la ventana): Const crlf = Chr$(13) + Chr$(10) Const s As String = ``Esto es una constante.'' Sub Main() MsgBox s$ & crlf & ``Las constantes se muestran arriba.'' End Sub 2.3.2 Declaracion de variables La sentencia Dim La sentencia Dim declara una lista de variables lo cales con sus corresp ondientes tip os y tama ~nos. Su sintaxis es: Dim Name &( < S ubscr ipts > )] &As &New] Type ] &,Name &( < S ubscr ipts > )] &As &New] Type ]] ::: Una alternativa a Dim es el caracter de declaracion de tipos . Por ejemplo, las siguientes declaraciones son equivalentes: Dim Temp eratura As Integer Dim Temp eratura% El parametro S ubscr ipts p ermite la declaracion de arrays dinamicos y jos (si se expresan los lmites sup eriores e inferiores hasta 60 dimensiones) siguiendo la siguiente sintaxis: & Low er To] U pper &,& Low er To] U pper ]... El parametro Type esp ecica el tip o del dato que se declara y puede ser: String , I nteg er , Long , Single , Double , C urrency , Obj ect ,ob jectos de datos o tip os de datos (del sistema o denidos p or el usuario). Una sentencia Dim dentro de una subrutina o funcion declara variables lo cales a ella. Si aparece fuera, entonces su alcance es global y equivalente al de las variables declaradas con la sentencia P r iv ate . Cadenas de longitud ja Se declaran a ~nadiendo la longitud a la declaracion del tip o S tr ing : Dim nombre variable As String * longitud cadena Declaracion de variables implcitas Cuando BasicScript encuentra una variable no declarada con Dim ,entonces su tip o sera el esp ecicado p or el caracter de declaracion de tip os. Si no lo tiene, entonces la primera letra del nombre de la variable es buscado en las sentencias Def T ype para asignarle un tip o p or defecto. Si a un astodava no se ha encontrado un tip o para la variable, entonces seraun V ar iant . Declaracion de objetos de automatizacion OLE 17 Se pueden declarar variables de un tip o de ob jeto explcito para ob jetos cono cidos por BasicScript a traves de las libreras de tip os. Se sigue la siguiente sintaxis: Dim N ombr eV ar iabl e As Appl ication:C l ass El parametro Appl ication esp ecica la aplicacion utilizada para registrar el ob jeto de automatizacion OLE yelparametro C l ass esp ecica el tip o de ob jeto denido en la librera de tip o. De esta manera se esta utilizando el enlace estatico en tiemp o de compilacion y mejorando el rendimiento de la invo cacion a sus meto dos. Creacion de nuevos objetos La palabra clave op cional New se utiliza para declarar una nueva instancia del ob jeto de datos esp ecicado y no se puede utilizar cuando se declaran arrays u ob jetos de automatizacion OLE . En tiemp o de ejecucion, se noticara a la aplicacion que se esta deniendo un n uevoob jeto: la aplicacion resp ondera mediante la creacion de un nuevo ob jeto fsico (dentro del contexto apropiado) y devolverauna referencia al mismo, que se asignara inmediatamente a la variable que se esta declarando. Cuando se acab e el ambito de la variable entonces se noticara a la aplicacion para que esta destruya ese ob jeto fsico. Convenciones para los nombres de variables Los nombres de variables deb en seguir las siguientes reglas: 1. Deb en comenzar con una letra. 2. Pueden contener letras, dgitos y el caracter de subrayado ( ). Las puntuaciones no se p ermiten. El signo de exclamacion (!) se permite, pero si esta en la ultima p osicion se interpretara como un caracter de declaracion de tip os. 3. El ultimo caracter del nombre puede ser un caracter de declaracion de tip o: #, @, %, !, &y$. 4. No deb en exceder los 80 caracteres de longitud. 5. No pueden contener palabras reservadas. Ejemplos Los siguientes ejemplos utilizan la sentencia Dim para declarar variables tipadas: Sub Main() Dim i As Integer Dim l& 'Entero largo Dim s As Single Dim d# 'Real doble Dim c$ 'Cadena Dim MyArray(10) As Integer 'Arrayde10enteros Dim MyStrings$(2,10) 'Array de bidimensional de cadenas Dim Filenames$(5 to 10) 'Arrayde6cadenas(numeradas de 5 a 10) Dim Values(1 to 10, 100 to 200) 'Arraydevariantes bidimensional End Sub 18 La sentencia Public Declara una lista de variables p ublicas, es decir, variables que son globales para to das las subrutinas y funciones de to dos los scripts . La sintaxis que se sigue es: Public N ame &( S ubscr ipts )] &As Type ]&, Name &( S ubscr ipts )] &As Type ]]... Cuando no se esp ecica otra cosa, cualquier variable se declara implcitamente lo cal a la rutina que la utiliza. La sentencia Gl obal tiene el mismo signicado que Public . Cuando se utilizan variables compartidas, se deb e asegurar que las declaraciones son identicas en to dos los scripts . El siguiente ejemplo utiliza una subrutina para calcular el area de 10 crculos y visualiza el resultado en una ventana. Las variables R y Ar son declaradas como p ublicas para que puedan utilizarse tanto en Main como en Ar ea . Const crlf = Chr$(13) + Chr$(10) Public x#, ar# Sub Area() ar# = (x# ^ 2) * Pi End Sub Sub Main() msg = ``Las areas de los diez crculos son:'' & crlf For x# = 1 To10 Area msg = msg & x# & ``: '' & ar# & Basic.Eoln$ Next x# MsgBo x msg End Sub La sentencia Private Declara una lista de variables privadas, es decir, variables que son globales para to das las subrutinas y funciones que se ejecuten en el script actual. La sintaxis que se sigue es: Private Name &( S ubscr ipts )] &As Type ]&, N ame &( S ubscr ipts )] &As Type ]]... La sentencia Redim Se utiliza para volver a declarar un array, mediante la esp ecicacion de un lmite inferior y otro sup erior para cada dimension del array. La sintaxis de esta sentencia es: Redim &Preserve] VariableName (& S ubscr iptRang e ]) &As Type ], ::: Si la variable ya estaba anteriormente denida, entonces deb e hab erse declarado previamente mediante la sentencia Dim como un array dinamico (sin esp ecicar dimensiones). Estos arrays 19 pueden ser re{dimensionados cualquier n umero de veces. El parametro S ubscr iptRang e esp ecica las nuevas dimensiones, y cuando no se esp ecican, se considera que el array no tendra elementos. Por defecto, el lmite inferior es cero, aunque dep ende de la sentencia O ption B ase . Se sigue la sintaxis: & Low er To] U pper &,& Low er To] U pper ] ::: Las dimensiones del nuevoarray deb en estar en el siguiente rango, generandose un error en caso de que no se cumplan: ; 32768  Low er  Upper  32767 El parametro Type puede utilizarse para esp ecicar el tip o de cada elemento del array. Estos estan restringidos a cualquier tip o de datos fundamental, tip os de datos denidos p or el usuario o ob jetos. La redimension del arrayborra to dos los elementos al menos que no se utilice la palabra clave P r eser v e .En este caso, los datos del arraysemantienen si ello es p osible. Si el n umero de elementos se incrementa, los nuevos elementos se inicializan a cero o cadena vaca. Si el nuevo tama ~no es inferior, los elementos sobrantes seran b orrados. Cuando se indica P r eser v e ,elnuevo numero de dimensiones deb era ser cero o el mismo n umero que ya tena. El siguiente ejemplo utiliza la sentencia F il eList para redimensionar un array y rellenarlo con cadenas de nombres de cheros. Un nuevoarray es entonces redimensionado para guardar tantos elementos encontrados p or F il eList , copiando el array y visualizandolo parcialmente: Sub Main() Dim *$() FileList *$,``*.*'' contador = Ub ound(*$) Redim nl$(Lb ound(*$) To Ub ound(*$)) For x = 1 to contador nl$(x) = *(x) Next x MsgBox ``El ultimo elemento del nuev o arrayes: ''&nl$(contador) End Sub 2.3.3 Expresiones Como en cualquier lengua je, Las expresiones estan compuestas p or op eradores y op erandos. BasicScript p ermite utilizar variables, llamadas a funciones, constantes y literales con diferentes tip os de datos en las expresiones. Cuando esto o curre, los dos argumentos se convierten al tip o del op erando con mayor precision. Si una op eracion se realiza entre una expresion numerica y otra textual, entonceslaultima se convierte a una expresion numerica. Cuando una variable de tip o ob jeto es utilizada con op eradores numericos tales como la suma o la resta, se utiliza automaticamente la propiedad por defecto del objeto . En el siguiente ejemplo, las dos op eraciones p osteriores a la declaracion del ob jeto son equivalentes p orque la 20 propiedad p or defecto de un ob jeto de la clase Excel es :V al ue : Dim Excel As Ob ject Set Excel = GetOb ject(,``Excel.Application'') MsgBox ``Esta aplicacion es '' & Excel MsgBox ``Esta aplicacion es '' & Excel.Value Op eradores A continuacion se denen los op eradores existentes en BasicScript .Hay que recordar que seg un los tip os de los op erandos variara el resultado de la op eracion. Concatenacion de cadenas & Division entera n Suma, resta, multiplicacion y division +, ; ,  , = Potencia ^ Comparaciones < ,  , > ,  ,=, <> Conjuncion logica o binaria And Equivalencia logica o binaria Eqv (devuelve True si amb os op erandos tienen el mismo valor logico) Implicaci on logica o binaria Imp (devuelve True si el segundo op erando es True ) Identicacion de clase Is (devuelve True si las dos variables ob jetos que son op erandos hacen referencia al mismo ob jeto. Esta comparacion puede realizarse con Nothing para determinar si la variable ob jeto esta sin inicializar) Comparacion con patrones Lik e Resto de una division Mod Negacion logica o binaria Not Disyuncion logica o binaria Or Exclusion logica o binaria Xor (devuelve True si amb os op erandos tienen distintos valores logicos) Precedencia de op eradores A continuacion se muestra la precedencia entre op eradores en BasicScript (de mayor a menor precedencia). A igual precedencia, se eval uan de izquierda a derecha. Par entesis () Exp onenciacion ^ Menos unario ; 21 Division y multiplicacion =  Division entera n Modulo Mod Suma y resta + ; Concatenacion de cadenas & Comparativas = <>><< = > = Comparacion de cadenas y ob jetos Lik e I s Negacion logica Not Conjuncion logica o binaria And Disjuncion logica o binaria Or Op eradores logicos o binarios Xor Eqv Imp Precision de los op erandos BasicScript realiza la conversion de tip os automaticamente, pero algunas veces esto puede o casionar alg un error de rango. Por ejemplo, cuando los valores de punto *otante se convierten aenteros, la parte fraccional se pierde, redondeando al entero m as cercano utilizando el redondeo de Baker:  Si la parte fraccional es mayor que : 5, el n umero es redondeado hacia arriba.  Si la parte fraccional es menor que : 5, el n umero es redondeado hacia aba jo.  Si la parte fraccional es igual a : 5, el numero es redondeado hacia arriba si es impar y hacia aba jo si es par. Cuando se utilizan op eradores numericos, binarios, logicos o comparativos, el tip o de dato del resultado es generalmente el mismo del tip o de datos del op erando mas preciso. Por ejemplo, al sumar un entero y un entero largo, primero se convierte el entero a un entero largo, y despues se realiza la suma, saliendose de rango solo cuando el resultado no puede contenerse en un entero largo. El orden de precision se muestra en la siguiente lista (de menor a mayor precision):  E mpty  B ool ean  Integer  Long  Single  Date  Double  C ur r ency 22 Hay algunas excep ciones con algunos op eradores. Las reglas para la conversion de op erandos son mas complicadas cuando alg un op erando es de tip o Variant . En muchos casos, un valor fuera de rango causa la promo cion automatica del resultado al siguiente tip o de datos mas preciso. Literales Los literales son valores con un tip o esp ecco implcito que se pueden utilizar en las expresiones. Algunos ejemplos de literales son:  10  43265  5#  5 : 5  5 : 4 E 100  & HF F  & O 47  & HF F #  \Hola"  \\Hola""  #1 = 1 = 1994# 2.4 Funciones y subrutinas 2.4.1 Declaracion de prototip os de subrutinas La sentencia D ecl ar e crea el prototip o de una rutina externa o una rutina de BasicScript que se denira p osteriormente en el modulo fuente oen otro modulo. La sentencia D ecl ar e deb e aparecer en el exterior de cualquier declaracion Sub o F unction y el prototip o declarado solo seravalido en aquel script donde aparezca. Sigue la siguiente sintaxis: Declare f Sub j Function g N ame & T y peC har ] &CDecl j Pascal j System j StdCall] &Lib ``LibName$'' &Alias ``AliasName$'']] &(& P ar ameter List ])] &As Type ] P ar ameter List es la lista de parametros (hasta 30) de la rutina y cada uno de ellos tiene la siguiente sintaxis: &Optional] &ByVal j ByRef ] P arameterN ame &()] &As P arameterT ype ] Los parametros que se utilizan son los siguientes:  Name Typ eChar] Nombre de la rutina. En las funciones, es op cional indicar el tip o de valor a devolver colo cando un caracter de declaracion de tip os (cualquiera de ellos excepto @ para el caso de funciones externas). 23  LibName$ Deb e ser esp ecicada si la rutina es externa para indicar el nombre de la librera o codigo fuente que la contiene y apareceraentre comillas. Pueden utilizarse alias en caso de con*ictos ( AliasName$ deb e aparecer entre comillas). Por ejemplo: { Declare Function GetCurrentTime Lib \user" () As Integer { Declare Function GetTime Lib \user" Alias \GetCurrentTime" As Integer  Typ e Indica el tip o a devolver. Para las funciones externas, los tip os validos son: I nteg er , Long , S tr ing , S ing l e , D oubl e , Date , B ool ean y ob jetos de datos. Por otro lado, los tip os C ur r ency y Variant , las cadenas de longitud variable, los arrays, los tip os denidos p or el usuario y los ob jetos de automatizacion OLE no pueden ser devueltos p or las funciones externas.  Optional Para indicar la op cionalidad de un parametro. To dos los parametros op cionales deb en ser de tip o V ar iant , y se declaran al nal de la lista de parametros.  ByVal Se pasara el parametro p or valor, p or lo que no p o dra ser mo dicados p or la rutina.  ByRef Se pasara el parametro por referencia, por lo que p o dra cambiarse. Por defecto, to dos los parametros se pasan p or referencia.  ParameterName Nombre del parametro, que deb e seguir las convenciones de nombres de BasicScript. \() 00 indica que el parametro es un array.  ParameterTyp e Esp ecica el tip o del parametro. La clausula As deb er ser incluida solo si el nombre del parametro no contiene un caracter de declaracion de tip o. Ademas de los tip os basicos, pueden esp ecicarse estructuras denidas p or el usuario, ob jetos de datos y ob jetos de automatizacion OLE . Para pasar parametros a rutinas externas, si el tip o de dato no es cono cido, se puede utilizar Any , forzando al compilador a rela jar el chequeo de tip o, p ermitiendo que cualquier tip o de datos pueda ser pasado en el lugar de dicho argumento. Por ejemplo: { Declare Sub Convertir Lib \MiLibreria" (a As Any) Paso de parametros Por defecto, el paso de parametros en BasicScript es por referencia. Muchas rutinas externas requieren un valor en lugar de una referencia y para ello esta ByV al . Por ejemplo, el pro cedimiento en C v oid M essag eB eep ( int ) deb era declararse as: Declare Sub MessageBeep Lib ``user'' (ByVal n As Integer) El siguiente pro cedimiento en C int S y stemP ar ameter sI nf o ( int int int  int ) es un ejemplo de paso de parametros p or referencia y se escribira as: Declare Function SystemParametersInfo Lib ``user'' (ByVal action As Integer, ByVal uParam As Integer, ByRef pInfo As Integer, ByVal up dateINI As Integer) As Integer Paso de cadenas Las cadenas pueden pasarse p or referencia oporvalor. Cuando se pasan p or referencia, lo que se pasa es un puntero a un puntero a una cadena al estilo C (terminada con nul l ) y la rutina externa puede cambiar el puntero o mo dicar el contenido de la cadena. Cuando se pasa por 24 Salida forzada de subrutinas La sentencia E xit S ub fuerza la salida de la subrutina actual, continuando la ejecucion por la sentencia que sigue a la llamada de la subrutina. Solo puede aparecer dentro del blo que de una subrutina. En el siguiente ejemplo la subrutina visualiza una ventana de dialogo y entonces naliza. La ultima lnea no deb era ser nunca ejecutada a causa de la sentencia Exit Sub . Sub Main() MsgBox ``Terminando M ain ().'' Exit Sub MsgBox ``Sigue to dava el Main ().'' End Sub 2.4.4 Algunos asp ectos del paso de parametros Dato fundamental a Variant Al pasar el dato p or referencia se previene que el V ar iant cambie su tip o dentro de la rutina. Por ejemplo: Sub Foo(v As Variant) v=50 'OK. v = ``Hola, mundo'' 'Aqu se pro duce un error de tip o. End Sub Sub Main() Dim i As Integer Foo i 'Pasa un entero p or referencia. End Sub Variant a dato fundamental Un Variant no puede pasarse a una rutina que acepte datos fundamentales p or referencia. Por ejemplo: Sub Foo(i as Integer)  End Sub Sub Main() Dim a As Variant Foo a 'Aqu el compilador da un error de tip o. End Sub Paso de estructuras Las UDT's pueden pasarse tanto a rutinas denidas por el usuario como a rutinas externas. Siempre se pasan p or referencia: la palabra clave ByV al no puede utilizarse cuando se denen argumentos de tip o estructura que se pasan a rutinas externas (mediante D ecl ar e ). ByV al solo 31 se p o dra utilizar con tip os de datos fundamentales. En realidad, cuando se pasa una estructura a una rutina externa solo se pasa un puntero lejano a la estructura de datos. Paso de arrays Los arrays siempre se pasan p or referencia. Por ejemplo: Dim a(10) As String FileList a 'Ambas llamadas estan bien. FileList a() Parametros nominales Muchos elementos del lengua je sop ortan los parametros nominales, que p ermiten la esp ecicacion de parametros en una funcion o subrutina mediante su nombre, en lugar del tradicional orden predeterminado. Algunos ejemplos de una llamada a MsgBox :  Nominal : { MsgBox Prompt:= \Hola mundo." { MsgBox Title:=\Ttulo", Prompt:=\Hola mundo" { MsgBox HelpFile:=\BASIC.HLP",Prompt:=\Hola mundo", HelpContext:=10  Posicional : { MsgBox \Hola mundo" { MsgBox \Hola mundo",,\Ttulo" { MsgBox \Hola mundo",,,\BASIC.HLP",10 De esta forma, el codigo es mas facil de leer y ademas se evita tener que cono cer el orden de los parametros, sobre to do si los parametros son muchos y/o op cionales. Se deb en seguir las siguientes reglas:  Los parametros nominales deb en utilizar el nombre del parametro esp ecicado en la descripcion de ese elemento del lengua je, de lo contrario habra un error de compilacion.  To dos los parametros (tanto nominales como op cionales) se separan p or comas.  El parametro nominal y su valor aso ciado se separan con \:=".  Si un parametro es nominal, to dos los parametros que le siguen tambien deb en serlo. Por ejemplo: MsgBox ``Hola mundo'', Title:=``Ttulo'' 'OK MsgBox Prompt:=``Hola mundo'',,``Ttulo'' 'MAL 32 2.5 Sentencias selectivas 2.5.1 La sentencia If...Then...Else Permite al ejecucion condicionada de una sentencia o grup o de sentencias. La sintaxis es: If C ondition Then S tatements &Else E l seS tatements ] Una segunda sintaxis a ~nade la clasula ElseIf : If C ondition Then & S tatements ] &ElseIf E l seC ondition Then & E l seI f S tatements ]] &Else & E l seS tatements ]] End If Los parametros son: Condition Cualquier expresion que resuelvaunvalor logico. Statements Una o mas sentencias separadas p or \+". Este grup o se ejecuta cuando la condicion es True . ElseStatements Una o mas sentencias separadas p or \+". Este grup o se ejecuta cuando to das las condiciones anteriores son False . ElseCondition Cualquier expresion que resuelvaunvalor logico. Se eval ua si to das las condiciones previas son False . Pueden aparecer cualquier n umero de clasulas ElseIf . ElseIfStatements Una o mas sen tencias separadas p or \+". Este grup o se ejecuta cuando su condicion es True . 2.5.2 La sentencia Select Case Es la sentencia de seleccion m ultiple, seg un el valor de una determinada expresion. Su sintaxis es la siguiente: Select Case T estE xpr ession &Case E xpr essionList & S tatementB l ock ]] &Case E xpr essionList & S tatementB l ock ]]  &Case Else & S tatementB l ock ]] End Select Esta sentencia tiene las siguientes partes: 33 TestExpression Una expresion numerica o de cadena. StatementBlo ck Un grup o de sentencias de BasicScript . Si T estE xpr ession se iguala con alguna de las expresiones contenidas en E xpr essionList ,entonces se ejecutara el blo que de sentencias. ExpressionList Una lista de expresiones (separadas por comas) que seran comparadas con T estE xpr ession . Se pueden utilizar rangos de expresiones m ultiples dentro de una clasula Case simple. Por ejemplo: Case 1 To 10,12,15, Is > 40 Solo se ejecutara el blo que que iguale primero la expresion. Si no se encuentra ninguno, entonces se ejecutara el blo que Case Else . El siguiente ejemplo utiliza la sentencia S el ect C ase para visualizar el sistema op erativo actual: Sub Main() OpSystem% = Basic.OS Select Case OpSystem% Case 0,2 s = ``Microsoft Windows'' Case3to8,12 s = ``UNIX'' Case 10 s = ``IBM OS/2'' Case Else s = ``Otro sistema'' End Select MsgBox ``Esta version de BasicScript esta ejecutandose sobre: '' & s End Sub 2.5.3 Funciones selectivas A continuacion se muestran tres funciones de muy alto nivel que p ermiten escribir sentencias selectivas en una sola lnea de codigo: Cho ose Recib e un ndice y hasta 13 expresiones como parametros y devuelve la expresion que se encuentra en la p osicion indicada. IIf Recib e una expresion logica y otras dos expresiones (partes cierta y falsa) y devolvera una u otra seg un la evaluacion de la expresion logica. Switch Recib e hasta siete pares condicion{expresion y devuelve la expresion que corresp onde a la primer condicion que sea True . 34 2.6 Sentencias iterativas 2.6.1 El bucle Do...Loop Se pueden utilizar hasta tres tip os de bucles: Do f While j Until g C ondition S tatements Lo op Do S tatements Lo op f While j Until g C ondition Do S tatements Lo op Como en cualquier otro lengua je, el blo que se repite mientras la condicion sea verdadera o hasta que la condicion sea verdadera. El bucle es innito cuando no se esp ecica la clausula de condicion. La condicion siempre sera cualquier expresion logica. Acontinuacion se muestran varios ejemplos. El primero de ellos utiliza la sentencia Do::: while que ejecuta el cuerp o de la iteracion primero y entonces chequea la condicion, repitiendolo si la condicion es cierta: Dim a$(100) i% = -1 Do i% = i% + 1 If i% = 0 Then a(i%) = Dir$(``*'') Else a(i%) = Dir$ End If Lo op While (a(i%) <> ``'' And i% < =99) r% = SelectBox(i% & `` cheros encontrados'',,a) El segundo ejemplo utiliza la sentencia D o W hile : : : Loop , que chequea primero la condici on y ejecuta el cuerp o de la iteracion si es cierta, volviendo de nuevoalpunto de chequeo: Dim a$(100) i% = 0 a(i%) = Dir$(``*'') Do While (a(i%) <> ``'' And i% < =99) i% = i% + 1 a(i%) = Dir$ Lo op r% = SelectBox(i% & `` cheros encontrados'',,a) El tercer ejemplo utiliza la sentencia D o U ntil : : : Loop , que ejecuta la iteracion hasta que la condicion sea cierta, evaluando primero la condicion: 35 Dim a$(100) i% = 0 a(i%) = Dir$(``*'') Do Until a(i%) = ``'' Or i% = 100 i% = i% + 1 a(i%) = Dir$ Lo op r% = SelectBox(i% & `` cheros encontrados'',,a) El cuarto ejemplo utiliza la sentencia D o : : : Loop U ntil , que ejecuta la iteracion hasta que la condicion sea cierta, evaluandola tras la ejecucion del cuerp o: Dim a$(100) i% = -1 Do i% = i% + 1 If i% = 0 Then a(i%) = Dir$(``*'') Else a(i%) = Dir$ End If Lo op Until (a(i%) = ``'' Or i% = 100) r% = SelectBox(i% & `` cheros encontrados'',,a) Salida forzada de los bucles ( Do...Loop ) La sentencia E xit D o lleva la lnea de ejecucion a la sentencia que sigue a la clausula Loop . Solo podra aparecer dentro de una sentencia D o : : : Loop . El siguiente ejemplo carga un arra y con las entradas de directorios al menos que hayamas de 10 entradas (en este caso la sentencia Do::: Loop termina la iteracion): Sub Main() Dim a$(5) Do i% = i% + 1 If i% = 1 Then a(i%) = Dir$(``*'') Else a(i%) = Dir$ End If If i% > = 10 Then Exit Do Lo op While (a(i%) <> ``'') If i% = 10 Then MsgBox ``<'' & i% & `` entrada pro cesadas!'' Else MsgBox ``<Menos de '' & i% & `` entradas pro cesadas!'' End If End Sub 36 2.6.2 El bucle While...Wend Es una sentencia iterativa que repite la ejecucion de una sentencia o grup o de ellas mientras una condicion de entrada sea verdadera. La condicion se chequea al inicio de cada iteracion. La sintaxis es: While C ondition & S tatements ] Wend El siguiente ejemplo ejecuta el bucle hasta que el generador de n umeros aleatorios devuelve el valor 1 (p ero un maximode1000 veces, momento en el que se fuerza la salida): Sub Main() x% = 0 count%=0 While x% <> 1 x% = Rnd(1) If count% > 1000 Then Exit Sub Else count% = count% + 1 End If Wend MsgBox ``El bucle se ejecuto''&count% & `` veces.'' End Sub 2.6.3 El bucle For Each La sentencia F or E ach repite un blo que de sentencias para cada elemento de una coleccion o array. Su sintaxis es: For Each M ember In Gr oup & S tatements ] &Exit For] & S tatements ] Next & M ember ] Esta sentencia tiene los siguientes parametros: Member Nombre de una variable para guardar un elemento en cada iteracion del bucle. Group Nombre de la coleccion o array. Statements El blo que de sentencias. La variable de la iteracion es una copia del elemento de la coleccion o array, por lo que los cambios sobre estas variables no afectan a los elementos originales. Los elementos se recorren en el mismo orden en que estan almacenados en memoria. La ejecucion contin ua hasta que no haya mas elementos. Pueden anidarse los bucles F or E ach con otros bucles, por lo que N ext 37 afectaraalmas interno ( F or E ach o F or N ext ) en ese momento. El nombre de la variable para los miembros deb e ser unico. El siguiente ejemplo muestra una subrutina que itera a traves de los elementos de un array utilizando la sentencias For ::: Each : Sub Main() Dim a(3 To 10) As Single Dim i As Variant Dim s As String For i = 3 To10 a(i) = Rnd() Next i For Each i In a i=i+1 Next i s = ``'' For Each i In a If s <> ``'' Thens=s&``,'' s=s&i Next i MsgBoxs End Sub En el siguiente ejemplo la subrutina visualiza los nombres de cada ho ja de un libro de Excel : Sub Main() Dim Excel As Ob ject Dim Sheets As Ob ject Set Excel = CreateOb ject(``Excel.Application'') Excel.Visible = 1 Excel.Workb o oks.Add Set Sheets = Excel.Worksheets For Each a In Sheets MsgBox a.Name Next a End Sub 2.6.4 El bucle For ... Next La sentencia For : : : Next repite un blo que de sentencias un numero esp ecicado de veces. Su sintaxis es la siguiente: 38 For Counter = S tar t To End &Step I ncr ement ] & S tatements ] &Exit For] & S tatements ] Next & Counter &, N extC ounter ] ::: ] Esta sentencia toma los siguientes parametros: Counter Nombre de una variable numerica (los tip os p osibles son: Integer , Long , S ing l e , Double o Variant ). Start Valor inicial del contador. End Valor nal del contador. Increment Cantidad que se a ~nade al contador en cada vuelta del bucle. Sera p ositivo o negativo seg un los valores iniciales y nales. Por defecto, el incremento es +1. No se puede cambiar su valor durante la ejecucion del bucle. Statements El cuerp o de sentencias del bucle. La sentencia continua su ejecucion hasta que llega a una sentencia E xit F or o cuando el contador es mayor que el valor nal (o menor si el bucle tiene recorrido inverso). Estos bucles pueden aparecer anidados. La sentencia Next se aplica al bucle For : : : Next mas interno. La clausula Next puede optimizarse agrupando varios contadores. Por ejemplo, los siguientes bucles son equivalentes: For i = 1 To10 For i = 1 To10 Forj=1 To10 For j=1To10 Next j Next j,i Next i El siguiente ejemplo construye la tabla de verdad para la op eracion logica O utilizando varios bucles F or : : : N ext anidados: Sub Main() For x = -1 To0 For y = -1 To0 Z=xOry msg = msg & Format(Abs(x%),``0'') &`` Or'' msg = msg & Format(Abs(y%),``0'') &`` ='' msg = msg & Format(Z,``True/False'') & Basic.Eoln$ Next y Next x MsgBox msg End Sub Salida forzada de los bucles ( For...Next ) La sentencia Exit F or fuerza la salida del bucle mas interno For , continuando la lnea de ejecucion tras la sentencia N ext .Solo puede aparecer en los blo ques For : : : Next . El siguiente ejemplo rellena un array con entradas de directorios hasta que se encuentra una entrada nula o se hayan pro cesado 100 entradas, momento en el que el bucle termina por 39 una sentencia E xit F or .La ventana de dialogo visualiza un contador de cheros encontrados y algunas entradas del array: Const crlf = Chr(13) + Chr (10) Sub Main() Dim a$(100) For i = 1 To 100 Ifi=1Then a$(i) = Dir$(``*'') Else a$(i) = Dir$ End If If (a$(i) = ``'') Or (i > = 100) Then Exit For Next i msg = ``Hay '' & i & `` cheros encontrados.'' & crlf MsgBox msg & a$(1) & crlf & a$(2) & crlf & a$(3) & crlf & a$(10) End Sub 40 DefaultProp erties Las propiedades p or defecto del mo delo. DeploymentDiagram El diagrama de despliegue aso ciado al mo delo. Ro otCategory La categora Top Level de Rational Rose .Se corresp onde a la vista logica del mo delo. Solo lectura. Ro otSubsystem El subsistema Top Level de Rational Rose . Se corresp onde a la vista de comp onentes del mo delo. Solo lectura. Ro otUseCaseCategory La categora raz a la que p ertenecen los casos de usos. Se corresp onde a la vista de casos de uso del mo delo. Solo lectura. UseCases Los casos de usos que p ertenecen al mo delo. Ylosmeto dos esp eccos de la clase Model son: FindCategories Encontrar una coleccion de categoras del mo delo. FindCategoryWithID Encontrar una categora esp ecca del mo delo. FindClassWithID Encontrar una clase esp ec ca del mo delo. FindClassses Encontrar una coleccion de clases del mo delo. FindItemWithID Encontrar un tem esp ecco del mo delo. FindItems Encontrar una coleccion de temes del mo delo. GetAllClasses Obtener to das las clases de to das las categoras del mo delo. GetAllCategories Obtener to das las categoras del mo delo. GetAllSubsystems Obtener to dos los subsistemas del mo delo. GetAllMo dules Obtener to dos los modulos del mo delo. GetAllPro cessors Obtener to dos los pro cesadores del mo delo. GetAllDevices Obtener to dos los disp ositivos del mo delo. GetAllUseCases Obtener to dos los casos de uso del mo delo. GetActiveDiagram Obtener el diagrama actualmente activo del mo delo. GetSelectedClasses Obtener to das las clases actualmente seleccionadas en el mo delo. GetSelectedCategories Obtener to das las categoras actualmente seleccionadas en el mo delo. GetSelectedMo dules Obtener to dos los modulos actualmente seleccionados en el mo delo. GetSelectedSubsystems Obtener to dos los subsistemas actualmente seleccionados en el modelo. GetSelectedUsesCases Obtener to dos los casos de uso actualmente seleccionados en el modelo. AddPro cessor A~nadir un pro cesador al mo delo. DeletePro cessor Eliminar un pro cesador del mo delo. 47 AddDevice A~nadir un disp ositivo al mo delo. DeleteDevice Eliminar un disp ositivo del mo delo. La clase DefaultModelProperties es un contenedor para las propiedades p or defecto que p ertenecen al mo delo. Solo hayunobjeto D ef aul tM odel P r oper ties por modelo. Los meto dos esp eccos de esta clase son: AddDefaultProp erty A~nadir una propiedad p or defecto a un conjunto de propiedades. CloneDefaultProp ertySet Duplicar un conjunto de propiedades por defecto para utilizarlo como base para crear un nuevoconjunto de propiedades. CreateDefaultProp ertySet Crear un nuevoconjunto de propiedades p or defecto (en blanco). DeleteDefaultProp erty Eliminar una propiedad p or defecto del conjunto de propiedades p or defecto. DeleteDefaultProp ertySet Eliminar una propiedad p or defecto de un mo delo. FindDefaultProp erty Encontrar una propiedad por defecto esp ecicada dados un mo delo, unaclaseyelnombre de una herramienta. GetDefaultProp ertySet Obtener el conjunto de propiedades por defecto para una herramienta y clase dadas. GetDefaultSetNames Obtener los nombres de los conjuntos de propiedades p or defecto para una herramien ta y clase dadas. GetTo olNamesForClass Obtener los nombres de las herramientas aso ciadas a una clase dada. IsTo olVisible Determinar si la pagina con las propiedades por defecto del mo delo de una herramienta dada esta visible en las esp ecicaciones. SetTo olVisibility Establecer la visibilidad de una herramienta, es decir, si la pagina de propiedades para esa herramienta aparecera en las esp ecicaciones. Todas las relaciones ( C l assR el ation , I nher its , Has y Real iz es ) heredan de la clase Relation : sus propiedades y meto dos p ermiten esp ecicar y obtener la informacion de to das las partes involucradas en cada relacion del mo delo. Vease la subseccion sobre el diagrama de herencias de Rel ation . La clase ExternalDocument ofrece las propiedades y meto dos que p ermiten crear do cumentos externos o informes desde el entorno de Rational Rose . Por ejemplo, se puede ejecutar Word en Windows para pasar la informacion de un mo delo a un do cumento de Word . Las propiedades esp eccas de E xter nal D ocument son: ParentCategory La aplicacion a utilizar para abrir el do cumento. Path El camino completo al do cumento. URL La URL del do cumento en Internet. Las propiedades P ath y URL son excluyentes entre s. Ylosmeto dos esp eccos de E xter nal D ocument son: IsURL Chequear si el do cumento tiene una URL . Op en Abrir un do cumento externo. 48 DeploymentDiagram Element ModuleDiagram Diagram ScenarioDiagram StateDiagram ClassDiagram Figura 3.3: Diagrama de herencia de la clase Diagram . 3.2.3 Diagrama de herencia de la clase Diagram El diagrama de clases de la gura 3.3 muestra la estructura de herencia de la clase D iag r am en el mo delo REI . Ya se ha comentado que cada ob jeto en un mo delo es un elemento, as que la clase Diagram esta directamente sub ordinada a E l ement . La clase Diagram ofrece un conjunto de propiedades y meto dos que to das las demas clases de diagramas (p or ejemplo, diagrama de clases, diagrama de escenarios, diagrama de comp onentes, etc.) heredan. Cualquier diagrama se comp one de varios elementos ( items ) y vistas de esos elementos ( I temV iew s ). Cada I temv iew es la representacion fsica de un elemento de Rational Rose y es un ob jeto con las propiedades ymeto dos que denen su apariencia en la ventana del diagrama (p osicion, color, tama ~no, etc.). La op eratividad basica de la clase Diagram se resume en los siguientes puntos:  La propiedad D iag r am:I temV iew s es utilizada para iterar a traves de la coleccion de vistas de elementos que p ertenecen al diagrama.  La propiedad D iag r am:I tems es utilizada para iterar a traves de los elementos que existen en el diagrama.  El meto do D iag r am:GetV iew F r om es utilizado para encontrar la primera vista de un elemento.  Para encontrar cuales son las vistas de los elementos actualmente seleccionados en el diagrama, se recorre la lista de vistas de elementos del diagrama. Para cada una de ellas, se utiliza el meto do I temV iew :I sS el ected para determinar si esta o no seleccionado en el diagrama. Se puede obtener entonces la vista de elemento seleccionada o realizar cualquier otro pro ceso basandose en esta informacion.  Una manera rapida para obtener to dos los elementos seleccionados en un diagrama es utilizar el meto do D iag r am:GetS el ectedI tems . En lugar de iterar a traves del diagrama y chequear cada vista, este meto do simplemente devuelve to do aquello que este seleccionado. Otras propiedades esp eccas de Diagram son: Do cumentation La do cumentacion anexa al diagrama. Visible La visibilidad del diagrama. Otros meto dos esp eccos de Diagram son: 49 Exists Comprobar si un determinado ob jeto del diagrama existe. Layout Dibujar un diagrama. Invalidate Redibujar un diagrama. Up date Mo dicar un diagrama. AddNoteView A~nadir una nota a un diagrama. RemoveNoteView Borrar una nota del diagrama. GetNoteViews Obtener las notas p ertenecientes al diagrama. Render Salvar el graco del diagrama en un chero con el formato Windows Metale . RenderEnhanced La misma accion que Render ,peroconmayor calidad. RenderToClipb oard La misma accion que Render , p ero guarda el graco en el p ortapap eles. RenderEnhancedToClipBoard La misma accion que Render T oC lipboar d , p ero con mayor calidad. IsActive Indicar si el diagrama esta actualmente activo en la aplicacion. Activate Activar el diagrama. La clase ClassDiagram p ermite a ~nadir, obtener y b orrar clases y categoras del diagrama de clases. Las propiedades esp eccas de C l assD iag r am son: ParentCategory La categora que contiene al diagrama de clases. Ylosmeto dos esp eccos de C l assD iag r am son: AddAsso ciation A~nadir una aso ciaci on al diagrama. AddCategory A~nadir una categora al diagrama. AddClass A~nadir una clase al diagrama. AddUseCase A~nadir un caso de uso al diagrama. GetAsso ciations Obtener la coleccion de las aso ciaciones que p ertenecen al diagrama de clases. GetCategories Obtener la coleccion de las categoras que p ertenecen al diagrama de clases. GetClasses Obtener la coleccion de las clases que p ertenecen al diagrama de clases. GetClassView Obtener una vista de clase de un diagrama de clases. GetSelectedCategories Obtener las categoras actualmente seleccionadas en el diagrama de clases. GetSelectedClasses Obtener las clases actualmente seleccionadas en el diagrama de clases. GetUseCases Obtener los casos de uso p ertenecientes al diagrama. IsUseCaseDiagram Determinar si el diagrama de clases es un diagrama de casos de uso. RemoveAsso ciation Eliminar una aso ciacion del diagrama de clases. 50 RemoveCategory Eliminar una categora del diagrama de clases. RemoveClass Eliminar una clase del diagrama de clases. RemoveUseCase Eliminar un caso de uso del diagrama. Un escenario es una instancia de un caso de uso y muestra los eventos que o curren durante la ejecucion del sistema. La clase ScenarioDiagram p ermite crear una representacion visual de un escenario. Las propiedades esp eccas de S cenar ioD iag r am son: InstanceViews La coleccion de vistas de instancias p ertenecientes al diagrama. Ylosmeto dos esp eccos de S cenar ioD iag r am son: AddInstance A~nadir una instancia al diagrama de escenario. AddInstanceView A~nadir una vista de instancia al diagrama de escenario. CreateMessage Crear un mensa je y a ~nadirlo al diagrama de escenario. DeleteInstance Eliminar una instancia del diagrama de escenario. GetDiagramTyp e Obtener el valor del tip o de diagrama. GetMessages Obtener la coleccion de mensa jes que p ertenecen al diagrama de escenario. GetSelectedLinks Obtener los enlaces actualmente seleccionados en el diagrama de escanario. GetSelectedMessages Obtener el conjunto de mensa jes actualmente seleccionados en el diagrama de escenario. GetSelectedOb jects Obtener el conjunto de ob jetos actualmente seleccionados en el diagrama de escanario. RemoveInstanceView Eliminar una vista de instancia del diagrama de escenario. La clase StateDiagram dene las propiedades y meto dos que p ermiten la manipulacion de ob jetos en la vista de estados (contiene los diagramas de estado) de un mo delo. Las propiedades esp ec cas de la clase S tateD iag r am son: Parent La maquina de estados que contiene el diagrama de estados. Ylosmeto dos esp eccos de S tateD iag r am son: AddStateView A~nadir una vista de estados a un diagrama de estados. GetSelectedStates Obtener los estados actualmente seleccionados en un diagrama de estados. GetSelectedStateViews Obtener las vistas de estados actualmente seleccionadas en un diagrama de estados. GetSelectedTransitions Obtener las transiciones actualmente seleccionadas en un diagrama de estados. GetStateView Obtener el estado de una vista de estados en un diagrama de estados. GetStateViews Obtener to das las vistas de estados en un diagrama de estados. 51 RemoveStateView Eliminar una vista de estados de un diagrama de estados. Un ModuleDiagram map ea la colo cacion de las clases y ob jetos en modulos. Las propiedades esp eccas de M odul eD iag r am son: ParentSubsystem El subsistema que contiene el modulo. Siempre hace referencia a un ob jeto S ubsy stem valido. Ylosmeto dos esp eccos de M odul eD iag r am son: AddMo dule A~nadirunmodulo al diagrama de modulos. AddSubsystem A~nadir un subsistema al diagrama de modulos. GetMo dules Obtener la coleccion que contiene to dos los modulos p ertenecientes al diagrama de modulos. GetSelectedMo dules Obtener los modulos actualmente seleccionados en el diagrama de modulos. GetSelectedSubsystems Obtener los susbsistemas actualmente seleccionados en el diagrama de modulos. GetSubsystems Obtener la coleccion que contiene to dos los subsistemas que p ertenecen al diagrama de modulo. Un diagrama de despliegue es la representacion visual de los disp ositivos ypro cesadores fsicos. La clase DeploymentDiagram ofrece las siguientes meto dos esp eccos: AddDevice A~nadir un disp ositivo al diagrama de despliegue. AddPro cessor A~nadir un pro cesador al diagrama de despliegue. GetDevices Obtener los disp ositivos que p ertenecen al diagrama de despliegue. GetPro cessors Obtener los pro cesadores que p ertenecen al diagrama de despliegue. RemoveDevice Eliminar un disp ositivo del diagrama de despliegue. RemovePro cessor Eliminar un pro cesador del diagrama de despliegue. 3.2.4 Diagrama de herencia de la clase Logical El diagrama de clases de la gura 3.4 muestra la estructura de herencia de las dos principales clases logicas del mo delo REI : C ateg or y y C l ass . Ambas heredan de las clases Package y RoseI tem resp ectivamente, que p ertenecen al diagrama de herencia de la clase M odel . La clase Category p ermite denir y manipular colecciones logicas de clases. Las propiedades esp ecicas de la clase C ategory son: Asso ciations La coleccion de to das las aso ciaciones que p ertenecen a la categora. Categories La coleccion de las categoras que son hijas de las categora. ClassDiagrams La coleccion de los diagramas de clase que p ertenecen a la categora. 52 RoseItem Class Package Category Figura 3.4: Diagrama de herencia de la clase Logical . Classes La coleccion de las clases que p ertenecen a la categora. Global Identica la categora como global. ParentCategory La categora que contiene a la categora. ScenarioDiagrams La coleccion de los diagramas de escenario que p ertenecen a la categora. UseCases La coleccion que contiene los casos de uso que p ertenecen a la categora. Ylosmeto dos esp eccos de la clase C ateg or y son: AddCategory A~nadir una categora a una categora. AddCategoryDep endency A~nadir una dep endencia de categora a una categora. AddClass A~nadir una clase a una categora. AddClassDiagram A~nadir un diagrama de clase a una categora. AddScenarioDiagram A~nadir un diagrama de escenario a una categora. AddUseCase A~nadir un caso de uso a una categora. DeleteCategory Eliminar una categora de una categora. DeleteCategoryDep endency Eliminar una dep endencia de categora de una categora. DeleteClass Eliminar una clase de una categora. DeleteClassDiagram Eliminar un diagrama de clase de una categor a. DeleteScenarioDiagram Eliminar un diagrama de escenario de una categora. DeleteUseCase Eliminar un caso de uso de una categora. GetAllCategories Obtener to das las categoras que p ertenecen a una categora y to das las categoras p ertenecientes a sus hijas. GetAllClasses Obtener to das las clases que p ertenecen a la categora y to das sus hijas. GetAllUseCases Obtener la coleccion que contiene los casos de uso que p ertenecen a la categora. 53 GetAssignedSubsystem Obtener el subsistema asignado a la categora. GetCategoryDep endencies Obtener la coleccion de dep endencias de categora que p ertenecen a la categora. HasAssignedSubsystem Obtener el subsistema asignado a la categora. Relo cateCategory Recolo car una categora dentro de una categora. Relo cateClass Recolo car una clase dentro de una categora. Relo cateClassDiagram Recolo car un diagrama de clase dentro de una categora. Relo cateScenarioDiagram Recolo car un diagrama de escenario dentro de una categora. SetAssignedSubsystem Asignar un subsistema a la categora. TopLevel Indicar si la categora es la categora raz. La clase Class permite establecer y obtener las caractersticas y relaciones de las clases esp eccas de un mo delo: si es una clase abstracta, si es un tip o fundamental, si es p ersistente, si puede ser concurrente con otras clases, su conjunto de atributos y op eraciones, sus relaciones con otros ob jetos del mo delo, etc. Las propiedades esp eccas de la clase C l ass son: ParentCategory La categora que contiene la clase. Abstract Identica la clase como abstracta. Attributes La coleccion que contiene los atributos de la clase. Op erations La coleccion que contiene las op eraciones de la clase. Exp ortControl La visibilidad de la clase. Cardinality La cardinalidad de la clase. ClassKind El tip o de la clase. Concurrency El tip o de concurrencia de la clase con otros ob jetos. Persistence Identica la clase como p ersistente. Space El algoritmo de espacios a utilizar para la clase. FundamentalTyp e Identica la clase como un tip o fundamental. StateMachine La maquina de estado que p ertenece a la clase. ParentClass La clase padre de esta clase. Ylosmeto dos esp eccos de la clase Class son: AddAssignedMo dule Asignar un modulo (comp onente) a la clase. AddAsso ciation A~nadir una aso ciacion ( Association ) a una clase. AddAttribute A~nadir un atributo a una clase. AddClassDep endency A~nadir una dep endencia de clase a la clase. 54 AddHas A~nadir una agregacion ( H asR el ationship ) a una clase. AddInheritRel A~nadir una relacion de herencia ( I nher itRel ationship ) entre clases en una clase. AddNestedClass A~nadir una clase anidada a una clase. AddOp eration A~nadir una op eracion a una clase. AddRealizeRel A~nadir una relacion de realizacion a una clase. CreateStateMachine Crear una maquina de estado para una clase. DeleteAsso ciation Eliminar una aso ciacion de una clase. DeleteAttribute Eliminar un atributo de una clase. DeleteClassDep endency Eliminar una dep endencia de clase de una clase. DeleteHas Eliminar una agregacion de una clase. DeleteInheritRel Eliminar una relacion de herencia entre clases en una clase. DeleteNestedClass Eliminar una clase anidada de una clase. DeleteOp eration Eliminar una op eracion de una clase. DeleteRealizeRel Eliminar una relacion de realizacion de una clase. DeleteStateMachine Eliminar la maquina de estados de la clase del mo delo. GetAssignedLanguage Obtener el nombre del lengua je de programacion asignado a la clase. GetAssignedMo dules Obtener los modulos asignados a la clase. GetAsso ciateRoles Obtener los roles aso ciados a la clase. GetAsso ciations Obtener las aso ciaciones en las que participa la clase. GetClassDep endencies Obtener la coleccion de clases de dep endencia que p ertenecen a la clase. GetHasRelations Obtener las agregaciones en las que participa la clase. GetInheritRelations Obtener las relaciones de herencia en las que participa la clase. GetLinkAsso ciation Obtener la aso ciacion para una clase de enlace ( Link ). GetNestedClasses Obtener las clases anidadas en la clase. GetRealizeRelations Obtener la coleccion de relaciones de realizacion que p ertenecen a la clase. GetRoles Obtener los roles de la clase. GetSubClasses Obttener las sub clases de la clase. GetSup erclasses Obtener las sup erclases corresp ondientes a la clase. IsALinkClass Determinar si una clase es una clase de enlace. IsNestedClass Determinar si una clase es una clase anidada. RemoveAssignedMo dule Borrar una asignacion de modulo de la clase. 55 ClassView Element InstanceView RoseItemView ComponentView SubsystemView StateView NoteView Figura 3.5: Diagrama de herencia de la clase View . 3.2.5 Diagrama de herencia de la clase View El diagrama de clases de la gura 3.5 muestra la estructura de herencia de la clase V iew en el mo delo REI .La clase RoseI temV iew hereda de E l ement , que p ertenece al diagrama de herencia de la clase M odel . La clase RoseItemView p ermite denir y manipular el tama ~no y p osicion de un RoseI tem en un diagrama. Las propiedades esp ecicas de la clase RoseI temV iew son: Name El nombre de la vista del tem. Item El ob jeto RoseI tem representado p or la vista. ParentDiagram El diagrama que contiene a la vista. ParentView El ob jeto RoseI temV iew que contiene a la vista. SubViews La coleccion de vistas de tem que p ertenecen a la vista. XPosition La co ordenada horizontal (x) del punto central de la vista. YPosition La co ordenada vertical (x) del punto central de la vista. Height La altura de la vista. Width La anchura de la vista. FillColor.Red Establece el color de la vista a ro jo. FillColor.Green Establece el color de la vista a verde. FillColor.Blue Establece el color de la vista a azul. FillColor.Transparent Establece el color de la vista a transparente. LineColor.Red Establece el color de lnea de la vista a ro jo. LineColor.Green Establece el color de lnea de la vista a verde. LineColor.Blue Establece el color de lnea de la vista a azul. Font.Red Establece el color del texto a ro jo. 56 AssignedLanguage El lengua je de programacion asignado al modulo. Declarations La coleccion de declaraciones corresp ondientes al modulo. OtherPart La segunda parte del modulo cuando forma parte de un subsistema. ParentSubSystem El subsistema que contiene el modulo. Part Si el modulo es parte de un subsistema o no. Path El directorio donde se encuentra el modulo. Typ e El tip o del modulo. Ylosmeto dos esp eccos de M odul e son: AddRealizeRel A~nadir una relacion de realizacion a un modulo. AddVisibilityRelationship Crear una nuevarelacion de visibilidad y a ~nadirla a un modulo. DeleteRealizeRel Eliminar una relacion de realizacion de un modulo. DeleteVisibilityRelationship Eliminar una relacion de visibilidad de un modulo. GetAllDep endencies Obtener to dos los modulos que afectan al modulo. GetAssignedClasses Obtener la coleccion de clases asignadas al modulo. GetDep endencies Obtener la coleccion de modulos incluidos en el modulo. GetRealizeRelations Obtener la coleccion de relaciones de realizacion p ertenecientes a un modulo. GetSubsystemDep endencies Obtener la coleccion de relaciones de visibilidad entre un modulo y un subsistema. 3.2.9 Diagrama de herencia de la clase Relation El diagrama de clases de la gura 3.9 muestra la estructura de herencia de la clase Rel ation en el mo delo REI . Estas clases heredan de RoseI tem que p ertenece al diagrama de herencia de la clase M odel , y son un sub conjunto de las clases logicas del mo delo. To das las relaciones ( C l assR el ation , I nher its , Has , Real iz es ) heredan de la clase Relation , cuyas propiedades y meto dos p ermiten esp ecicar y obtener la informacion sobre los extremos de las relaciones en el mo delo. Las propiedades esp eccas de la clase Rel ation son: SupplierName El nombre del extremo suministrador de la relacion. Ylosmeto dos esp eccos de la clase Rel ation son: HasClient Determinar si la relacion tiene una parte cliente. HasSupplier Determinar si la relacion tiene una parte suministradora. GetClient Obtener el ob jeto RoseI tem que actua como cliente de la relacion. GetSupplier Obtener el ob jeto RoseI tem que actua como suministrador de la relacion. 63 RoseItem Relation Transition Role CategoryDependency RealizeRelation ModuleVisibilityRelationShip ClassRelation InheritRelation HasRelationship ClassDepedency Figura 3.9: Diagrama de herencia de la clase Relation . Los roles denotan el proposito o capacidad en que una clase se aso cia con otra. La clase Role exp onen un conjunto de propiedades y meto dos para determinar las caractersticas de los roles y p ermiten obtener los roles de un mo delo. Las propiedades esp eccas de la clase Role son: Class La clase corresp ondiente al rol. Constraints Las restricciones del rol. Asso ciation La aso ciacion vinculada al rol. Exp ortControl La visibilidad de los atributos. Friend Indica si el rol es \ f r iend " o no, p ermitiendo el acceso a sus atributos y op eraciones no publicos. Containment La relacion contenedora del rol. Cardinality La cardinalidad del rol. Aggregate Indica si el rol es una clase agregado o no. Static Indica si el rol es estatico o no. Navigable Indica si el rol es navegable o no. Keys La coleccion de claves corresp ondientes al rol. Ylosmeto dos esp eccos de Role son: AddKey Devuelveunaclave basada en el nombre y tip o de un atributo. DeleteKey Elimina una clave de un rol. GetClassName Obtiene el nombre de la clase aso ciado con el rol. 64 La clase CategoryDependency p ermite denir y manipular las relaciones de dep endencia entre las categoras. La clase ClassRelation hereda de la clase Rel ation y es la clase padre de H asR el ationship , C l assD ependency e I nher itRel ation .los meto dos esp eccos de C l assR el ation son: GetContextClass Obtener la clase cliente de la relacion. GetSupplierClass Obtener la clase suministradora de la relacion. La relacion de herencia indica una relacion jerarquica entre las clases en las que una clase comparte al estructura y/o comp ortamiento de otra clase. La clase InheritRelation exp one un conjunto de propiedades y meto dos para determinar las caractersticas de la relacion de herencia. Las propiedades esp eccas de I nher itRel ation son: Exp ortControl La visibilidad de la relacion de herencia. FriendshipRequired Si la propiedad F r iend es requerida p or la relacion de herencia. Virtual Si la relacion es virtual o no. La relacion \ Has " indica una relacion contenedora o agregado entre clases. La clase HasRelationship exp one un conjunto de propiedades y meto dos para determinar las caractersticas de estas relaciones en un mo delo. Las propiedades esp eccas de H asR el ationship son: ClientCardinality La cardinalidad del cliente de la relacion. Containment El contenedor de clase para la relacion. Exp ortControl La visibilidad de la relacion. Static Si la relacion es estatica o no. SupplierCardinality La cardinalidad del suministrador de la relacion. La clase ClassDependency exp one un conjunto de propiedades y meto dos para determinar las caractersticas de las dep endencias entre las clases. Las propiedades esp eccas de C l assD ependency son: ClientCardinality La cardinalidad del cliente de la dep endencia. SupplierCardinality La cardinalidad del suministrador de la dep endencia. InvolvesFriendship Si la clase implica la propiedad F r iend o no. Exp ortControl La visibilidad de la dep endencia. Una relacion de realizacion entre una clase logica y una clase comp onente muestra que la clase comp onente realiza las op eraciones denidas p or la clase logica. Los meto dos esp eccos de clase RealizeRelation son: GetContextClass Obtener la clase cliente de la relacion. GetContextComp onent Obtener el comp onente cliente de la relacion. GetSupplierClass Obtener la clase suministradora de la relacion. 65 Message RoseItem ObjectInstance Link Persistence Synchronization Frequency Figura 3.10: Diagrama de herencia de la clase Scenario . GetSupplierComp onent Obtener el comp onente suministrador de la relacion. La clase ModuleVisibilityRelationship describ e el cliente y suministrador de una relacion entre modulos. Las propiedades esp eccas de M odul eV isibil ity Rel ationship son: ContextMo dule El nombre del modulo cliente de la relacion. ContextSubsystem El nombre del subsistema cliente de la relacion. SupplierMo dule El nombre del modulo suministrador de la relacion. SupplierSubsystem El nombre del subsistema sumnistrador de la relacion. La clase Transition es una clase que p ertenece al diagrama de herencia de State , p ero tambien hereda de la clase Rel ation p orque se considera que una transicion es una relacion entre los estados fuente y destino. 3.2.10 Diagrama de herencia de la clase Scenario El diagrama de clases de la gura 3.10 muestra la estructura de herencia de la clase S cenar io en el mo delo REI . Las clases O bj ectI nstance , Link y M essag e heredan de RoseI tem que p ertenece al diagrama de herencia de la clase M odel . La clase ObjectInstance exp one un conjunto de propiedades y meto dos para determinar las caractersticas de los ob jetos en un mo delo. Las propiedades esp eccas de O bj ectI nstance son: ClassName El nombre de la clase del ob jeto. Links La coleccion de enlaces corresp ondientes al ob jeto. MultipleInstances Si existen m ultiples instancias del ob jeto o no. Persistence Si la instancia del ob jeto es p ersistente o estatica. Ylosmeto dos esp eccos de O bj ectI nstance son: AddLink A~nadir un enlace a la instancia del ob jeto. 66 DeleteLink Eliminar un enlace de la instancia del ob jeto. GetClass Obtener la clase a la que p ertenece la instancia del ob jeto. IsClass Devuelve True si la instancia del ob jeto es una clase. Los ob jetos interaccionan a traves de sus enlaces hacia otros ob jetos. Un enlace es una instancia de una aso ciacion, de la misma manera que un ob jeto es una instancia de una clase. Las propiedades y metodosdelaclase Link p ermiten denir enlaces entre ob jetos y determinar la naturaleza de las aso ciaciones. Las propiedades esp eccas de Link son: LinkRole1 Dene una instancia de ob jeto como un enlace en Role 1. LinkRole2 Dene una instancia de ob jeto como un enlace en Role 2. LinkRole1Shared Dene una instancia de ob jeto como un enlace en Role 1con visibilidad compartida. LinkRole2Shared Dene una instancia de ob jeto como un enlace en Role 2con visibilidad compartida. LinkRole1Visibility Dene una instancia de ob jeto como un enlace en Role 1 y determina su tip o de visibilidad. LinkRole2Visibility Dene una instancia de ob jeto como un enlace en Role 2 y determina su tip o de visibilidad. Ylosmeto dos esp eccos de Link son: AddMessageTo A~nadir un mensa je al enlace. AssignAsso ciation Asignar una aso ciacion al enlace. DeleteMessage Elimina un mensa je del enlace. GetMessages Obtener los mensa jes llevados p or el enlace. UnAssignAsso ciation Eliminar una asignacion de aso ciacion del enlace. Los mensa jes denen la interaccion entre los ob jetos. La clase Message ofrece propiedades y meto dos que p ermiten obtener el remitente y destino del mensa je junto a otra informacion esp ecca del mismo. Las propiedades esp eccas de M essag e son: Frequency La frecuencia del mensa je (si el mensa je es enviado solo una vez o p eriodicamente). Synchronization La semantica de concurrencia del mensa je. Ylosmeto dos esp eccos de M essag e son: GetSenderOb ject Obtener el ob jeto que envioelmensaje. GetReceiverOb ject Obtener el ob jeto que recibio el mensa je. IsMessageToSelf Si el mensa je es enviado a s mismo o no. IsOp eration Si el mensa je es una op eracion o no. 67 GetOp eration La op eracion aso ciada con el mensa je. GetLink Obtener el enlace aso ciado con el mensa je. La clase Persistence dene los valores por defecto para la p ersistencia de ob jetos. Las propiedades esp eccas de P er sistence son: Persistent El valor p or defecto para la p ersistencia de ob jetos. Transient El valor p or defecto para la transicion de ob jetos. La clase Synchronization dene los valores p or defecto para la sincronizacion de ob jetos. Las propiedades esp eccas de S y nchr oniz ation son: Asynchronous Dene el valor p or defecto para los mensa jes asncronos. Balking Dene el valor p or defecto para los mensa jes \ B al k ing ". Simple Dene el valor p or defecto para los mensa jes simples. Synchronous Dene el valor p or defecto para los mensa jes sncronos. Timeout Dene el valor p or defecto para los mensa jes \ T imeout ". La clase Frequency dene los valores por defecto para la frecuencia de mensa jes. Las propiedades p or defecto de F r eq uency son: Ap erio dic El valor p or defecto para los mensa jes no p eriodicos. Perio dic El valor p or defecto para los mensa jes p eriodicos. 3.2.11 Diagrama de herencia de la clase State El diagrama de clases de la gura 3.11 muestra la estructura de herencia de la clase State en el mo delo REI .Las clases Action y State heredan de Element y RoseI tem mientras que E v ent y S tateM achine directamente de Element . Tanto Element como RoseI tem p ertenecen al diagrama de herencia de la clase M odel . La clase T r ansition hereda de Relation , que p ertenece al diagrama de herencia de la clase Rel ation . Un evento es una o currencia que causa una transicion de estado. Las propiedades y meto dos de la clase Event denen y controlan eventos que afectan a los estados y establece las transiciones de ob jetos en un mo delo. Las propiedades esp eccas de Event son: Arguments Las condiciones que afectan al evento. GuardCondition Dene una condicion de guarda: cuando sea True p ermitira la o currencia del evento y mientras sea False el evento no o currira. Name El nombre del evento. Yelmeto do esp ecco de Event es: GetAction Obtener la accion corresp ondiente al evento. 68 StateMachine Element RoseItem Event Relation Action State Transition Figura 3.11: Diagrama de herencia de la clase State . La clase StateMachine contiene to da la informacion sobre el estado de los ob jetos de una determinada clase. La maquina de estado de una clase dene to dos los posibles estados y transiciones para esa clase. Una clase puede tener o no una maquina de estado y una maquina de estado solo puede p ertenecer a una clase. Las propiedades esp ecca de S tateM achine son: Diagram El diagrama de estados que contiene la maquina de estados. ParentClass La clase a la que p ertenece la maquina de estados. States La coleccion de estados de la maquina de estados. Ylosmeto dos esp eccos de S tateM achine son: AddState A~nadir un estado a una maquina de estados. DeleteState Eliminar un estado de una maquina de estados. GetAllStates Obtener to dos los estados de una maquina de estados. GetAllTransitions Obtener to das las transiciones de una maquina de estados. GetTransitions Obtener la coleccion de transiciones de una maquina de estados. Relo cateState Recolo car un estado en una maquina de estados. La clase Transition provee el medio para seguir la traza de un ob jeto en un cam bio de estado, es decir, en el punto donde no esta en el estado original p ero aun no ha llegado a su estado destino. Los meto dos esp eccos de T r ansition son: GetSendAction Obtener el mensa je a enviar cuando la transicion o curre. GetSourceState Obtener el estado inicial de la transicion. GetTargetState Obtener el estado destino de la transicion. 69 GetTriggerAction Obtener la accion a realizar cuando el evento disparador de la transicion o curra. GetTriggerEvent Obtener el evento que dispara la transicion. RedirectTo Redireccionar la transicionaunnuevo estado destino. Una accion es una op eracion que esta aso ciada a una transicion, toma una cantidad insigni- cante de tiemp o para realizarse y no se puede interrumpir. Las propiedades de la clase Action son: Arguments El contenido de la accion. Target El ob jeto destino de la accion. La clase State esp ecica el conjunto de propiedades y meto dos que controlan la informacion sobre el estado de los ob jetos de un mo delo. Las propiedades esp eccasdelaclase S tate son: History Esp ecica a que sub estado se vuelve cuando se retorna a un sup erestado. ParentState El sup erestado que contiene al estado. ParentStateMachine La maquina de estados a la que p ertenece el estado. StateKind El tip o del estado. Substates Los sub estados del estado (p or lo tanto, es un sup erestado). Transitions El conjunto de transiciones denidas para el estado. Ylosmeto dos esp eccos de S tate son: AddDoAction A~nadir una accion (\ Do ") a un estado. AddEntryAction A~nadir una accion de entrada (la primera vez) a un estado AddExitAction A~nadir una accion de salida a un estado. AddState A~nadir un sub estado a un estado. AddTransition A~nadir una transicion a un estado. AddUserDenedEvent A~nadir un evento denido p or el usuario a un estado. DeleteAction Eliminar una accion de un estado. DeleteState Eliminar un sub estado de un estado. DeleteTransition Eliminar una transicion de un estado. DeleteUserDenedEvent Eliminar un evento denido p or el usuario de un estado. GetAllSubstates Obtener los sub estados de un estado. GetDoActions Obtener las acciones (\ Do ") de un estado. GetEntryActions Obtener las acciones de entrada de un estado. GetExitActions Obtener las acciones de salida de un estado. GetUserDenedEvents Obtener los eventos denidos p or el usuario de un estado. Relo cateState Recolo car un sub estado en un estado determinado. 70 RoseItem UseCase Figura 3.12: Diagrama de herencia de la clase UseCase . 3.2.12 Diagrama de herencia de la clase UseCase El diagrama de clases de la gura 3.12 muestra la estructura de herencia de la clase U seC ase en el mo delo REI . La clase U seC ase hereda de RoseI tem que p ertenece al diagrama de herencia de la clase Rel ation .Se podra p ensar en un diagrama de casos de uso en lugar de una clase, p ero de esta manera aparecera en el diagrama de herencia de la clase Diagram . La clase UseCase exp one un conjunto de propiedades y meto dos que p ermiten denir y manipular los conjuntos de diagramas de clases y escenarios que forman los casos de uso de un mo delo. Las propiedades esp eccas de U seC ase son: Abstract Si el caso de uso es una clase abstracta ono. ClassDiagrams La coleccion de diagramas de clases corresp ondientes al caso de uso. ParentCategory La categora que contiene el caso de uso. Rank El rango del caso de uso ScenarioDiagrams La coleccion de diagramas de escenarios corresp ondientes al caso de uso. StateMachine La maquina de estado corresp ondiente al caso de uso. Ylosmeto dos esp eccos de U seC ase son: AddAsso ciation A~nadir una aso ciacion a un caso de uso. AddClassDiagram A~nadir un diagrama de clases a un caso de uso. AddInheritRel A~nadir una relacion de herencia a un caso de uso. AddScenarioDiagram A~nadir un diagrama de escenario a un caso de uso. DeleteAsso ciation Eliminar una aso ciacion de un caso de uso. 71 DeleteClassDiagram Eliminar un diagrama de clases de un caso de uso. DeleteInheritRel Eliminar una relacion de herencia de un caso de uso. DeleteScenarioDiagram Eliminar un diagrama de escenario de un caso de uso. GetAsso ciations Obtener las aso ciaciones de un caso de uso. GetInheritRelations Obtener la coleccion de relaciones de herencia de un caso de uso. GetRoles Obtener la coleccion de roles de un caso de uso. GetSup erUseCases Obtener los sup er{casos de uso de un caso de uso. 3.3 Diagramas del mo delo de empaquetamiento de REI Acontinuacion se muestran los paquetes en la vista logica del mo delo REI : Application Classes Application Classes  Application  PathMap  RoseAddInManager  AddIn  AddInCollection Mo del Classes Mo delClasses Sub classes of Item Items Elements RoseItem Element DefaultMo delProp erties Sub classes of Relation Sub classes of ClassRelation Relations ControllableUnit 1. Mo del Collections  Mo del  RoseItem  ExternalDo cument  ControllableUnit  Package  Element  Prop erty  DefaultMo delProp erties 72 Sub Main() Begin Dialog PlantillaDialogoSalida 16,32,116,64,``Salida'' Text 4,8,108,8,``>Estas seguro de que quieres salir?'' CheckBox 32,24,63,8,``Salvar los cambios'',.SalvarCambios OKButton 12,40,40,14 CancelButton 60,40,40,14 End Dialog Dim VentanaDialogoSalida As PlantillaDialogoSalida rc% = Dialog(VentanaDialogoSalida) End Sub 4.2 Visualizar un formulario 4.2.1 El pro cedimiento Dialog Se utiliza para visualizar un formulario: no devuelve ning un valor, al contrario que la funcion del mismo nombre. La sintaxis es la que sigue: Dialog ( D ial og V ar iabl e &  & D ef aul tB utton ]&  T imeout ]]) La denicion de los tres parametros es la siguiente: DialogVariable Nombre de la variable que ha sido previamente declarada como un formulario denido p or el usuario. DefaultButton Un entero que esp ecica que boton act ua como boton por defecto en el formulario. Este valor sigue la misma norma que el valor de salida para identicar el b oton. El valor p or defecto es ; 1 (Boton OK ). Timeout Un entero que esp ecica el n umero de milisegundos para visualizar formulario antes de que automaticamente se quite. El valor por defecto es 0 (solo se quitara tras una p eticion explcita del usuario). En el siguiente ejemplo se visualiza un formulario para mostrar el tpico mensa je de error de disco: Sub Main() Begin Dialog PlantillaErrorDisco 16,32,152,48,``Error de Disco'' Text 8,8,100,8,``La disquetera estavaca.'' PushButton 8,24,40,14,``Ab ortar'',.Ab ortar PushButton 56,24,40,14,``Volver aintentar'',.Reintentar PushButton 104,24,40,14,``Ignorar'',.Ignorar End Dialog Dim ErrorDisco As PlantillaErrorDisco Dialog ErrorDisco,3,0 End Sub 79 4.2.2 La funcion Dialog Tambien se puede utilizar la funcion Dialog que visualiza un formulario denido p or el usuario. La funcion devuelveunentero que representa al b oton que se pulso para salir:  -1 El b oton OK fue pulsado.  0 El b oton C ancel fue pulsado.  > 0 Se pulso otro b oton: el n umero representa al b oton, seg un el orden en el que estaen la plantilla del cuadro de dialogo. El siguiente ejemplo muestra de nuevo la ventana a visualizar cuando o curra un error de disquetera: Sub Main() Begin Dialog PlantillaErrorDisco 16,32,152,48,``Error de Disco'' Text 8,8,100,8,``La disquetera estavaca.'' PushButton 8,24,40,14,``Ab ortar'',.Ab ortar PushButton 56,24,40,14,``Volver aintentar'',.Reintentar PushButton 104,24,40,14,``Ignorar'',.Ignorar End Dialog Dim ErrorDisco As PlantillaErrorDisco r% = Dialog(ErrorDisco,3,0) MsgBox ``Has seleccionado el b oton: '' & r% End Sub 4.3 F unciones de mensa jes o ventanas de dialogo predenidas AnswerBox Muestra un mensa je y esp era aque el usuario de una respuesta, devolviendo un entero indicando que b oton pulso el usuario. AskBox, AskBox$ Muestra una ventana para p edir al usuario una entrada de datos, que devuelve como una cadena. AskPassword, AskPassword$ Muestra una ventana para pedir al usuario una entrada de datos, que devuelve como una cadena. Pero esta vez solo se visualizan asteriscos cuando el usuario intro duzca los datos, p ermitiendo aslaentrada de claves. InputBox, InputBo x$ Muestra una ventana de dialogo con un control de edicion de textos para que el usuario pueda intro ducir alg un dato. MsgBox Muestra un mensa je en una ventana de dialogo con un conjunto de b otones predenidos. Tiene dos versiones: funcional (devolviendo un entero que representa el b oton que fue seleccionado) y pro cedimental. Op enFilename$ Muestra una ventana de dialogo para abrir un chero. SaveFilename$ Muestra una ventana de dialogo para guardar un chero. SelectBox Muestra una ventana de dialogo que permite al usuario seleccionar en una lista de p osibilidades, devolviendo un entero que represen ta el ndice del elemento que fue seleccionado. 80 4.4 Meto dos y funciones sobre los controles de los formularios 4.4.1 Meto dos ActivateControl Colo ca el fo co en el control esp ecicado. DlgCaption Cambiaelttulodelaventana de dialogo actual. DlgEnable Habilita/deshabilita el control esp ecicado. DlgFocus Colo ca el fo co en el control esp ecicado. DlgListBoxArray Rellena un control de lista (o variantes) con los elementos deunarray. DlgSetPicture Cambia la imagen contenida en el control (una imagen o un b oton con imagen). DlgText Cambia el texto contenido en el control esp ecicado. El resultado dep endera del tip o de control. DlgValue Cambiaelvalor de un control dado. El resultado dep enderadeltipodecontrol. DlgVisible Muestra u o culta el control esp ecicado. SelectButton Simula la pulsacion de un b oton de la ventana. SelectComboBoxItem Selecciona un tem de un cuadro combinadodelaventana. SelectListBoxItem Selecciona un tem de una lista de la ventana. SetCheckBox Marca el estado de un con trol de chequeo de la ventana. SetEditText Establece el contenido de un editor de texto la ventana. SetOption Selecciona un b oton de op cion de la ventana. 4.4.2 Funciones ButtonEnabled Devuelve True si el b oton esp ecicado en el formulario activoesta habilitado (si es as, puede ser pulsado utilizando la sentencia S el ectB utton ). ButtonExists Devuelve True si el b oton esp ecicado esta presente en el formulario activo. CheckBoxEnabled Devuelve True si el control de vericacion esp ecicado en el formulario activo esta habilitado (si es as, su valor puede ser establecido utilizando la sentencia S etC heck B ox ). CheckBoxExists Devuelve True si el control de vericacion esp ecicado esta presente en el formulario activo. ComboBoxEnabled Devuelve True si la lista combinada esp ecicada del formulario activo esta habilitada. ComboBoxExists Devuelve True si la lista combinada esp ecicada esta presente en el formulario activo. DlgControlId Devuelveunentero que representa el ndice del control esp ecicado tal y como aparece en la plantilla del formulario. DlgEnable Devuelve True si el control esp ecicado esta habilitado. 81 DlgFocus Devuelve una cadena que contiene el nombre del control que tiene el fo co. DlgListBoxArray Rellena una lista, una lista combinada o una lista ja combinada con los elementosdeunarray, devolviendo un entero que representa el n umero de elementos que hay actualmente en el control. DlgText$ Devuelveelcontenido textual del control esp ecicado. DlgValue Devuelve un entero que representa el valor del control esp ecicado. Suele ser el ndice del valor seleccionado dentro de un control (listas, grup os de op ciones, etc.). DlgVisible Devuelve True si el control esp ecicado esta visible. EditEnable Devuelve True si el control de edicion de textos esp ecicado esta habilitado en el formulario activo. EditExists Devuelve True si el control de edicion de textos esp ecicado existe en el formulario activo. GetCheckBox Devuelveunentero que representa el estado del control de vericacion esp eci- cado. GetComboBoxItem$ Devuelve una cadena que contiene el texto de un elemento dentro de una lista combinada. GetComboBoxItemCount Devuelve un entero que contiene el numero de elementos en la lista combinada esp ecicada. GetEditText$ Devuelve una cadena que es el contenido del control de edicion de textos esp ecicado. GetListBoxItem$ Devuelve una cadena que contiene el elemento esp ecicado en una lista. GetListBoxItemCount Devuelve un entero que contiene el numero de elementos en la lista esp ecicada. GetOption Devuelve True si el b oton de op cion esp ecicado esta activo. ListBoxEnabled Devuelve True si la lista esp ecicada esta habilitada en el formulario activo. ListBoxExists Devuelve True si la lista esp ecicada existe en el formulario activo. MenuItemChecked Devuelve True si el elemento de men u esp ecicado existe y su control de vericacion estaactivo. MenuItemEnabled Devuelve True si el elemento de men u esp ecicado existe y esta habilitado. MenuItemExists Devuelve True si el elemento de men u esp ecicado existe. OptionEnabled Devuelve True si el b oton de op cion esp ecicado esta habilitado en el formulario activo. OptionExists Devuelve True si el b oton de op cion esp ecicado existe en el formulario activo. PopupMenu Muestra un men u emergente que contiene los elementos esp ecicados, devolviendo un en tero que representa el ndice al elemento seleccionado. 82 4.5 Pro cesamiento de acciones sobre un formulario Cuando se pro duce una determinada accion sobre un formulario, BasicScript llama a una funcion esp ecial que tiene aso ciada y que gestionara el pro cesamiento de tal accion. La sintaxis para denir esta funcion es: F unction D l g P r oc ( C ontr ol N ame $  Action S uppV al ue ) As I nteg er Para aso ciar esta funcion a un formulario se indica mediante el parametro :D l g P r oc en la sentencia B eg in D ial og que lo dene. Los parametros que recib e la funcion aso ciada al formulario son: ControlName$ Cadena que contiene el nombre del control aso ciado con Action . Action Entero que representa la accion p or la que se llamo a la funcion. SuppValue Entero que contiene informacion extra aso ciada con dic ha accion. Cuando BasicScript visualiza un formulario se pro ducen diversos eventos debidos a la interaccion con el usuario: pulsacion de b otones, intro duccion de textos p or el teclado, seleccion de elementos de una lista y otros. Cuando se pro ducen estas acciones, BasicScript llama a la funcion aso ciada al formulario, pasandole como parametros: la accion que ha o currido, el nombre del control y otra informacion relevante. La siguiente tabla describ e las diferentes acciones que se pueden enviar a una funcion de formulario: 1 Esta accion es enviada inmediatamente antes de que el formulario se muestre p or primera vez: de esta forma se da la op ortunidad de preparar la utilizacion del formulario. Los demas parametros no son signicativos y se ignoraraelvalor resultado devuelto p or la funcion. 2 Esta accion es enviada cuando:  Se pulsa un b oton. En este caso, C ontr ol N ame $contendrasunombre y S uppV al ue sera: 1 si es un boton Ok , 2 si es un boton C ancel o un valor indenido si es otro b oton. Si la funcion devuelve 0 como respuesta entonces el formulario sera cerrado.  Se ha mo dicado el estado de un control de vericacion. En este caso, ControlN ame $ contendrasunombre y SuppV alue el nuevoestado(1siactivoo 0 si desactivo).  Se ha seleccionado un b oton de op cion. En este caso, C ontr ol N ame $contendrasu nombre y SuppV alue el ndice del b oton activado dentro del grup o de op ciones (que empieza en 0).  Se ha cambiado la seleccion actual de una lista o lista combinada. En esta caso, C ontr ol N ame $ contendra su nombre y SuppV alue el ndice del nuevotem seleccionado (que empieza en 0). 3 Esta accion es enviada cuando el contenido de un control de edicion de texto o una lista combinada ha sido mo dicado. Esta accion solo se enva cuando dicho control pierde el fo co. En este caso, ControlN ame $contendra su nombre y S uppV al ue la longitud del nuevocontenido. El valor que devuelvelafuncion es ignorado. 4 Esta accion es enviada cuando un control obtiene el fo co de control. C ontr ol N ame $contendra su nombre y S uppV al ue el ndice del control que p erdio el fo co (que empieza en 0). El valor que devuelve la funcion es ignorado. 83 5 Esta accion es enviada continuamente cuando un formulario esta inactivo. Si la funcion devuelve 1 en respuesta, entonces la accion \inactividad" volveraaserenviada. Pero si la funcion devuelve0, entonces la accion no volvera a rep etirse. En este caso, ControlN ame $ no contiene nada y S uppV al ue el n umero de veces que se ha enviado hasta el momento. 6 Esta accion es enviada cuando se mueveel formulario. En este caso, los parametros no son signicativos y se ignoraraelvalor devuelto p or la funcion. La funcion de un formulario no puede denir otros formularios, aunque s p o dra inv o car cualquier cuadro de dialogo predenido (tales como MsgBox o I nputB ox $). Por otro lado, las funciones de los formularios s p o dran utilizar otras sentencias y funciones de BasicScript , p ermitiendo la manipulacion de los controles del formulario de una manera dinamica. Estas son: D l g V isibl e , DlgT ext $, D l g T ext , D l g S etP ictur e , D l g ListB oxAr r ay , DlgF ocus , D l g E nabl e y D l g C ontr ol I d . El siguiente ejemplo habilita/deshabilita un grup o de b otones de op cion cuando un control de vericacion es activado/desactivado: Function FuncionFormulario(ControlName$, Action%, SuppValue%) If Action% = 2 And ControlName$ = ``Imprimir'' Then DlgEnable ``Op cionesImpresion'',SuppValue% SampleDlgPro c = 1 'No cerrar el formulario. End If End Function Sub Main() Begin Dialog PlantillaFormulario 34,39,106,45,``Ejemplo'',.FuncionFormulario OKButton 4,4,40,14 CancelButton 4,24,40,14 CheckBox 56,8,38,8,``Imprimir'',.Imprimir OptionGroup .Op cionesImpresion OptionButton 56,20,51,8,``Apaisado'',.Apaisado OptionButton 56,32,40,8,``Vertical'',.Vertical End Dialog Dim UnFormulario As PlantillaFormulario UnForm ulario.Printing = 1 r% = Dialog(UnFormulario) End Sub 84 Captulo 5 La gestion de errores 5.1 Intro duccion BasciScript ofrece un meto do para pro cesar de manera adecuada los errores que ocurren en tiemp o de ejecucion. 5.1.1 Denicion del gestor de errores Una plantilla generica para la denicion de un gestor de errores dentro de una subrutina p o dra ser: Sub UnaFuncion() On Error Goto catch 'Codigo de la funcion. Exit Sub catch: 'Codigo del Pro cesamiento del Error. End Sub Brevemente, la lnea de ejecucion ejecuta el codigo del algoritmo y si o curre un error, entonces la lnea de ejecucion se transere al codigo esp ecial para pro cesarlo. 5.1.2 La captura de un error La sentencia On E rror dene la accion a llevar a cab o cuando o curre un error capturable en tiemp o de ejecucion. La sintaxis es la siguiente: On Error f Goto l abel j Resume Next j Goto 0 g La forma O n E r r or Goto Label transere la lnea de ejecucion ala etiqueta esp ecicada cuando o curre un error. La forma O n E r r or Resume N ext fuerza la continuacion de la ejecucion por la sentencia que sigue a la causante del error. La forma O n E r r or Goto 0anula cualquier error capturado existente. 85 5.1.3 El pro cesamiento del error Una vez que el gestor del error tiene el control, deb era descubrir cual fue la condicion que causo el error y continuar la ejecucion con la sentencia Resume para reiniciar el gestor de errores, transriendo la ejecucion a un lugar apropiado dentro del pro cedimiento actual. La sintaxis es: Resume f &0] j Next j label g En el siguiente ejemplo se observan varios de sus usos que siguen la siguiente secuencia: El usuario teclea dos enteros para multiplicarlos. Si alguno de los n umeros es mayor que un entero, el programa ejecuta una rutina de error y la ejecucion del programa continua en una seccion esp ecca utilizando Resume <l abel > . Entonces se establece un nuevo punto de captura de errores, reiniciando el gestor de errores de la subrutina e indicando que el programa continue su ejecucion p or la siguiente sen tencia incluso si o curriera alg un error. Sub Main() Dim a%, b%, x% OtraVez: On Error Goto ErrorRango a% = InputBox(``Intro duzca el primer entero a multiplicar'',``Introduzcaunnumero'') b% = InputBox(``Intro duzca el segundo entero a multiplicar'',``Intro duzca un n umero'') On Error Resume Next 'Continua la ejecucion del programa en la x% = a% * b% 'siguiente lnea si o curre un error. if err = 0 then MsgBoxx% else Msgb ox a% & `` * '' & b% & `` sale del rango de los enteros'' end if Exit Sub ErrorRango: 'Gestor de errores. MsgBox ``Has intro ducido un valor no entero. <Intentalo otra vez!'' Resume OtraVez End Sub El error es anulado si el pro cedimiento termina sin hab er ejecutado esta sentencia. En general, existen cuatro formas para reiniciar el gestor de errores de manera que se p ermite que el pro cedimiento acab e sin visualizar ning un mensa je de error:  La ejecucion llega a una sentencia On E rror o Resume .  Se asigna ; 1a Err:N umber .  Se llama al meto do Err:C l ear .  La ejecucion llega a una sentencia E xit S ub , E xit F unction , E nd F unction o End Sub . 86 5.1.4 El pro ceso en cascada para capturar un error Una caracterstica esp ecial es que se p ermite el anidamiento de gestores de errores: si o curre un error dentro del gestor de errores, entonces se llamara al gestor de errores propio. En cualquier caso si durante la ejecucion o curre un error y no hay denido ning un gestor On E rror en el pro cedimiento, entonces BasicScript vuelve al pro cedimiento que lo llamo y ejecuta all el gestor de errores. Este pro ceso se repite hasta que se encuentra ese gestor, o no haya mas pro cedimientos. Si un error no se captura u o curre dentro de un gestor, BasicScript muestra un mensa je de error, deteniendose la ejecucion del script . 5.2 El ob jeto predenido Err Este ob jeto tiene las siguientes propiedades:  Err.Description Establece u obtiene la descrip cion del error.  Err.HelpContext Establece u obtiene el identicador de contexto en la ayuda para conseguir mas informacion sobre el error.  Err.HelpFile Establece u obtiene el nombre del chero de ayuda que contiene la informacion sobre el error.  Err.LastDLLError Obtiene el ultimo error generado p or una llamada externa.  Err.Number Establece u obtiene el n umero de error.  Err.Source Establece u obtiene la fuente de un error en tiemp o de ejecucion. Y ofrece los siguientes meto dos:  Err.Clear Inicializa las propiedades del ob jeto Err .Esto se realiza automaticamente cuando se ejecuta alguna de las siguientes sentencias: Resume , E xit F unction , On E rror y E xit S ub .  Err.Raise Genera un error en tiemp o de ejecucion, estableciendo las propiedades adecuadas en el ob jeto Err (y que se pasan como parametros).  Estas son: el n umero de error, la fuente del error, la descrip cion del error, el chero de ayuda con informacion sobre el error y el contexto dentro de la ayuda. 5.3 Funciones para la gestion de errores Algunas funciones que van a ayudar para gestionar los errores son: Erl Devuelveelnumerodelnea (dentro del script ) del error mas reciente. Error, Error$ Devuelve una cadena que contiene el texto que corresp onde al n umero de error dado o al error mas reciente. IsError Devuelve True si la expresion es un valor de error denido p or el usuario. 87 5.4 Compatibilidad con Visual Basic BasicScript tiene los mismos codigos y mensa jes de error que Visual Basic , facilitando la p ortabilidad entre estos entornos. Ello es debido a que BasicScript obtiene el error mediante la funcion Error o la propiedad Err:D escr iption . Hay tres categoras de errores: 1. Errores compatibles con Visual Basic (0 a 799). 2. Errores de BasicScript (800 a 999). 3. Errores denidos p or el usuario (  1000). 5.5 Otros ejemplos sobre la gestion de errores Muestran tres tip os de gestion de un error. El primer caso simplemente ignora el error capturado ycontinua la ejecucion del programa. El segundo caso ejecuta un salto hacia una rutina com un de pro cesamiento de errores, reinicia el gestor yreanuda la ejecucion del programa. El tercer caso reinicia el gestor, p or lo que la ejecucion se parara cuando aparezca el siguiente error. Sub Main() Dim x% a = 10000 b = 10000 On Error Goto Eqit0 'Cuando o curra un error, salta a esta etiqueta. Do x% = a * b Lo op Etiq0: Err = -1 'Inicializar la se ~nal de error. MsgBox ``Se ~nar de error inicializada y continuacion.'' On Error Goto ErrorRango 'Salto a una nueva rutina de error para x% = 1000 'los siguientes errores. x% = a * b x% = a / 0 On Error Goto 0 'Inicializar los saltos de error. x% = a * b 'El programa parara aqu. Exit Sub 'Salida previa a la rutina com un de errores. ErrorRango: 'Comienzo de la rutina com un de errores. If Err = 6 then MsgBox ``Salto p or Error en el Rango.'' Else MsgBox Error(Err) End If Resume Next End Sub 88 Right, Right$, RightB, RightB$ Devuelve la sub cadena formada por los n ultimos caracteres o bytes de la cadena esp ecicada. StrComp Comparacion de cadenas. StrConv Convierte la cadena esp ecicada seg un un parametro de conversion: mayusculas, min usculas, etc. String, String$ Devuelve una cadena de una longitud dada que se rellena con el caracter esp ecicado. Trim, Trim$, LTrim, LTrim$, RTrim, RTrim$ Devuelve una copia de la cadena pasada donde se han eliminado los espacios al inicio o al nal de la misma. UCase, UCase$ Devuelve la cadena de entrada en letras mayusculas. Word$ Devuelve una cadena que contiene la secuencia de palabras en tre dos puntos dados del texto esp ecicado. WordCount Devuelveunentero que representa el n umero de palabras en el texto esp ecicado. Algunas funciones sobre los tipos: CBo ol Convierte una expresion al tip o B ool ean . CCur Convierte una expresion al tip o C urrency . CDate, CVDate Convierte una expresion al tip o D ate . CDbl Convierte una expresion al tip o Double . CInt Convierte una expresion al tip o I nteg er . CLng Convierte una expresion al tip o Long . CSng Convierte una expresion al tip o S ing l e . CStr Convierte una expresion al tip o String . CVar Convierte una expresion al tip o Variant . CVErr Convierte una expresion en un n umero de error denido p or el usuario. IsDate Devuelve True si la expresion dada puede convertirse a una fecha. IsEmpty Devuelve True si la variable dada es de tip o Variant y no ha sido inicializada. Es equivalente a (VarType(expression) = ebEmpty) . IsNull Devuelve True si la variable dada es de tip o V ar iant y no contiene datos validos. Es equivalente a (VarType(expression) = ebNul l) . IsNumeric Devuelve True si la expresion puede convertirse a un n umero. IsOb ject Devuelve True si la variable dada es de tip o Variant ycontiene un ob jeto O bj ect . Str, Str$ Convierte un n umero en una cadena. Typ eName Devuelve el nombre del tip o de la variable esp ecicada. 95 Typ eOf ob jectvariable Is ob jecttyp e Devuelve True si obj ectv ar iabl e es del tip o obj ectty pe esp ecicado. Esta funcion es muy util para determinar el tip o de los ob jetos de automatizacion OLE . Val Convierte una determinada expresion cadena a un n umero. VarTyp e Devuelveunentero que representa el tip o de dato de la variable esp ecicada. Algunas funciones que no entran en categoras anteriores:  Ficheros de textos y binarios ( EOF , F il eAttr , FreeFile , Loc , Lof y Seek ).  Ficheros INI y el registro de Windows ( GetAl l S etting s , GetS etting , ReadI ni $).  Acceso a base de datos con SQL ( SQlBind , S QLC lose , S QLE rror , S QLE xecQuer y , S QLGetS chema , S QLO pen , S QLR eq uest , S QLR etr iev e y S QLR etr iev eT oF il e ).  Funciones estadsticas ( DDB , Fv , Ipmt , IRR , MIRR , NP er , Npv , Pmt , PPmt , Pv , Rate , Sln y SY D ).  Portapap eles (Clipb oard$).  Otras ( I M EStatus y M acI D ). 6.2 Conguracion de op ciones La sentencia O ption congura de manera global al script algunos asp ectos del pro cesamiento. Esta sentencia deb e aparecer fuera de cualquier blo que de subrutina o funcion. El lmite inferior de los arrays Por defecto, el lmite inferior es 0, p ero se puede p oner a 1. La sintaxis que sigue es: Option Base f 0 j 1 g Por ejemplo: Option Base 1 Sub Main() Dim a(10) 'Contiene 10 elementos (y no 11). End Sub La comparacion de cadenas Se puede controlar el mo do en que se comparan las cadenas. Por defecto el mo do es B inar y (la comparacion es sensitiva a las mayusculas). Se puede cambiar al mo do Text (la comparacion no es sensitiva). La sintaxis es: Option Compare &Binary j Text] Por ejemplo: Option Compare Binary 'Comparacion sensitivaa mayusculas. 96 Sub ComparaSensitiva a$ = ``Esta Cadena Contiene MAY  USCULAS.'' b$ = ``esta cadena contiene mayusculas.'' If a$ = b$ Then MsgBox ``Las dos cadenas fueron comparadas de manera no sensitiva.'' Else MsgBox ``Las dos cadenas fueron comparadas de manera sensitiva.'' End If End Sub Option Compare Text 'Comparacion no sensitivaamayusculas. Sub ComparaNoSensitiva a$ = ``Esta Cadena Contiene MAY  USCULAS.'' b$ = ``esta cadena contiene mayusculas.'' If a$ = b$ Then MsgBox ``Las dos cadenas fueron comparadas de manera no sensitiva.'' Else MsgBox ``Las dos cadenas fueron comparadas de manera sensitiva.'' End If End Sub Sub Main() ComparaSensitiva 'Llama a la subrutina denida previamente. ComparaNoSensitiva 'Llama a la subrutina denida previamente. End Sub Las cadenas de escap e al estilo de sc C Habilita o deshabilita la utilizacion de las secuencias de escap e al estilo de C en las cadenas. Cuando esta habilitado, el compilador trata el caracter n como el inicio de una secuencia de escap e (los tpicos n r, n n, n r, n t, etc.). Por defecto, estaop cion esta deshabilitada. La sintaxis que sigue es: Option CStrings f On j O. g Por ejemplo: Option CStrings On Sub Main() MsgBox ``Ellos dijeron, n ``<Mira aquello! n '''' MsgBox ``Primera lnea. n r n nSegunda lnea.'' MsgBox ``Caracter A: n x41 n r n nCaracter B: n x42'' End Sub Tip o por defecto de las variables Establece el tip o p or defecto para las variables y funciones cuando no se esp ecica. Por defecto, este tip o es V ar iant . Actualmente, solo se puede esp ecicar I nteg er como tip o alternativo(para mantener compatibilidad con anteriores versiones de BasicScript . La sintaxis que sigue es: 97 Option Default ty pe Por ejemplo: Option Default Integer Function SumaEnteros(a As Integer,b As Integer) SumaEnteros = a + b End Function Sub Main Dim a,b,resultado a = InputBox(``Teclee un entero:'') b = InputBox(``Teclee otro entero:'') resultado = SumaEnteros(a,b) End Sub Sobre la declaracion implcita Se utiliza para prevenir la declaracion implcita de las variables y los pro cedimientos externos. La sintaxis que sigue es: Option Explicit 6.3 Propiedades y meto dos de los ob jetos predenidos 6.3.1 El ob jeto Basic Propiedades  Basic.Architecture $ Una cadena que contiene la plataforma sobre la que se ejecuta BasicScript . Algunas de ellas son \ I ntel ", \ PowerPC ", \ Al phaAX P ", etc. Esta cadena estavaca si la arquitectura no puede ser determinada.  Basic.CodePage Un entero que representa la pagina de codigos de caracteres lo cal.  Basic.Eoln $ Una cadena que contiene la secuencia de n de lnea apropiada a la plataforma actual.  Basic.FreeMemory Un entero largo que representa el numero de bytes de memoria libre en el espacio de datos de BasicScript (el tama ~no del blo que libre mas grande). Previamente, el espacio de datos es compactado para consolidar el espacio libre en un blo que unico. Este espacio contiene las cadenas y arrays dinamicos.  Basic.HomeDir $ Una cadena que contiene el directorio donde se ubica BasicScript .  Basic.Locale $ Una cadena que contiene informacion del entorno lo cal donde se esta ejecutando BasicScript : formatos de fecha y hora, conguracion dep endiente del pas y analogos. 98  Basic.OperatingSystem $ Una cadena que contiene el nombre del sistema op erativo. Estos valores son: \ W indow s ", \ W indow sf or W or k g r oups ", \ Win 32 s ", \ W indow s 95", \ W indow sN T ", \ OS= 2", \ M acintosh "y\ N etw ar e ".  Basic.OperatingSystemVendor $ Una cadena que contiene el fabricante del sistema op erativo sobre el que se ejecuta BasicScript . Estos valores son: \ M icr osof t ", \ IBM ", \ Appl e ", etc.  Basic.OperatingSystemVersion $ Una cadena que contiene la version del sistema op erativo sobre el que se ejecuta BasicScript .  Basic.OS Un entero indicando la plataforma actual. Estas constantes son: ebW in 16, ebW in 32, ebM acintosh , ebS ol ar is ,etc. Es muy apropiada para la creacion de scripts multiplataforma.  Basic.PathSeparator $ Una cadena que contiene el separador en las cadenas de directorio de la plataforma actual.  Basic.Processor $ Una cadena que contiene el nombre del pro cesador en el ordenador donde se ejecuta BasicScript . Esta cadena estaravaca si no es capaz de establecerlo.  Basic.ProcessorCount Un entero que representa el n umero de pro cesadores presentes.  Basic.Version $ Una cadena que contiene la version de BasicScript en el formato maj or:minor:B uil dN umber . Meto dos El meto do Basic.Capability devuelve True si plataforma actual admite la capacidad que se esp ecica (pasada como parametro). 6.3.2 El ob jeto HWND Propiedades La propiedad por defecto de un ob jeto HW N D devuelve un Variant que contiene un gestor ( HAN DLE )delaventana fsica de una variable ob jeto HW N D . Su sintaxis es window .Value . Esta propiedad es de solo lectura, y se utiliza para obtener el valor de un ob jeto HW N D en el entorno op erativo actual. Su tama ~no dep endera del sistema en el que se ejecuta el script ypor lo tanto siempre sera guardado en una variable Variant . En el siguiente ejemplo se visualiza una ventana que contiene el nombre de clase de la ventana del \Program Manager's" y lo hace utilizando la propiedad :V al ue , pasandola directamente a una rutina externa: Declare Sub GetClassName Lib ``user'' (ByVal Win%,ByVal ClsName$,ByV al ClsNameLen%) Sub Main() Dim ProgramManager As HWND Set ProgramManager = WinFind(``Program Manager'') ClassName$ = Space(40) GetClassName ProgramManager.Value,ClassName$,Len(ClassName$) MsgBox ``El nombre de clase del programa es: '' & ClassName$ End Sub 99 6.3.3 El ob jeto Msg Propiedades La propiedad Msg.Thermometer cambia el p orcenta je marcado en el termometro de una ventana de mensa je (abierta previamente con el meto do Msg:Open ). Si la ventana no esta abierta o el valor esta fuera del intervalo 0{100 se genera un error. Meto dos Los siguientes meto dos son esp eccos para Windows.  Msg.Open Muestra una ventana de mensa je con un b oton de cancelacion y un termometro que son op cionales. Tiene varios parametros: el texto del mensa je, el tiemp o que se mostrara el mensa je, si aparece el b oton de cancelacion, si aparece el termometro y la p osicion de la ventana. La ventana es no mo dal, p or lo que p ermanecera abierta hasta que el usuario seleccione la cancelacion, expire el tiemp o indicado o se ejecute el meto do Msg:Close . Solo podra hab er uno de estos mensa jes al mismo tiemp o y se quitaraautomaticamente cuando termine el script . Hay que llamar p eriodicamente al pro cedimiento DoE vents para pasar el control al sistema: de esta manera se cierra la ventana cuando se pulse el boton de cancelacion.  Msg.Close Cierra la ventana de mensa je no mo dal. 6.3.4 El ob jeto Screen Propiedades  Screen.DlgBaseUnitsX Un entero que se utiliza para realizar la conversion pxeles/unidades de dialogo en el eje horizontal. Este valor dep endera de la fuente utilizada en las ventanas de dialogo. Para pasar de pxeles a unidades: (( X P ixel s  4) + ( S cr een:D l g B aseU nitsX ; 1)) =S cr een:D l g B aseU nitsX Para pasar de unidades a pxeles: ( X D l g U nits  S cr een:D l g B aseU nitsX ) = 4)  Screen.DlgBaseUnitsY Un entero que se utiliza para realizar la conversion pxeles/unidades de dialogo en el eje vertical. Este valor dep endera de la fuente utilizada en las ventanas de dialogo. Para pasar de pxeles a unidades: ( Y P ixel s  8) + ( S cr een:D l g B aseU nitsY ; 1) =S cr een:D l g B aseU nitsY Para pasar de unidades a pxeles: ( YDlgUnits  S cr een:D l g B aseU nitsY ) = 8  Screen.Height Un entero que representa la altura en pxeles de la pantalla. Es una propiedad de solo lectura.  Screen.TwipsPerPixelX Un entero que representa el numero de twips por pxel en el eje horizontal del disp ositivode pantalla instalado. La propiedad es de solo lectura. 100  Screen.TwipsPerPixelY Un entero que representa el numero de twips por pxel en el eje vertical del disp ositivode pantalla instalado. La propiedad es de solo lectura.  Screen.Width Un entero que representa la anchura en pxeles de la pantalla. Es una propiedad de solo lectura. 6.3.5 El ob jeto System Propiedades To das ellas son esp eccas del entorno Windows .  System.FreeMemory Un entero largo que indica el n umerodebytes de memoria libre.  System.FreeResources Un entero que representa el p orcenta je de recursos libres del sistema. Es un valor entre 0 y 100.  System.TotalMemory Un entero largo que representa el n umero de bytes de la memoria libre disp onible.  System.WindowsDirectory $ Una cadena que contiene el directorio donde se encuentra el sistema op erativo.  System.WindowsVersion $ Una cadena que contiene la version del sistema op erativo. 6.3.6 El ob jeto Clipboard Meto dos  Clipboard.Clear Borra el contenido del p ortapap eles.  Clipboard.GetFormat Devuelve True si los datos disp onibles en el p ortapap eles siguen un determinado formato (que se pasa como parametro).  Clipboard.GetText Devuelve el texto que contiene el p ortapap eles.  Clipboard.SetText Copia el texto esp ecicado (pasado como parametro) en el p ortapap eles. 6.3.7 El ob jeto Desktop Meto dos Los siguientes meto dos son esp eccos para Windows.  Desktop.ArrangeIcons Reorganiza las aplicaciones minimizadas en la pantalla.  Desktop.Cascade Reorganiza en cascada las ventanas no minimizadas.  Desktop.SetColors Cambia los colores del sistema a un conjunto de colores predenido (que se pasa como parametro).  Desktop.SetWal lpaper Cambia el tapiz de la pantalla al mapa de bits esp ecicado (que se pasa como parametro). 101  Desktop.Snapshot Toma una seccion de la pantalla y la salvaen el clipb oard como un mapa de bits.  Desktop.Tile Reorganiza to das las ventanas no minimizadas de manera que no se sup erp ongan. 6.3.8 El ob jeto Net Meto dos Los siguientes meto dos son esp eccos para Windows.  Net.CancelCon Cancela una conexion de red.  Net.Dialog Visualiza una ventana de dialogo que p ermite congurar la red actualmente instalada.  Net.GetCaps Devuelve un entero que informa sobre la red y sus capacidades, seg un el tip o requerido de informacion (que se pasa como parametro).  Net.GetCon $ Devuelve el nombre del recurso de red aso ciado al disp ositivo lo cal que esta redireccionado.  Net.User $ Devuelv e informacion sobre el usuario conectado a la red. 6.3.9 El ob jeto Viewport Meto dos Los siguientes meto dos son esp eccos para Windows.  Viewport.Clear Limpia la ventana esp ecial abierta.  Viewport.Close Cierra la ventana esp ecial abierta.  Viewport.Open Abre una ventana esp ecial para mostrar informacion. Acepta como parametros el ttulo de la ventana, la p osicion y el tama ~no. En combinacion con la sentencia P r int , estas ventanas son apropiadas para la salida de informacion de depuracion. Esta ventana se cierra automaticamente cuando la aplicacion que la abrio termina. Solo se puede tener una ventana abierta cada vez. El tama ~no maximo del bu.er que tiene aso ciado es de 32K., por lo que la informacion al principio del mismo sera b orrada para hacer hueco cuando se intro duce nuevos datos p or el nal. Por ejemplo: Sub Main() Viewp ort.Op en ``Ventana esp ecial de BasicScript'',100,100,500,500 Print ``Esto se visualizaraenuna ventana esp ecial.'' Sleep 2000 Viewp ort.Close End Sub 102 6.4 Directivas de prepro cesador 6.4.1 La directiva #Const Dene una constante para ser utilizada en la otra directiva del prepro cesador #If...Then...#Else. Su sintaxis es: #Const constname = expr ession Internamente, to das estas constantes son de tip o V ar iant . Por lo tanto, la expresion puede ser de cualquier tip o. Por ejemplo: #Const SUBPLATFORM = ``NT'' #Const MANUFACTURER = ``Windows'' #Const TYPE = ``Workstation'' #Const PLATFORM = MANUFACTURER & `` '' & SUBPLATFORM & `` '' & TYPE Sub Main() #If PLATFORM = ``Windows NT Workstation'' Then MsgBox ``Ejecutandose ba jo Windows NT Workstation'' #End If End Sub 6.4.2 La directiva #If...Then...#Else Fuerza al compilador la inclusion o exclusion de secciones del codigo basandose en unas condiciones dadas. La sintaxis de esta directiva es: #If expr ession Then & statements ] &#ElseIf expr ession Then & statements ]] &#Else & statements ]] #End If La expresion representa cualquier expresion valida de BasicScript que evalue un tip o b o oleano. Puede consistir de literales, op eradores, constantes denidas con # Const o alguna de las constantes predenidas del prepro cesador (p or ejemplo, Win 32 es True si el entorno de desarrollo esta basado en Windows para 32{bits). Cualquier constante no denida evaluaraa E mpty . Por ejemplo: #Const VERSION = 2 Sub Main #If VERSION = 1 Then directory$ = `` n apps n widget'' #ElseIf VERSION = 2 Then directory$ = `` n apps n widget32'' 103 #Else MsgBox ``Version descono cida.'' #End If End Sub Una utilizacion habitual de esta directiva es la inclusion op cional de sentencias de depuracion en el codigo. El siguiente ejemplo muestra como se puede depurar el codigo si se incluye condicionalmente el chequeo de parametros a una funcion: #Const DEBUG = 1 Sub CambiarFormato(NuevoFormato As Integer, TextoEstado As String) #If DEBUG = 1 Then If NuevoFormato <> 1 And NuevoFormato <> 2Then MsgBox ``Parametro '' ``NuevoFormato'' `` es invalido.'' Exit Sub End If If Len(TextoEstado) > 78 Then MsgBox ``Parametro '' ``TextoEstado'' `` es demasiado largo.'' Exit Sub End If #End If Rem Cambiar el formato aqu... End Sub El siguiente ejemplo llama a una rutina externa. Estas llamadas son muy esp eccas de la plataforma, por lo que tendremos que escribir el codigo adecuado para cada una de ellas, pro duciendo un codigo multiplataforma: #If Win16 Then Declare Sub GetWindowsDirectory Lib ``KERNEL'' (ByVal DirName As String,ByVal MaxLen As Integer) #ElseIf Win32 Then Declare Sub GetWindowsDirectory Lib ``KERNEL32'' Alias ``GetWindowsDirectoryA'' (ByVal DirName As String,ByVal MaxLen As Long) #End If Sub Main() Dim NombreDir As String * 256 GetWindowsDirectory NombreDir,len(NombreDir) MsgBox ``El directorio de Windows es '' & NombreDir End Sub 104