Anda di halaman 1dari 337

RBsoftware (2001)

Traduccin al Espaol de

Visual Basic Books Online

INDICE
DESCRIPCIN DEL TPICO
Desarrollar una aplicacin en Visual Basic (17) Conceptos de Visual Basic (17) Cmo trabaja Windows: Ventanas, Eventos y Mensajes (17) Comprender el modelo conducido por eventos (17) Desarrollo interactivo (18) Elementos del ambiente de desarrollo integrado (18) Barra de mens (18) Mens contextuales (18) Barras de herramientas (19) Caja de herramientas (19) Ventana de exploracin del proyecto (19) Ventana de propiedades (19) Hojear objetos (19) Diseador de formularios (19) Ventana editora de cdigo (19) Ventana modelo de formulario (19) Ventanas inmediatas, locales y de observacin (19) Opciones adicionales (19) Opciones de ambiente (20) Interfases SDI o MDI (20) Ventanas atracadas (20) Su primera aplicacin en Visual Basic (20) Crear la interfase (20) Cambiar de tamao, mover y echar llave a los controles (21) Establecer propiedades (22) Escribiendo cdigo (22) Creacin de procedimientos de evento (23) Ejecutando la aplicacin (24) Formularios, controles y mens (24) Comprender lo que son propiedades, mtodos y eventos (24) Diseando un formulario (25) Establecer propiedades al formulario (25) Mtodos y eventos de formularios (26) Dndole clic a los botones para ejecutar acciones (26) Usando botones de comando (26) Controles para desplegar texto y para dar entrada a texto (29) Uso de LABEL para desplegar texto (29) Cambiar de tamao el LABEL para ajustarlo al contenido (29) Ejemplo de programa word wrap y auto size (29) Trabajando con text boxes (31) Lneas de texto mltiple y word wrap (31) Trabajando con texto en un Text Box (32) Controles que presentan elecciones al usuario (35) Seleccionar opciones individuales con Check Boxes (35) Agrupar las opciones con los OptionButton (37) Creacin de grupos de OptionButton (37) Contenedores para controles (37) Seleccionar o deshabilitar botones de opcin (38) Uso de ListBoxes y ComboBoxes (40) Uso de Scroll Bars como dispositivos de entrada (41)

Controles que despliegan imgenes y grficos (41) Trabajando con el control PictureBox (41) Uso del PictureBox como contenedor (42) Otros usos del PictureBox (42) Controles grficos peso pluma (42) Uso de controles Image en vez de PictureBox (42) Uso del control Image para crear sus propio botones (43) Uso de los controles Shape y Line (43) Controles adicionales (48) Controles para acceso de datos (48) Controles del sistema de archivos (48) Controles miscelneos (48) Entendiendo el enfoque (49) Estableciendo el orden TAB (49) Excluir un control del orden TAB (50) Mens bsicos (50) Mens Pop-up (50) Uso del editor de mens (51) Requerir al usuario con caja de dilogo (51) Manejando proyectos (51) Trabajando con proyectos (52) El explorador de proyectos (52) El archivo proyecto (52) La estructura de un proyecto Visual Basic (52) Mdulos de formularios (52) Mdulos de clases (52) Mdulos estndar (53) Archivos de recursos (53) Documentos ActiveX (53) Mdulos de pginas de propiedades y controles de usuario (53) Componentes (53) Controles ActiveX (53) Objetos insertables (53) Referencias (53) Diseadores ActiveX (53) Controles estndar (53) Creando, abriendo y salvando proyectos (53) Trabajando con mltiples proyectos (54) Agregando, eliminando y salvando archivos (54) Intercalar texto (55) Agregando controles a un proyecto (55) Agregando controles ActiveX al proyecto (55) Borrando controles de un proyecto (55) Usando objetos de otras aplicaciones (55) Usando un archivo de recursos (56) Haciendo y activando un archivo ejecutable (56) Compilacin condicional (57) Estableciendo opciones del proyecto (57) Usando Wizards y Add Ins (57) Usando el Add In Manager (57) Usando Wizards (58) Fundamentos de programacin (58) La estructura de una aplicacin Visual Basic (58) Cmo trabaja una aplicacin conducida por eventos (59) Antes de que comience a codificar (60) Mecnica de la escritura de cdigo (60)

Mdulos de cdigo (60) Mdulos de formularios (60) Mdulos estndar (61) Mdulos de clases (61) Usando el editor de cdigo (61) Terminacin de cdigo automtica (62) Cdigo bsico (62) Descomponer una declaracin en mltiples lneas (62) Combinando declaraciones en una lnea (62) Agregar comentarios a su cdigo (62) Entendiendo el sistema de numeracin (63) Convencin sobre creacin de nombres en Visual Basic (63) Introduccin a variables, constantes y tipos de datos (64) Variables (64) Almacenamiento y recuperacin de datos en variables (64) Declarando variables (64) Declaraciones implcitas (65) Declaraciones explcitas (65) Entendiendo el alcance de las variables (66) Asignando el alcance a las variables (66) Variables usadas dentro de un procedimiento (66) Variables usadas por todos los mdulos (67) Tpicos sobre variables avanzadas (67) Variables locales versus variables pblicas (68) Ensombrecer propiedades de formularios y controles (69) Usando variables y procedimientos con el mismo nombre (69) Variables estticas (69) Declarando como Static todas las variables locales (70) Constantes (70) Creando sus propias constantes (70) Alcance de las constantes definidas por el usuario (71) Evitando referencias circulares (71) Tipos de datos (71) Declarando variables con tipos de datos (72) Tipos de datos numricos (72) El tipo de datos Byte (72) El tipo de datos de cadena (73) Intercambiando cadenas y nmeros (73) Tipo de datos booleano (74) Tipo de datos de fecha (74) El tipo de datos objeto (74) Conversin de tipos de datos (74) El tipo de datos Variant (75) El valor Empty (75) El valor Null (75) El valor Error (76) Tpicos Variant Avanzados: Representacin interna de los valores en Variants (76) Valores numricos almacenados en Variants (77) Cadenas almacenadas en Variants (77) Valores de tiempo y fecha almacenados en Variants (78) Objetos almacenados en Variants (79) Arreglos (79) Declarando arreglos de tamao fijo (80) Estableciendo las fronteras superiores e inferiores (80) Arreglos que contienen otros arreglos (80)

Arreglos multidimensionales (81) Usando bucles para manipular arreglos (81) Arreglos dinmicos (81) Preservando el contenido de los arreglos dinmicos (82) Introduccin a procedimientos (83) Sub procedimientos (83) Procedimientos generales (83) Procedimientos de evento (83) Procedimientos de funcin (84) Trabajando con procedimientos (85) Seleccin de procedimientos existentes (85) Llamando procedimientos (85) Llamando sub procedimientos (85) Llamando procedimientos de funcin (85) Llamando procedimientos en otros mdulos ((86) Procedimientos en formularios (86) Procedimientos en mdulos de clases (86) Procedimientos en mdulos estndar (86) Pasando argumentos a procedimientos (86) Tipos de datos en los argumentos (87) Pasando argumentos por valor (87) Pasando argumentos por referencia (87) Introduccin a estructuras de control (88) Estructuras de decisin (88) If...Then (88) IfThenElse (88) Select Case (89) Estructuras de bucles (90) DoLoop (90) ForNext (91) For EachNext (92) Trabajando con estructuras de control (92) Saliendo de una estructura de control (93) Saliendo de un procedimiento Sub o procedimiento de Funcin (93) Trabajando con objetos (94) Qu es un objeto? (94) De dnde provienen los objetos? (94) Qu puede hacer con objetos? (95) Visual Basic puede combinar objetos de otras fuentes (95) Las bases para trabajar con objetos (95) Controlando eventos con sus propiedades (95) Estableciendo valor a las propiedades (96) Obteniendo valor de las propiedades (96) Ejecutando acciones con mtodos (96) Usando mtodos en cdigo (96) Cmo se relacionan los objetos? (97) Jerarquas de objetos (97) Trabajando con colecciones de objetos (97) Aplicando propiedades y mtodos a los miembros de la coleccin (97) Objetos que contienen otros objetos (98) Colecciones comunes en Visual Basic (98) La propiedad Container (98) Comunicacin entre objetos (99) Creacin de objetos (99) Usando las variables objeto (99) Declarando variables objeto (99)

Asignando variables objeto (100) Tipos de objetos especficos y genricos (100) Formularios como objetos (101) Agregar mtodos y propiedades particulares (101) Usando la palabra reservada New (101) Usando la palabra reservada New con formularios (102) Uso de la palabra reservada New con otros objetos (102) Restricciones de la palabra reservada New (102) Liberacin de referencias a objetos (103) Pasando objetos a procedimientos (103) Qu puede hacer con Visual Basic? (104) Creacin de la interfase de usuario (104) Estilos de interfases (104) Aplicaciones de interfases de documentos mltiples (105) Creacin de una aplicacin MDI (105) Trabajando con formularios MDI Child en tiempo de diseo (106) Caractersticas en tiempo de ejecucin de los formularios MDI (106) La aplicacin NotePad MDI (106) Trabajando con formularios MDI y formularios Child (107) Especificando el formulario Child o el control activos (107) Cargando formularios MDI y formularios Child (108) Estableciendo el tamao y la posicin del formulario Child (108) Manteniendo informacin de estado para un formulario Child (109) Descargando formularios MDI con Query Unload (109) Ms acerca de formularios (110) Estableciendo el formulario startup (110) Comenzando sin un formulario startup (110) Desplegar un splash screen como startup (110) Finalizando una aplicacin (111) Usando mens en su aplicacin (112) Creando mens con el men editor (112) Usando el Listbox en el men editor (112) Para crear controles de men en el men editor (112) Separacin de elementos de men (113) Para crear una barra separadora en el men editor (113) Asignando teclas de acceso y teclas corta camino (113) Teclas de acceso (113) Para asignar una tecla de acceso a un control de men en el men editor (113) Teclas acorta camino (shortcut) (114) Para asignar un shortcut a un elemento de men (114) Gua para ttulos de men y para creacin de nombres (114) Estableciendo la propiedad Caption (114) Convenio para nombramiento de men (114) Creacin de sub mens (114) Para crear un sub men (115) Creacin de arreglo de control de men (115) Para crear un arreglo control de men en el men editor (115) Creacin y modificacin de mens en tiempo de ejecucin (116) Activando y desactivando comandos de men (116) Desplegando una marca sobre el control de men (116) Haciendo invisibles los controles de men (116) Agregando controles de men en tiempo de ejecucin (117) Escribiendo cdigo para controles de men (117) Desplegando mens pop-up (117) El argumento flags (118) El argumento Boldcommand (119)

Mens en aplicaciones MDI (119) Creacin de mens para aplicaciones MDI (119) Creando un men de ventana (window men) (119) Para establecer la propiedad window-list (120) Organizando formularios child (120) Barras de herramientas (toolbars) (120) Creacin de una barra de herramientas (120) Para crear manualmente una barra de herramientas (121) Escribiendo cdigo para las barras de herramientas (121) Negociando el aspecto del men y de las barras de herramientas (122) Controlando el aspecto del men (122) Controlando el aspecto de las barras de herramientas (122) Cajas de dilogo (122) Cajas de dialogo modales y no modales (123) Usando cajas de dialogo predefinidas (123) Requerimiento de entrada con Inputbox (124) Desplegando informacin con MsgBox (124) Usando formularios como cajas de dialogo personalizadas (124) Agregando un ttulo (125) Estableciendo propiedades de cajas de dialogo estndar (125) Agregando y situando botones de comando (125) Estableciendo Default, cancel y focus (126) Desactivando controles en una caja de dialogo (126) Desplegando una caja de dialogo personal (126) Opciones de despliegue (126) Diseando para diferentes tipos de despliegue (127) Diseando formularios de resolucin independiente (127) Diseando para diferentes colores de profundidad (128) Diseando con el usuario en mente (128) Lo bsico en el diseo de interfases (129) Significado: cmo se mira y se siente una aplicacin (129) Disposicin de los controles (129) Consistencia de los elementos de la interfase (129) Significado: los formularios siguen una funcin (130) Uso del espacio en blanco (130) Mantngalo simple (131) Uso del color e imgenes (131) Imgenes e iconos (132) Eleccin de fuentes (132) Diseando para facilidad de uso (132) Qu es una buena interfase? (132) Lineamientos de interfases windows (133) Probando la facilidad de uso (133) Descubrimiento de caractersticas (133) Cuando las cosas van mal: interactuando con el usuario (134) Creacin de cajas de dialogo inteligentes (134) Manejando errores sin cajas de dialogo (134) Diseando un modelo de asistencia al usuario (135) Ayuda y documentacin (135) Dispositivos de asistencia al usuario (136) ToolTips (136) Whats this help (136) Despliegue de estados (136) Wizards (137) Usando los controles estndar de Visual Basic (137) Introduccin a los controles de Visual Basic (137)

Categoras de controles (137) Controles intrnsecos (137) Controles ActiveX estndar (138) Agregar y remover controles ActiveX (139) Convenciones para nombramiento de controles (139) Usando el valor de un control (139) Trabajando con arreglos de controles (140) Por qu usar arreglos de controles? (140) Aplicacin de ejemplo: Calc.vbp (141) Creacin de un arreglo de controles en tiempo de diseo (141) Agregando un arreglo de controles en tiempo de ejecucin (142) Escenario de Controles: (143) Agregando y borrando controles en un arreglo de controles (143) Eventos en la aplicacin del arreglo de controles (143) Usando el control CheckBox (144) La propiedad Valor (144) El evento Clic (144) Respondiendo al ratn y al teclado (145) Visualmente realzando el control CheckBox (145) Usando el control ComboBox (145) Cundo usar un ComboBox en vez de un Listbox (145) Caractersticas de sujecin de datos (145) Estilos ComboBox (146) ComboBox drop down (146) ComboBox simple (146) Drop down Listbox (146) Agregando elementos (146) Agregando elementos en tiempo de diseo (147) Agregando un elemento a una posicin especifica (147) Clasificando una lista (147) Removiendo elementos (147) Obteniendo el contenido de la lista con la propiedad Text (147) Accediendo a los elementos de la lista con la propiedad List (148) Determinando la posicin con la propiedad ListIndex (148) Retornando el nmero de elementos con la propiedad ListCount (148) Usando el control CommandButton (148) Agregando un botn de comando a un formulario (149) Estableciendo el ttulo (Caption) (149) Creacin de keyboard short-cuts (149) Especificando las propiedades default y cancel (149) Seleccionando el botn de comando (149) La propiedad Valor (149) El evento clic (149) Visualmente realzando el botn de comando (150) Usando el control CommonDialog (150) Para usar el control CommonDialog (150) Usando el DataControl (154) Usando los controles DataBound, Dbcombo, Dblist y Dbgrid (155) Los controles DataBound Listbox y ComboBox (155) El control DataBoundGrid (155) Usando los controles File System: (155) DirectoryListBox, DriveListBox y FileListBox (155) Aplicacin de ejemplo: WinSeek.vbp (155) Examinando el sistema de archivos (155) La caja de lista de dispositivos (DriveListBox) (156) La caja de lista de directorios (DirectoryListBox) (156)

Identificando directorios individuales (156) Estableciendo el directorio actual (157) Dndole clic a un elemento de directorio (157) Encontrando la posicin relativa de un directorio (157) La caja de lista de archivos (FileListBox) (157) Trabajando con atributos de archivos (158) Usando juntos los controles del sistema de archivos (FileSystem) (158) Escenario de controles del sistema de archivos (159) Escribiendo cdigo para la aplicacin WinSeek (159) El evento Change del DriveListBox (160) El evento Change del DirListBox (160) El evento clic del botn de comando (161) Usando el control FlexGrid de Microsoft (161) Posibles usos (161) Aplicacin de ejemplo: Flex.vbp (161) Control FlexGrid: Escenario 1: (162) Clasificacin e intercalacin de datos (162) Establecer propiedades del control FlexGrid (162) Creacin de datos (162) Definir rutinas para calcular un ndice y hacer una clasificacin (162) Definir rutinas para entrar los datos en FlexGrid (163) Permitir que FlexGrid cambie de escenarios en trminos de organizacin de datos (163) Control FlexGrid Escenario 2: (164) Hoja de trabajo con edicin de celdas (164) Setup (164) Crear controles (164) Agregar encabezados a filas y columnas (164) Agregar edicin de celdas (165) Agregar funcin al TextBox para actualizacin de datos (165) Copiar datos de un TextBox a un FlexGrid (166) Control FlexGrid Escenario 3: (166) Despliegue resaltado con encabezados (166) Establezca las propiedades del control FlexGrid (166) Crear datos (167) Agregar funcin colapso y expansin (168) Usando el control Frame (168) Agregando un control Frame a un formulario (169) Dibujando controles dentro del Frame (169) Seleccionando mltiples controles en un Frame (169) Usando los controles Barras de Navegacin Horizontal y Vertical (169) Cmo trabaja el control Barras de Navegacin (169) La propiedad Value (169) Las propiedades LargeChange y SmallChange (170) Control Barras de Navegacin Escenario: (170) Creacin de una ventana grfica navegable (170) Ajustando el formulario en tiempo de ejecucin (171) Usando el control Image (171) Cundo usar un control Image en vez de un control PictureBox (172) Formatos grficos soportados (172) Cargando un grfico dentro de un control Image (172) Usando el Clipboard (173) La propiedad Stretch (173) Usando el control Label (173) Estableciendo la propiedad Caption del control Label (173) Alineacin de texto (173) Las propiedades AutoSize y WordWrap (173)

Usando Label para crear teclas de acceso (174) Usando el control Line (174) Estableciendo estilo de borde y color (174) Moviendo y ajustando la lnea (175) Dibujando lneas en un formulario (175) Usando el control Listbox (175) Caractersticas de sujecin de datos (DataBound) (175) Eventos clic y doble clic (175) Agregando elementos a la lista (176) Agregando un elemento a una posicin especificada (176) Agregando elementos en tiempo de diseo (176) Clasificando una lista (176) Removiendo elementos de la lista (177) Obteniendo contenido de la lista con la propiedad Text (177) Accediendo a elementos de la lista con la propiedad List (177) Determinando la posicin con la propiedad ListIndex (177) Retornar el nmero de elementos con la propiedad ListCount (177) Creacin de Listbox con columnas mltiples y selecciones mltiples (178) Control Listbox Escenario 1: (178) Agregando y borrando elementos (178) Eventos en la aplicacin Listbox (179) Control Listbox Escenario 2: (179) Creacin de Listbox de columnas mltiples (180) Eventos en la aplicacin Listbox columnas mltiples (180) Usando el control contenedor OLE (181) Usando el control OptionButton (182) Creacin de grupos OptionButton (182) Seleccionando un OptionButton en tiempo de ejecucin (182) El evento clic (182) La propiedad Value (182) Creacin de teclas de acceso (keyboard shortcuts) (183) Desactivando un OptionButton (183) Visualmente mejorando el control OptionButton (183) Usando el control PictureBox (183) Formatos grficos soportados (183) Cargando un grfico dentro de un control PictureBox (183) Usando el Clipboard (183) Modificando el tamao de un grfico (184) Usando el control PictureBox como contenedor (184) Mtodos grficos (184) El mtodo Print (184) Usando el control Shape (184) Figuras predefinidas (185) Estilos Fill y Line (185) Estableciendo atributos de color (185) Dibujando una figura en un formulario (185) Usando el control TextBox (186) La propiedad Text (186) Formato de texto (186) Seleccionando texto (186) Creacin de un TextBox contrasea (186) Cancelando teclas pulsadas en un TextBox (186) Creacin de un TextBox de solo lectura (read only) (187) Imprimiendo comillas () en una cadena (187) Usando el control Timer (187) Aplicacin ejemplo: Alarm.vbp (188)

10

Ubicando el control Timer sobre el formulario (188) Inicializando el control Timer (188) Control Timer Escenario: (188) Respondiendo al evento Timer (188) Ms acerca de programacin (189) Trabajando con mltiples proyectos (189) Agregando o removiendo un proyecto (190) Especificando un proyecto startup (190) Manejando las condiciones de la aplicacin (190) Crear o salvar las condiciones de la aplicacin (191) Recuperando condiciones de la aplicacin (191) Una condicin a la vez (191) Condiciones mltiples (192) Borrando condiciones de la aplicacin (192) Usando compilacin condicional (192) Estructurando cdigo para una compilacin condicional (193) Declarando constantes de compilacin condicional (193) Estableciendo constantes en la caja de dialogo ProjectProperties (193) Estableciendo constantes en la lnea de comando (193) Trabajando con resource files (194) Agregando un resource file al proyecto (194) Usando resource filesen cdigo (194) Trabajando con plantillas (templates) (194) Trabajando con interruptores de lneas de comando (command line switches) (195) Compilando su proyecto a cdigo nativo (195) Creando sus propios tipos de datos (user-defined types) (196) Declarando variables de tipo definido por el usuario (197) Asignando y recuperando valores (197) Tipos definidos por el usuario que contiene arreglos (197) Pasando tipos definidos por el usuario a procedimientos (198) Tipos definidos por el usuario que contiene objetos (198) Anidando estructuras de datos (198) Usando enumeraciones para trabajar con juego de constantes (199) Usando colecciones como alternativa a arreglos (201) Programando con objetos (201) Aplicacin ejemplo (201) Qu necesita saber acerca de objetos en Visual Basic (201) Un minuto de trminos (201) Aqu vamos (202) Descubriendo la clase a que pertenece un objeto (202) Ejecutando acciones mltiples sobre un objeto (203) Usando propiedades por defecto (203) Usando las propiedades por defecto con variables objeto (203) Usando las propiedades por defecto con Variants (203) Creacin de arreglos de objetos (204) Arreglos de variables de formularios (204) Arreglos de variables de control (205) Creacin de colecciones de objetos (206) El objeto Coleccin de Visual Basic (207) De qu est hecho el objeto Coleccin? (207) Propiedades y mtodos del objeto Coleccin (208) Agregando elementos a una Coleccin (209) Borrando elementos de una Coleccin (209) Recuperando elementos de una Coleccin (209) Item es el mtodo por defecto (210) Usando el mtodo Item para invocar Propiedades y Mtodos (210)

11

Colecciones en Visual Basic (210) Colecciones base cero y base uno (211) Valores indice y clave (211) Agregando y removiendo elementos (211) Qu es lo que tiene en sus bolsillos? (211) Enumerando una Coleccin (212) Los enumeradores no se saltan elementos (212) Los enumeradores no cogen elementos agregados (212) Por qu enumeradores? (213) Encontrando objetos (213) Contenido del object Browser (214) Controlando el contenido del object Browser (214) Encontrando y desplegando objetos (214) Agregado descripciones para sus objetos (215) Movindose entre procedimientos (215) Desplegando objetos de otras aplicaciones (216) Creando sus propias clases (216) Clases: (216) Poniendo tipos definidos por el usuario y procedimientos (216) Objetos: (217) Tipos definidos por el usuario con una actitud (217) Personalizando formularios de clases (217) Qu est pasando aqu? (218) Yo y mi variable global escondida (218) Un pequeo y rpido examen (218) Y qu hacer con todas esas otras instancias de Form1? (218) Propiedades, mtodos y eventos de clases de formularios (219) Pero espere, existe ms (219) Los formularios pueden llamar a los mtodos entre s (219) Otros tipos de mdulos (220) Mdulos de clase paso a paso (220) Usando el objeto Thing (221) Ejecutando el proyecto (222) Mostrando el formulario Thing (222) Poner al revs el nombre Thing (222) Crear nuevo Thing (222) Thing temporal (222) Cerrando el programa (223) Rastreando mdulos de clase (223) Ciclo de vida de formularios Visual Basic (224) Estados por los que atraviesa un formulario Visual Basic (224) Creado pero no cargado (225) Permanece creado, pero no cargado (225) El nico estado que todos los formularios atraviesan (226) Cargado pero no desplegado (226) Formularios que nunca son desplegados (226) Siempre regresando a casa (226) Despliegue (226) Interludio: preparando para descargar (227) Regresando al estado creado pero no al estado cargado (227) Recursos y memoria completamente reclamados (227) Descargado y no referenciado, pero un control todava est referenciado (228) Mdulos de clases versus mdulos estndar (228) Datos de clases estticos (230) Agregando propiedades y mtodos a una clase (230) Agregando propiedades a una clase (231)

12

Ocultando datos (231) Procedimientos de propiedad (231) Procedimientos Property y variables pblicas (232) Poniendo los procedimientos de propiedad a trabajar por Usted (233) Propiedades lectura escritura (233) Procedimientos de propiedad a trabajar (234) Los argumentos de procedimientos de propiedad pareados deben coincidir (234) Propiedades de solo lectura (235) Propiedades objeto (235) Propiedades Variant (235) Propiedades de solo escritura (236) Agregando mtodos a una clase (237) Declarando mtodos como Public Subs (237) Protegiendo detalles de implementacin (237) Es una propiedad o un mtodo? (238) El argumento sintaxis (238) El argumento de la ventana propiedad (239) El argumento del error sensible (239) El argumento del ltimo recurso (239) Haciendo por defecto a una propiedad o a un mtodo (239) Propiedades Friend y mtodos (240) Agregando eventos a una clase (241) Declarando y originando eventos (242) La clase Widget (242) Originando el evento PercentDone (242) Manejando eventos de un objeto (243) Limitaciones de las variables WithEvents (243) Escribiendo cdigo para manejar un evento (244) Conectando la variable WithEvents a un objeto (244) Ejecutando el programa (245) Manejando eventos para un Widget diferente (245) Terminando un manipulador de eventos para una variable WithEvents (245) Comparando WithEvents versus eventos de controles de formularios (246) Agregando un evento a un formulario (246) Resumen de declaracin, invocacin y manipulacin de eventos (247) Nombrando propiedades, mtodos y eventos (247) Polimorfismo (248) Cmo Visual Basic proporciona polimorfismo (248) Proporcionando polimorfismo con interfases (248) Polimorfismo y ejecucin (249) Creando e implementando una interfase (249) Multiples interfases (250) Ejercitando al tyrannosaur y el flea (251) Pasando tyrannosaur y flea a procedimientos (251) Implementando mtodos que regresan valores (251) Implementando propiedades (252) Implementando propiedades de solo lectura (read only) (253) Tiempo para una breve discusin sobre objetos e interfases (253) Preguntando por interfases (254) Variables de objetos genricos e interfases (254) Otras fuentes de interfases (255) Usando interfases en su proyecto (255) Las muchas interfases de re uso de cdigo (255) Delegando a un objeto implementado (255) No es esto tedioso? (256) Programando con sus propios objetos (257)

13

Referencias objeto y contador de referencias (257) Modelos objeto (258) Los modelos objeto expresan relaciones de contenedor (258) Relaciones de objetos de uno a muchos (259) Propiedades familiares (260) Propiedades Parent, referencias circulares y Object Tear Down (260) Mtodos Tear Down (261) An no terminamos (261) Creando sus propias clases Collection (262) Ejemplo Public Collection: La Casa de Pajas (262) El formulario hace todo el trabajo (263) Robusta como una casa de paja (265) Ejemplo Private Collection: La Casa de Palos (265) Cambios al formulario (266) Creacin de su propia clase Collection: La Casa de Ladrillos (267) Respondiendo a eventos del ratn y del teclado (268) Respondiendo a los eventos del ratn (269) El evento MouseDown (270) Usando MouseDown con el mtodo Move (270) Usando MouseDown con el mtodo Line (270) El evento MouseMove (271) Usando MouseMove con el mtodo Line (271) Cmo trabaja MouseMove (271) El evento MouseUp (271) Detectando los botones del ratn (272) Usando Button con MouseDown y MouseUp (273) Usando Button con MouseMove (273) Probando un botn (274) Probando mltiles botones (274) Usando Button para mejorar las aplicaciones de ratn grficas (275) Arrastrando y soltando (276) Activando DragMode automtico (277) Cambiando el icono del arrastre (277) Respondiendo cuando el usuario deja caer el objeto (277) Controlando cuando el arrastre se inicia y se detiene (278) Cambiando la ubicacin de un control (279) OLE Drag and Drop (280) Arrastre y soltado automatico versus manual (282) Permitiendo OLE Drag and Drop automtico (282) El objeto DataObject OLE Drag and Drop (283) Cmo trabaja OLE Drag and Drop (284) Iniciando el arrastre (285) Arrastrando sobre el target (285) Completando el arrastre (285) Iniciando la operacin de arrastre OLE (286) El mtodo OLEDrag (286) Especificando efectos de soltado y formatos de datos (286) El argumento AllowedEffects (286) El argumento Format (287) Ubicando datos en el objeto DataObject (287) Arrastrando el OLEDragSource sobre el OLEDropTarget (287) El argumento estado del evento de OLEDragOver (287) Proveyendo al usuario con alimentacin visual personalizada (288) El evento OLEDragOver (288) El evento OLEGiveFeedBack (289) Soltando el OLEDragSource dentro del OLEDropTarget (290)

14

Recuperando datos (290) Interpelando al objeto DataObject (291) Situando los datos dentro del objeto DataObject (291) Informando al source cuando los datos son soltados (291) Usando el ratn y el teclado para modificar los efectos de soltado y respuestas del usuario (292) Arrastrando archivos desde el explorador de windows (293) Personalizando el apuntador del ratn (294) Iconos y cursores (295) Respondiendo a eventos del teclado (96) Escribiendo manejadores de teclado de bajo nivel (296) El evento KeyPress (297) Los eventos KeyDown y KeyUp (298) El argumento KeyCode (298) El argumento Shift (299) Escribiendo manejadores de teclado a nivel de formulario (299) Trabajando con texto y grficos (301) Trabajando con fuentes (301) Eligiendo fuentes para su aplicacin (302) Viendo las fuentes disponibles (302) Estableciendo las caractersticas de las fuentes (302) Estableciendo las propiedades de las fuentes (302) Trabajando con SmallFonts (303) Aplicando las propiedades de fuentes a objetos especficos (303) La propiedad FontTransparent (304) Desplegando texto en formularios y PictureBox (304) Usando el mtodo Print (304) Texto truncado (304) Layering (304) Desplegando diferentes elementos en una sola lnea (304) Desplegando la salida de impresin a una ubicacin especfica (305) El mtodo CLS (305) Estableciendo las coordenadas de dibujo (305) Los mtodos TextHeight y TextWidth (306) Formateo de nmeros, fechas y horas (306) Nombres de formatos (307) Formateo de nmeros (307) Imprimiendo fechas y horas formateadas (308) Trabajando con texto seleccionado (308) Transfiriendo texto y grficos con el objeto Clipboard (308) Impresin (309) Imprimiendo desde una aplicacin (309) Usando el mtodo PrintForm (309) Usando la coleccin Printers (310) Usando el objeto Printer (310) Imprimiendo con el objeto Printer (311) Propiedades del objeto Printer (311) Propiedades Scale (311) Posicionando texto y grficos (312) Desplegando la salida de impresin a una ubicacin especfica (312) El mtodo CLS (312) Estableciendo las coordenadas de dibujo (312) Los mtodos TextHeight y TextWidth (312) Imprimir formularios con el objeto Printer (313) Recreacin de texto y grficos en un formulario (313) Imprimir controles en un formulario (314)

15

Imprimir el contenido del objeto Printer (314) Creacin de documentos de pginas mltiples (314) Cancelando un trabajo de impresin (314) Uso del control ImageList (315) Uso de ImageList con otros controles Common de windows (315) Para asociar el control ImageList con los controles TreeView, TabStrip, y ToolBar en tiempo de diseo (315) Usando el control ImageList con el control ListView (316) Para asociar dos controles ImageList con el control ListView en tiempo de diseo (316) Asignando objetos ListImage por propiedad Index o por propiedad Key (316) Uso del control ImageList con controles que no son parte de los controles common de windows (316) Control ImageList (317) Usando el control ImageList (318) Usos posibles(318) Manejo de objetos ListImage y de colecciones ListImages (319) Agregar objetos ListImage en tiempo de diseo (319) Agregar objetos ListImage en tiempo de ejecucin (319) Determinacin del tamao de las imgenes (319) Mtodos que le permiten la creacin de composicin de imgenes (320) Uso del control ToolBar (320) La coleccin Buttons (321) Asociar el control ImageList con el control ToolBar (321) Para asociar un control ImageList con un control ToolBar en tiempo de diseo (321) Crear botones en tiempo de diseo y tiempo de ejecucin (321) Para crear objetos Button en tiempo de diseo (321) Para crear una coleccin de objetos Button en tiempo de ejecucin (322) La propiedad Style de Button determina el comportamiento del botn (322) Ubicando los controles sobre la barra de herramientas (323) Para ubicar otros controles sobre la barra de herramientas en tiempo de diseo (323) Restablecer otros controles dentro del evento Resize (323) Uso de la declaracin SelectCase en el evento ButtonClick para programar la funcionalidad del Button (323) Uso de la propiedad MixedState para significar estados no determinados (324) Establecer ToolTipText con la propiedad ToolTipText (324) Permitir al usuario que personalice la barra de herramientas (324) Uso de los mtodos SaveToolBar y RestoreToolBar (324) Escenario ImageList: (325) Agregar imgenes Open, Save, Print, a un control barra de herramientas (325) Para agregar imgenes al control ToolBar (325) Agregar imgenes al control ImageList y asignar un valor de propiedad Key unico para agregar objetos ListImage en tiempo de diseo (325) Asociar el control ImageList con el control ToolBar (326) Asignar imgenes a los objetos Button usando la ceja Buttons (326) Ejemplo del control ToolBar (326) Corel Motion 3D (328)

16

Traduccin: Derechos de Autor: RBsoftware (2001) Mircoles, 4 de abril 2001.03:53p. Archivo: Traduccin VB.

Desarrollar una aplicacin en Visual Basic Toma unos pocos minutos construir su primera aplicacin en Visual Basic. Usted crea la interfase del usuario dibujando controles tales como cajas de texto y botones de comando sobre un formulario. A continuacin, activa propiedades para el formulario y los controles para especificar valores tales como ttulos, color, tamao. Finalmente Usted escribe cdigos que hacen que la aplicacin tenga vida. Los pasos bsicos que Usted hace para crear su primera aplicacin le ensearn los principios que aplicar en cada aplicacin que vaya a desarrollar. Conceptos de Visual Basic Para comprender el proceso de desarrollo de una aplicacin es necesario entender algunos de los conceptos principales sobre los que ha sido construido Visual Basic. En vista que Visual Basic es un lenguaje de desarrollo bajo ambiente Windows se necesita conocer un poco sobre ambiente Windows. Si Usted es un programador nuevo sobre ambiente Windows Usted necesita conocer sobre diferencias fundamentales entre hacer programas bajo ambiente Windows versus hacerlo bajo otras plataformas. Cmo trabaja Windows: Ventanas, Eventos y Mensajes Una discusin detallada sobre el funcionamiento interno de Windows requerira un libro entero. Un profundo conocimiento detallado sobre todos los detalles tcnicos no es necesario. Una versin simplificada de la forma en que trabaja Windows involucra tres conceptos principales: ventanas, eventos y mensajes. Piense que una ventana simplemente es una regin rectangular con sus propias fronteras. Usted probablemente ya conocer diferentes tipos de ventanas: la ventana del Explorador de Windows 95, un documento que es reflejado por su procesador de texto, una ventana de dilogo que aparece recordndole una cita. Aunque estos son los ejemplos ms comunes, en realidad existen otros tipos de ventanas. Un botn de comando es una ventana, iconos, cajas de texto, botones de opciones y barras de mens son todas ventanas. El sistema operativo Windows de Microsoft controla todas estas ventanas asignndoles a cada una de ellas un nico nmero que las identifica (window handle o hWnd). El sistema en forma permanente est en contacto con estas ventanas para detectar signos de actividad o eventos. Los eventos pueden acaecer a travs de acciones ejecutadas por el usuario tales como un clic con el ratn o presionar una tecla, o a travs de rdenes programadas, e incluso ocasionadas por acciones de otras ventanas. Cada vez que ocurre un evento se enva un mensaje al sistema operativo. El sistema procesa el mensaje y lo transmite a las otras ventanas. Cada ventana puede entonces tomar acciones apropiadas basadas en sus propias instrucciones para manejar cada mensaje en particular, por ejemplo, volvindose a dibujar cuando ha sido recubierta por otra ventana. Como podr Usted imaginar, el manejo de todas las posibles combinaciones de ventanas, eventos y mensajes puede ser desconcertante. Afortunadamente, Visual Basic impide que Usted tenga que tratar con todo el manejo de mensajes de bajo nivel. Muchos de estos mensajes son manejados automticamente por Visual Basic; otros son expuestos con forma de procedimientos de eventos para su conveniencia. Esto permite que Usted pueda crear rpidamente poderosas aplicaciones sin tener que lidiar con detalles innecesarios. Comprender el modelo conducido por eventos En los lenguajes de programacin tradicionales la propia aplicacin controla qu porciones de cdigo son ejecutadas y en qu secuencia. La ejecucin se inicia en la primer lnea del cdigo y contina sobre un camino predefinido a travs de la aplicacin, llamando los procedimientos cada vez que son necesarios.

17

En una aplicacin conducida por eventos el cdigo no sigue un camino predefinido: ejecuta diferentes secciones de cdigo en respuesta a eventos. Los eventos pueden ser disparados por acciones del usuario, por mensajes emitidos desde el sistema o desde otras aplicaciones, incluyendo la propia aplicacin. La secuencia de estos eventos determina la secuencia en que el cdigo es ejecutado, por tanto la ruta que transita el cdigo dentro de la aplicacin difiere cada vez que se echa a funcionar el programa. En vista de que Usted no puede predecir la secuencia de los eventos, su cdigo debe asumir acerca del estado de las cosas cuando se ejecuta. Cuando Usted asume, por ejemplo, que la entrada a un campo debe tener determinado valor antes de que se ejecute un procedimiento que procesar este valor, Usted debe estructurar la aplicacin de tal manera que este supuesto siempre sea vlido, por ejemplo, desactivando el botn de comando que ejecuta este procedimiento hasta que el campo en cuestin tenga un valor. Incluso su cdigo puede disparar eventos durante su ejecucin. Por ejemplo, cambiar el texto de una caja de texto hace que se produzca el evento CHANGE de la caja de texto. Esto ocasiona que si existe cdigo asociado a este evento sea ejecutado. Si Usted asume que este evento solamente ser disparado por interaccin del usuario Usted podra obtener resultados no esperados. Es por esta razn que es importante que comprenda el modelo conducido por eventos y lo tenga en mente cuando disee la aplicacin. Desarrollo interactivo El proceso del desarrollo de las aplicaciones tradicionales observa tres diferentes estadios: escritura, compilacin y prueba de cdigo. A diferencia de los lenguajes tradicionales, Visual Basic utiliza un acceso de desarrollo interactivo, borrando la distincin entre estos tres pasos tradicionales. Con la mayora de los lenguajes, si Usted comete un error al escribir el cdigo, el error es detectado hasta cuando compila su aplicacin. Despus debe encontrar, reparar el error y repetir de nuevo el ciclo de compilacin, repitiendo este proceso por cada error cometido. Visual Basic interpreta el cdigo en el mismo momento en que este es introducido, detectando al vuelo y resaltando la mayora de los errores de sintaxis o mal escritos. Es casi parecido a tener un experto observando detrs de su hombro en el momento en que introduce el cdigo. Adicionalmente a la deteccin de errores en el mismo momento en que ocurren, Visual Basic incluso parcialmente compila su cdigo en el momento en que es introducido. Cuando Usted est listo para ejecutar y probar la aplicacin, existe nicamente un breve tiempo de espera para finalizar la compilacin. Si el compilador encuentra un error, este es resaltado en el cdigo. Usted puede corregir el error, y continuar la compilacin, sin tener necesidad de repetir la compilacin desde el inicio. En vista de la naturaleza interactiva de Visual Basic, Usted se encontrar ejecutando su aplicacin a medida que la va desarrollando. De esta forma puede Usted probar los efectos de su cdigo a medida que trabaja en vez de estar esperando para compilar ms tarde. Elementos del ambiente de desarrollo integrado El ambiente de trabajo en Visual Basic a menudo es conocido como el ambiente de desarrollo integrado o IDE en vista de que este integra muchas y diversas funciones tales como diseo, edicin, compilacin y rastreo dentro de un ambiente comn. En muchas herramientas de desarrollo tradicionales cada una de estas funciones opera como un programa separado, cada uno con su propia interfase El ambiente de desarrollo integrado (IDE) de Visual Basic consiste de los siguientes elementos: Barra de Mens Despliega los comandos que Usted usa para trabajar con Visual Basic. Adems de los mens estndar archivo, edicin, ver, ventana y ayuda, los mens estn capacitados para proporcionar acceso a funciones especficas a nivel de programacin tales como proyecto, formato y rastreo. Mens contextuales Contienen atajos a acciones ejecutadas con frecuencia. Para abrir un men contextual se da clic con el botn derecho del ratn sobre el objeto que est usando. La lista especfica de atajos disponibles dependen de la

18

parte del ambiente en donde Usted de clic con el botn derecho del ratn. Por ejemplo, el men contextual que se despliega cuando se da clic con el botn derecho del ratn sobre la caja de herramientas le permite desplegar la caja de dilogo de los componentes, ocultar la caja de herramientas, atracar o desatracar la caja de herramientas, o agregar una pestaa del usuario a la caja de herramientas. Barras de herramientas Proporcionan rpido acceso a comandos comnmente usados en el ambiente de programacin. Usted da clic una vez sobre un botn de la barra de herramientas para ejecutar la accin representada por tal botn. Por defecto, la barra de herramientas estndar es desplegada cuando inicia Visual Basic. Adicionales barras de herramientas para editar, diseo de formularios y rastreo pueden ser activadas y desactivadas a partir del men VIEW. Las barras de herramientas pueden ser atracadas debajo de la barra de men o pueden flotar si selecciona la barra vertical sobre la orilla izquierda y la arrastra alejndola de la barra del men. Caja de herramientas Proporciona un juego de herramientas que usa en tiempo de diseo para situar controles sobre el formulario. Adicionalmente al modelo de la caja de herramientas estndar que se obtiene por defecto, puede crear sus propios modelos seleccionando ADD TAB desde el men contextual y agregando controles a la pestaa resultante. Ventana de exploracin del proyecto Despliega los formularios y mdulos dentro del proyecto actual. Un proyecto es una coleccin de archivos que usa para construir una aplicacin. Ventana de propiedades Despliega las propiedades activadas segn el formulario o control seleccionado. Una propiedad es la caracterstica de un objeto, tales como su tamao, ttulo, color. Hojear objetos Despliega los objetos disponibles para usar en su proyecto y le proporciona un medio rpido para navegar a travs de su cdigo. Puede usarlo para hojear objetos en Visual Basic y otras aplicaciones, ver qu mtodos estn disponibles para esos objetos, y copiar cdigos de procedimientos dentro de su aplicacin. Diseador de formularios Sirve como una ventana que Usted personaliza diseando la interfase de su aplicacin. Usted agrega controles, grficos e imgenes al formulario para crear el aspecto que desee. Cada forma en su aplicacin dispone de su propio diseador de formularios. Ventana editora de cdigo Sirve como un editor para introducir el cdigo de la aplicacin. Una ventana editora de cdigo es creada por cada formulario o mdulo de cdigo en su aplicacin. Ventana modelo de formulario La ventana modelo de formulario permite posicionar los formularios en su aplicacin usando una pequea representacin grfica de la pantalla. Ventanas inmediatas, locales y de observacin Estas ventanas adicionales son utilizadas para rastreo de su aplicacin. Ellas estn disponibles nicamente cuando est corriendo su aplicacin dentro del IDE. Opciones adicionales Usted puede agregar caractersticas a la interfase de Visual Basic usando un programa llamado ADD-IN. Los ADD-INS, que estn disponibles en Microsoft y otros desarrolladores, proporcionan caractersticas tales como control de cdigo fuente, que le permiten soportar el desarrollo de proyectos en grupo.

19

Opciones de ambiente Visual Basic proporciona gran flexibilidad, permitindole que configure el ambiente de trabajo que mejor se ajuste a su estilo individual. Usted puede elegir entre una interfase de documento sencillo o mltiple, y puede ajustar tamao y posicin de los diversos elementos de desarrollo integrado. Su modelo se mantendr entre las sesiones de Visual Basic. Interfaces SDI o MDI Dos diferentes estilos estn disponibles en el IDE de Visual Basic: interfase de documento sencillo (SDI) o interfase de documento mltiple (MDI). Con la opcin SDI, todas las ventanas del IDE son libres de ser movidas a cualquier lugar de la pantalla; mientras sea Visual Basic la aplicacin activa, ellas permanecern encima de cualquier otra aplicacin. Con la opcin MDI, todas las ventanas del IDE estn contenidas en una sencilla y ajustable ventana madre. Para activar modos SDI o MDI: 1. Seleccionar OPTIONS del men TOOLS. La caja de dilogo OPTIONS es desplegada. 2. Seleccionar la pestaa ADVANCED. 3. Marcar o desmarcar la opcin ambiente de desarrollo SDI. La IDE iniciar en el modo seleccionado la prxima vez que inicie Visual Basic. O, puede iniciar Visual Basic desde la lnea de comandos con el parmetro /sdi o /mdi. Ventanas atracadas Muchas de las ventanas en el IDE pueden ser atracadas o conectadas, entre ellas, o a la orilla de la pantalla. En estas se incluyen la caja de herramientas, la ventana modelo de formulario, el explorador del proyecto, la ventana de propiedades, la paleta de colores, y las ventanas inmediata, locales y de observacin. Con la opcin MDI las ventanas puedes ser atracadas a cualquier lado de la ventana madre; con la opcin SDI pueden solo ser atracadas debajo de la barra de men. Las cualidades de atracar pueden ser activadas o desactivadas seleccionando la opcin de marca adecuada en la pestaa DOCKING de la caja de dilogo OPTIONS, disponible a travs del comando OPTIONS del men TOOLS. Para atracar o desatracar una ventana: 1. Seleccionar la ventana que desea atracar o desatracar. 2. Arrastre la ventana hasta el lugar deseado manteniendo oprimido el botn izquierdo del ratn. El marco de la ventana ser desplegado a medida que hace el arrastre. 3. Deje de oprimir el botn del ratn. Su primera aplicacin en Visual Basic La creacin de una aplicacin en Visual Basic es simple. Cun simple? Para conocer la respuesta trate de crear la clsica aplicacin HELLO de Visual Basic que sigue a continuacin. Existen tres pasos principales en la creacin de una aplicacin en Visual Basic: 1. Crear la interfase. 2. Activar las propiedades. 3. Escribir cdigo. Para ver cmo esto es hecho siga los pasos en los procedimientos siguientes para crear una aplicacin simple que consiste de una caja de texto y un botn de comando. Cuando de clic al botn de comando, el mensaje HOLA MUNDO! se mostrar en la caja de texto. Crear la interfase Los formularios son la fundacin para crear la interfase de una aplicacin. Puede usar los formularios para agregar ventanas y cajas de dilogo a su aplicacin. Puede incluso usarlos para contener elementos que no son una parte visible de la interfase de la aplicacin. Por ejemplo, puede tener un formulario que servir para contener grficos que planea desplegar en otros formularios.

20

El primer paso para construir una aplicacin en Visual Basic es crear los formularios que sern la base de la interfase de la aplicacin. Despus dibuja o deposita los objetos que crean la interfase sobre los formularios creados. Para esta primera aplicacin usar dos controles de la caja de herramientas: una caja de texto y un botn de comando. Para dibujar un control usando la caja de herramientas: 1. De clic en la caja de herramientas sobre el control que desea dibujar, en este caso, la caja de texto. 2. Mueva el apuntador sobre el formulario. El apuntador se convertir en una cruz. 3. Site la cruz sobre el lugar en donde desea que la esquina superior izquierda del control sea dibujado. 4. Arrastre la cruz, hacia la derecha y un poco hacia abajo hasta que el control adquiera el tamao deseado. (Arrastrar significa mantener presionado el botn izquierdo del ratn mientras mueve un objeto con el ratn). 5. Soltar el botn del ratn. El control aparecer en el formulario. Otra forma simple de agregar un control al formulario es dar doble clic al control dentro de la caja de herramientas. Esto crea un control con un tamao por defecto y que lo ubica en el centro del formulario; despus puede mover el control a otro sitio en el formulario. Cambiar de tamao, mover y echar llave a los controles Observe que pequeas cajas rectangulares llamadas manejadores de tamao se muestran en las esquinas del control; usa estos manejadores de tamao para ajustar el control al tamao deseado. Puede tambin usar el ratn, el teclado y comandos del men para mover los controles, para echar llave al control y evitar que sea movido de su sitio, o para abrir la llave y permitir moverlo de su sitio, y para ajustar sus posiciones. Para cambiar de tamao un control: 1. Seleccione el control que desea cambiar de tamao dndole clic con el ratn. Los manejadores de tamao aparecen sobre el control. 2. Ubicar el apuntador del ratn sobre el manejador del tamao, y arrstrelo hasta que el control adquiera el tamao deseado. Los manejadores de tamao de las esquinas cambian el tamao del control en forma vertical y horizontal, mientras que los manejadores de tamao de los lados cambiar el tamao del control en una sola direccin. 3. Suelte el botn del ratn. O, use la tecla SHIFT junto con las flechas de direccin para cambiar el tamao del control seleccionado. Para mover un control: Use el ratn para arrastrar el control hasta su nueva posicin en el formulario. O, use la ventana de propiedades del control seleccionado para cambiar las propiedades TOP y LEFT. Cuando un control es seleccionado, puede usar la tecla CTRL con las flechas de direccin para mover el control una unidad del cuadro a la vez. Si el cuadro est desactivado, el control se mueve un PXEL a la vez. Para poner llave a todas las posiciones de los controles: En el men FORMAT, elija LOCK CONTROLS. O, en la barra de herramientas FORM EDITOR, dar clic al botn LOCK CONTROLS TOGGLE. Esto pondr bajo llave a todos los controles que estn sobre el formulario en sus actuales posiciones de forma que no podr moverlos inadvertidamente una vez que ellos fueron situados en la ubicacin deseada. Esto pondr bajo llave solamente a los controles que existan en el formulario seleccionado; los controles de los otros formularios permanecern sin ser afectados. Este mismo comando se usa para poner llave como para quitarla. Para ajustar la posicin de los controles bajo llave: Puede ligeramente mover el control que tenga el foco sosteniendo presionada la tecla CTRL y presionando la flecha de direccin indicada al caso. O, puede cambiar las propiedades TOP y LEFT del control.

21

Establecer propiedades El siguiente paso es poner las propiedades de los objetos creados. La ventana de propiedades proporciona un mtodo fcil para situar las propiedades de todos los objetos que estn sobre el formulario. Para abrir la ventana de propiedades hgalo a travs del men VIEW, seleccionando PROPERTIES WINDOW; o dar clic al botn PROPERTIES WINDOW ubicado en la barra de herramientas; o use el men contextual del control. La ventana de propiedades consiste de los siguientes elementos: OBJECT BOX: Despliega el nombre del objeto para el cual se estn estableciendo las propiedades. Si se da clic a la flecha de la derecha de este cuadro se desplegar la lista de todos los objetos del formulario actual. SORT TABS: Elija entre una lista de propiedades ordenadas en orden alfabtico o una vista jerrquica dividida en categoras lgicas, tales como las que se relacionan con la apariencia, tipo de letra o posicin. PROPERTIES LIST: La columna de la izquierda despliega todas las propiedades del objeto seleccionado. Puede ver y editar las propiedades establecidas en la columna de la derecha. Para situar las propiedades desde la ventana de propiedades: 1. A partir del men VIEW, elija PROPERTIES; o dar clic al botn PROPERTIES sobre la barra de herramientas. La ventana de propiedades despliega las propiedades activas para el formulario o control seleccionado. 2. A partir de PROPERTIES LIST, seleccione el nombre de una propiedad. 3. En la columna de la derecha, teclee o seleccione la nueva propiedad a instalar. Algunas propiedades tienen una lista predefinida de atributos. Puede desplegar esta lista dndole clic a la flecha que seala hacia abajo y ubicada a la derecha de la caja de atributos; o puede repetir el ciclo dndole doble clic a un tem de la lista. Para el ejemplo de HOLA MUNDO! necesita cambiar tres atributos de las propiedades. Use los atributos que existen por defecto para todas las dems propiedades. Object Form Text box Command Button Establecer la propiedad ICON Todos los formularios en Visual Basic tiene un genrico, por omisin, icono, que se muestra cuando el formulario es minimizado. De cualquier manera, probablemente cambiar este icono por uno que ilustre mejor el uso del formulario o de la aplicacin. Para asignar un icono al formulario active la propiedad ICON de ese formulario. Puede usar iconos de 32 X 32 pixeles, que fueron estndares en la versin de 16 bits de Windows y que tambin se usan en Windows 95 y Windows NT, as como los iconos 16 X 16 pixeles usados en Windows 95. Escribiendo cdigo La ventana de cdigo es donde escribe el cdigo de Visual Basic para su aplicacin. El cdigo consiste en enunciados del lenguaje, constantes y declaraciones. Usando la ventana de cdigo puede rpidamente ver y editar cualquier cdigo que tenga su aplicacin. Para abrir la ventana de cdigo: Dar doble clic sobre el formulario o control que ha elegido escribir cdigo. O, desde la ventana explorador de proyecto seleccionar el nombre del formulario o mdulo y despus elegir el botn VIEW CODE. Property Caption Text Caption Setting Hola Mundo! (Nada) Fin

22

Usted puede elegir desplegar todos los procedimientos en la misma ventana de cdigo, o desplegar un solo procedimiento a la vez. Para desplegar todos los procedimientos en la misma ventana de cdigo: 1. A partir del men TOOLS, seleccione la caja de dialogo OPTIONS. 2. En la caja de dilogo OPTIONS, pestaa EDITOR, seleccione la marca ubicada a la izquierda de DEFAULT TO FULL TO MODULE VIEW. La marca a la izquierda de PROCEDURE SEPARATOR agrega a remueve lneas de separacin entre procedimientos. O, dar clic al botn FULL MODULE VIEW ubicado en la esquina inferior izquierda de la ventana de cdigo. Para desplegar un procedimiento a la vez en la ventana de cdigo: 1. A partir del men TOOLS, seleccione la caja de dilogo OPTIONS. 2. En la caja de dilogo OPTIONS, pestaa EDITOR, elimine la marca que aparece a la izquierda de DEFAULT TO FULL MODULE VIEW. O, dar clic al botn PROCEDURE VIEW ubicado en la parte inferior izquierda de la ventana de cdigo. La ventana de cdigo incluye los siguientes elementos: OBJECT LIST BOX: Despliega el nombre del objeto seleccionado. Si da clic a la flecha de la derecha de la caja se mostrarn todos los objetos asociados al formulario. PROCEDURE LIST BOX: Despliega los procedimientos o eventos de un objeto. En la caja se despliega el nombre del procedimiento seleccionado. Si da clic a la flecha de la derecha de la caja se mostrarn todos los procedimientos de ese objeto. Creacin de procedimientos de evento El cdigo en una aplicacin Visual Basic es dividido en pequeos bloques llamados procedimientos. Un procedimiento de evento contiene cdigo que es ejecutado cuando ocurre un evento (tal como cuando el usuario da clic a un botn). Un procedimiento de evento para un control combina el nombre actual del control (especificado en la propiedad NAME), un subrayado ( _ ), y el nombre del evento. Por ejemplo, si desea que un botn de comando llamado COMMAND1 que invoque un procedimiento de evento cuando se le d clic, use el procedimiento COMMAND1_CLICK. Para crear un evento de procedimiento: 1. En la caja OBJECT LIST, seleccione el nombre de un objeto del formulario activo. (El formulario activo es el que actualmente tiene el foco). Para este ejemplo, seleccione el botn de comando COMMAND1. 2. En la caja PROCEDURE LIST, seleccione un evento del objeto seleccionado. Aqu el procedimiento CLICK ya est seleccionado en vista que ste es el procedimiento por defecto para un botn de comando. Note que un patrn para el procedimiento de evento es ahora desplegado en la ventana cdigo. 3. Teclee el siguiente cdigo entre las declaraciones SUB y END: TEXT1.TEXT=Hola Mundo!. El procedimiento de evento deber mostrarse as: PRIVATE SUB COMMAND1_CLICK( ) TEXT1.TEXT=Hola Mundo! END SUB Notar que el cdigo simplemente est cambiando la propiedad TEXT del control llamado TEXT1 por el atributo Hola Mundo!. La sintaxis para este ejemplo toma la forma de Objeto.Propiedad, donde TEXT1 es el objeto, y TEXT es la propiedad. Y el atributo de la propiedad TEXT es la constante Hola Mundo!. Usted puede usar esta sintaxis para cambiar los atributos de las propiedades de cualquier formulario o control para responder a eventos que ocurren cuando su aplicacin se est ejecutando.

23

Ejecutando la aplicacin Para ejecutar o correr la aplicacin dar clic a START, a partir del men RUN; o dar clic al botn START ubicado en la barra de herramientas; o pulse la tecla F5. D clic al botn de comando que haya puesto sobre el formulario y ver que en la caja de texto se despliega la frase Hola Mundo!. Traduccin: Derechos de Autor: RBsoftware (2001) Jueves, 5 de abril 2001.00:47. Archivo: Traduccin VB2

Formularios, controles y mens El primer paso para crear una aplicacin con Visual Basic es crear la interfase, la parte visual de la aplicacin con la cual el usuario interactuar. Los formularios y controles son los bloques bsicos de construccin usados para crear la interfase; ellos son los objetos con los que trabajar para construir su aplicacin. Los formularios son objetos que presentan propiedades que definen su apariencia, mtodos que definen su comportamiento y eventos que definen su interaccin con el usuario. Activando estas propiedades en los formularios y escribiendo cdigo Visual Basic para responder a estos eventos ajusta el objeto para que cumpla los requerimientos de su aplicacin. Los controles son objetos que estn contenidos en otros objetos llamados formularios. Cada tipo de control tiene su propio juego de propiedades, mtodos y eventos que lo vuelven adecuado para propsitos particulares. Algunos de los controles que usa en su aplicacin son adecuados para entrada de datos o para desplegar texto. Otros controles le permiten acceder a otras aplicaciones y procesar sus datos tal como si la aplicacin remota fuese parte de su cdigo. Este captulo es una introduccin sobre los conceptos bsicos para trabajar con formularios y controles, y sus propiedades, mtodos y eventos asociados. Muchos de los controles estndar son abordados, as como las caractersticas especficas de los formularios, tales como mens y cajas de dilogo. Comprender lo que son propiedades, mtodos y eventos Los formularios y controles Visual Basic son objetos que disponen de sus propias propiedades, mtodos y eventos. Las propiedades deben interpretarse como los atributos del objeto, los mtodos como sus acciones y los eventos como sus respuestas. Un objeto de la vida real, tal como el globo de un nio, tambin tiene propiedades, mtodos y eventos. Las propiedades de un globo incluye atributos visibles tales como su alto, dimetro y color. Otras propiedades describen su estado (inflado o desinflado), o atributos que no son visibles tales como su edad. Por definicin, todos los globos tienen estas propiedades: los atributos de estas propiedades pueden diferir de un globo a otro. El globo tiene tambin mtodos inherentes o acciones que puede ejecutar. Tiene el mtodo inflar (la accin de llenarlo de aire), tiene el mtodo desinflar (la accin de expeler su contenido), y el mtodo elevarse (si el globo se suelta.) Repitiendo, todos los globos son capaces de tener estos mtodos. Los globos tambin tienen respuestas predefinidas a ciertos eventos externos. Por ejemplo, un globo puede responder al evento ser pinchado, desinflndose. O al evento soltar el globo, elevndose. Si se hiciese un programa para este ejemplo, el cdigo a escribir en Visual Basic sera as: Globo.Color=Rojo Globo.Dimetro=10

24

Globo.Inflado=Verdadero Note la sintaxis del cdigo, el objeto (globo) seguido de la propiedad (.color) seguido por el atributo (rojo). Puede cambiar el color del globo repitiendo esta declaracin y sustituyndola con un valor diferente. Las propiedades pueden tambin ser activadas en la ventana propiedades al momento de estar diseando la aplicacin. Los mtodos invocados para el globo seran: Globo.Inflarse Globo.Desinflarse Globo.Levantarse 5 Esta sintaxis es igual que la de las propiedades, el objeto (un nombre o sustantivo), y el mtodo (un verbo). En el tercer ejemplo existe un elemento adicional o argumento que muestra la distancia que tiene que elevarse. Algunos mtodos pueden tener uno o ms argumentos para describir acciones adicionales que deben ser efectuadas. El globo podra responder a estos eventos: Sub Globo_Pinchado ( ) Globo.Desinflar Globo.HacerRuido Pum Globo.Inflado=Falso Globo.Dimetro=1 End Sub En este caso, el cdigo describe el comportamiento del globo cuando ocurre el evento pinchar: invoca el mtodo desinflar, despus invoca el mtodo hacer ruido con un argumento pum (el tipo de sonido que hace). Ya que el globo ya no est inflado, la propiedad inflado es establecida a falsa y la propiedad del dimetro es puesta en un nuevo valor. Aunque por el momento no pueda hacer este programa del globo, puede programar un formulario o un control. Como programador Usted es el que mantiene el control. Usted decide qu propiedades deben ser cambiadas, qu mtodos deben ser invocados, y qu eventos respondidos, en orden de obtener la deseada apariencia y comportamiento. Diseando un formulario Los objetos de formularios son los bloques de construccin bsicos de una aplicacin Visual Basic, son las ventanas con las cuales el usuario interacta en el momento que la aplicacin se encuentra en funcionamiento. El primer paso para disear un formulario es establecer sus propiedades. Puede colocar las propiedades en tiempo de diseo a travs de la ventana de propiedades, o en tiempo de ejecucin escribiendo cdigo. Nota: Usted trabaja con formularios y controles, coloca sus propiedades, y escribe cdigo para sus eventos en tiempo de diseo, que significa cualquier tiempo mientras Usted est construyendo la aplicacin bajo el ambiente de Visual Basic. Tiempo de ejecucin significa cualquier momento en que la aplicacin est en funcionamiento e interactuando con Usted, tal como lo hace el usuario. Establecer propiedades al formulario Muchas de las propiedades del formulario afectan su apariencia fsica. La propiedad CAPTION determina el texto que aparece en la barra de ttulo del formulario. La propiedad ICON establece el icono que ser desplegado cuando el formulario es minimizado. Las propiedades MAXBUTTON y MINBUTTON determinan cundo un formulario puede ser maximizado o minimizado. Cambiando la propiedad BORDERSTYLE puede controlar el comportamiento de cambio de tamao del formulario. Las propiedades HEIGHT y WIDTH determinan el tamao inicial del formulario. Las propiedades LEFT y TOP determinan la ubicacin del formulario en relacin con su esquina superior izquierda en la pantalla. La propiedad WINDOWSTATE puede activarse para iniciar el formulario en un estado normal, minimizado o maximizado.

25

La propiedad NAME establece el nombre a travs del cual Usted se referir al formulario cuando escriba cdigo. Por defecto, al comienzo, cuando los formularios son agregado al proyecto, sus nombres son establecidos a FORM1, FORM2, y as sucesivamente. Se recomienda que establezca la propiedad NAME a algo que englobe ms significado, por ejemplo, llamarle FRMCOMPRAS a un formulario de rdenes de compras. La mejor forma de familiarizarse con las propiedades es experimentar. Cambie algunas de las propiedades del formulario en la ventana propiedades, despus haga funcionar la aplicacin para ver los efectos. Puede aprender ms sobre las propiedades si la selecciona y pulsa F1, ver la ayuda sensitiva al contexto. Mtodos y eventos de formularios Igual a los objetos, los formularios ejecutan mtodos y responden a eventos. El evento que hace cambiar de tamao el formulario es disparado cada vez que el formulario es cambiado de tamao, sea a travs de intervencin del usuario, sea a travs de cdigo. Esto permite ejecutar acciones tales como mover y cambiar los controles que tenga el formulario cuando sus dimensiones hayan sufrido cambios. El evento ACTIVATE ocurre cada vez que el formulario est activo. El evento DEACTIVATE ocurre cuando otro formulario de la aplicacin se activa. Estos eventos son convenientes para inicializar o finalizar el comportamiento del formulario. Por ejemplo, en el evento ACTIVATE puede escribir cdigo que seleccione el texto de una caja de texto; en el evento DEACTIVATE escribir cdigo que permita guardar los cambios en un archivo o una base de datos. Para que un formulario sea visible invoca el evento SHOW: Form2.Show Invocar el evento SHOW tiene el mismo efecto que establecer la propiedad VISIBLE del formulario a TRUE. Muchos de los mtodos de los formularios involucran texto y grficos. Los mtodos PRINT, LINE, CIRCLE y REFRESH, son fundamentales para imprimir o dibujar directamente sobre la superficie del formulario. Dndole clic a los botones para ejecutar acciones El medio ms fcil para permitir al usuario que interacte con la aplicacin es proporcionarle un botn al cual le d clic. Puede usar un botn de comando proporcionado por Visual Basic, o puede crear su propio botn si usa el CONTROL IMAGE para que contenga un grfico, como un icono. Usando botones de comando La mayora de las aplicaciones Visual Basic tienen botones de comandos que permiten al usuario darles clic para ejecutar acciones. Cuando el usuario selecciona un botn, no solamente ejecuta la accin apropiada, sino que el botn da la apariencia de haber sido presionado y liberado. Cada vez que el usuario da clic en un botn, el procedimiento de evento CLICK es ejecutado. Usted sita cdigo dentro del procedimiento de evento CLICK para efectuar las acciones que desee. Existen muchos medios para activar el botn de comando al estar en funcionamiento la aplicacin: Use el ratn para dar clic al botn. Mueve el enfoque hacia el botn pulsando la tecla tab, y despus seleccione el botn presionando la barra de espaciado o dando enter. Pulse la letra de acceso (ALT+ la letra subrayada) del botn de comando. Establezca, en cdigo, la propiedad VALUE del botn de comando a TRUE: cmdClose.Value=True Invoque, en cdigo, el evento CLICK del botn de comando: cmdClose.Click Si el botn de comando es el botn de comando por defecto para el formulario, pulsando ENTER selecciona el botn, an cuando Usted tenga el enfoque en otro botn que no sea el botn de comando. En tiempo de diseo, especifica el botn de comando por defecto estableciendo la propiedad DEFAULT a TRUE.

26

Si el botn de comando es por defecto el botn CANCEL para el formulario, presionando ESC selecciona el botn, an cuando el enfoque est siendo recibido por otro control. En tiempo de diseo establece por defecto como botn CANCEL estableciendo la propiedad CANCEL del botn a TRUE.

Todas estas acciones ocasionan que Visual Basic invoque el procedimiento de evento clic. A continuacin se presenta un programa que muestra el uso prctico de estos botones de comando. Primero disee un formulario que tenga las siguientes caractersticas:

En este mismo sitio aparecern tres imgenes.

Change Signal
To change the signal, click either the Change Signal button or the traffic icon itself.

Close

Establezca las propiedades del formulario anterior de la siguiente manera: Object Form Image Property Name Caption Name Appearance BorderStyle Icon Visible Name Appearance BorderStype Icon Visible Name Appearance BorderStyle Icon Visible Name Caption Name Settings FrmButton Test Button ImgRed 0-Flat 0-None (*)TRFFC10C False ImgGreen 0-Flat 0-None (*)TRFFC10A False ImgYellow 0-Flat 0-None (*)TRFFC10B False CmdChange Change Signal CmdClose

Image

Image

CommandButton CommandButton

27

Label

Caption Name BorderStyle Caption

Close LblHelp 0-None To change the signal, click either then Change Signal button or the traffic icon itself

(*) Antes del nombre de archivo se debe escribir la ruta de acceso, que es: C:\Archivos de Programas\DevStudio\VB\Graphics\Icons\Traffic\ Nota: Los iconos de trfico son tres, uno para mostrar la luz roja, otro para mostrar la luz verde y un tercero para mostrar la luz amarilla. En tiempo de diseo, al escribir las propiedades del control IMAGE, har que aparezca dentro del formulario las imgenes en cuestin, extradas de la ruta que se haya indicado; el asunto es que, en primer lugar, una vez que una imagen aparece en el formulario, la ruta se borra; y, en segundo lugar, en cuando se tengan las tres imgenes depositadas sobre el formulario, estas se deben situar, exactamente, una encima de la otra, para poder lograr nitidez en el efecto visual que evoca el semforo. El cdigo que debe acompaar al formulario anterior y a sus propiedades es el siguiente: Private Sub ChangeSignal() ' Check to see what color the light is, and then change ' it to the next color. The order is green, yellow, ' and then red. If imgGreen.Visible = True Then imgGreen.Visible = False imgYellow.Visible = True ElseIf imgYellow.Visible = True Then imgYellow.Visible = False imgRed.Visible = True Else imgRed.Visible = False imgGreen.Visible = True End If End Sub Private Sub cmdChange_Click() Call ChangeSignal ' Call the ChangeSignal procedure. End Sub Private Sub cmdClose_Click() Unload Me ' Unload this form. End Sub Private Sub imgGreen_Click() Call ChangeSignal ' Call the ChangeSignal procedure. End Sub Private Sub imgRed_Click() Call ChangeSignal ' Call the ChangeSignal procedure. End Sub Private Sub imgYellow_Click() Call ChangeSignal ' Call the ChangeSignal procedure. End Sub

28

Cuando el usuario da clic al botn de comando que tiene el ttulo CHANGE SIGNAL, el cdigo incluido dentro del evento del comando clic, se ejecuta. En el ejemplo, da la apariencia de que una diferente luz de trafico es desplegada cada vez que a este botn se le da clic, cuando en realidad lo que hace es que cada vez que se da clic se despliega un diferente icono. Los nombres de los iconos son TRFFC10A, TRFFC10B y TRFFC10C. Controles para desplegar texto y para dar entrada a texto Los controles LABEL y TEXT BOX son usados para desplegar o entrar texto. Use LABEL cuando desee que su aplicacin despliegue texto sobre el formulario y TEXT BOX cuando desee permitir al usuario que entre texto. El LABEL contiene texto que puede ser nicamente ledo, mientras que el TEXT BOX contiene texto que puede ser editado. Para proporcionar esta caracterstica: Use este Control:

Texto que puede ser editado por el usuario, por TEXT BOX ejemplo, un campo de orden de entrada, o un campo para contrasea Texto que solamente es desplegado, por ejemplo, para LABEL identificar un campo sobre el formulario o para desplegar instrucciones al usuario

Uso de LABEL para desplegar texto El control LABEL despliega texto que el usuario no puede directamente cambiar. Puede usar LABEL para identificar controles tales como TEXT BOX y SCROLL BAR que no disponen de propiedades de ttulo. El texto que despliega LABEL es controlado por la propiedad CAPTION, que puede ser establecida en tiempo de diseo a travs de la ventana de propiedades o en tiempo de ejecucin asignada por cdigo. Por defecto, la propiedad CAPTION es la nica parte visible del control. Sin embargo, si establece la propiedad BORDER STYLE en 1 (que lo puede hacer en tiempo de diseo), el LABEL se muestra con un borde que lo hace similar a un TEXT BOX. Puede cambiar ms la apariencia del LABEL estableciendo las propiedades BACKCOLOR, BACKSTYLE, FORECOLOR, y FONT. Cambiar de tamao el LABEL para ajustarlo al contenido Los ttulos de una lnea pueden ser especificados en tiempo de diseo a travs de la ventana de propiedades. Pero, cmo hacer cuando se necesite de un ttulo ms largo o un ttulo que deba de cambiarse en tiempo de ejecucin? El control LABEL dispone de dos propiedades que ayudan a ajustarse al contenido, sea para ttulos largos como pequeos: AUTOSIZE y WORD WRAP. La propiedad AUTOSIZE determina si el control debe ser automticamente modificado de tamaos para que se ajuste a su contenido. Si esta propiedad es establecida a TRUE el LABEL crece horizontalmente para ajustarse a su contenido. La propiedad WORD WRAP ocasiona que el LABEL crezca verticalmente para ajustarse a su contenido, mientras mantiene su mismo ancho. Ejemplo de programa WORD WRAP y AUTO SIZE A continuacin se presenta un programa que es una demostracin de las propiedades AUTO SIZE y WORD WRAP. Dibuje un formulario para que tenga el siguiente aspecto:

A demonstration of the AutoSize and WordWrap Properties 29

AutoSize WordWrap

Cycle

Close

Click the AutoSize or WordWrap buttons to see their effect on the label

A continuacin se presenta la tabla de las propiedades que debe tener este mdulo: Object CommandButton Label Property Name Caption Name BorderStyle Caption Settings CmdClose Close LblHelp 0-None Check the AutoSize or the Word Wrap buttons to see their effect on the label

Hasta aqu las propiedades. A continuacin se presenta el cdigo del programa: Sub Display() ' this subroutine changes the display ' characteristics of the label control ' Reset the example. lblDisplay.AutoSize = False lblDisplay.WordWrap = False lblDisplay.Width = 1695 lblDisplay.Height = 225 ' Check for WordWrap and Autosize. If chkWordWrap.Value = 1 Then lblDisplay.WordWrap = True End If If chkAutoSize.Value = 1 Then lblDisplay.AutoSize = True End If End Sub Private Sub chkAutoSize_Click() ' call the Display subroutine Call Display End Sub Private Sub chkWordWrap_Click()

30

' call the Display subroutine Call Display End Sub Private Sub cmdClose_Click() Unload Me ' Unload this form. End Sub Private Sub cmdCycle_Click() ' cycle through the four possible combinations ' neither check box is selected If chkAutoSize.Value = 0 And _ chkWordWrap.Value = 0 Then ' select the AutoSize check box chkAutoSize.Value = 1 ' both check boxes are selected ElseIf chkAutoSize.Value = 1 And _ chkWordWrap.Value = 1 Then ' deselect the AutoSize check box and ' select the WordWrap check box chkAutoSize.Value = 0 chkWordWrap.Value = 1 ' only the WordWrap check box is selected ElseIf chkAutoSize.Value = 0 And _ chkWordWrap.Value = 1 Then ' deselect both check boxes chkAutoSize.Value = 0 chkWordWrap.Value = 0 ' only the AutoSize check box is selected Else ' select the WordWrap check box - the ' AutoSize check box is already selected chkWordWrap.Value = 1 End If End Sub Trabajando con TEXT BOXES TEXT BOXES son controles verstiles que pueden ser usados para obtener datos del usuario o para desplegar texto. Los TEXT BOXES no deben ser usados para desplegar texto que Usted no desea que sea cambiado por el usuario, a no ser que establezca la propiedad LOCKED a TRUE. El texto desplegado en un TEXT BOX es controlado por la propiedad TEXT. Puede establecerse de tres diferentes formas: en tiempo de diseo, a travs de la ventana de propiedades; en tiempo de ejecucin, a travs de cdigo; o como entrada de datos ejecutada por el usuario en el momento en que la aplicacin est en funcionamiento. Lneas de texto mltiple y WORD WRAP Por defecto, el TEXT BOX despliega una lnea de texto y no despliega SCROLL BARS (barras de navegacin.). Si el texto es mayor que el espacio disponible, solo una parte del texto ser visible. La apariencia y comportamiento del TEXT BOX puede modificarse estableciendo dos propiedades: MULTI LINE y SCROLL BARS, las que estn disponibles nicamente en tiempo de diseo. Nota: la propiedad SCROLL BARS no debe confundirse con el control SCROLL BAR, que no se pegan a TEXT BOXES y disponen de su propio juego de propiedades. Establecer MULTI LINE a TRUE permite que el TEXT BOX acepte o despliegue mltiples lneas de texto en tiempo de ejecucin. Un TEXT BOX con multilneas automticamente maneja WORD WRAP, siempre que no estn establecidas las propiedades de barras de navegacin horizontal. La propiedad de las barras de

31

navegacin es establecida en cero ninguna, por defecto. El WORD WRAP automtico libera al usuario de tener que insertar avances de lneas al final de las lneas. Cuando una lnea de texto es mayor que lo que se puede desplegar en una lnea, el texto contina el despliegue en la lnea siguiente. Los avances de lneas no pueden ser introducidos en la ventana de propiedades en tiempo de diseo. Dentro de un procedimiento, Usted crea avances de lnea insertando un retorno de carro y un avance de lnea (caracteres ANSI 13 y 10). Puede incluso usar las constantes vbCrLf para insertar una combinacin de retorno de carro y avance de lnea. Por ejemplo, el siguiente procedimiento de evento escribe dos lneas de texto en una caja de texto multilnea (TEXT1) cuando el formulario es cargado: Sub Form_Load ( ) Text1.Text=Aqu existen dos lneas _ & vbCrLf & en una caja de texto. End Sub Trabajando con texto en un TEXT BOX Usted puede controlar el punto de insercin y comportamiento de seleccin en una caja de texto con las propiedades SEL START, SEL LENGTH y SEL TEXT. Estas propiedades estn disponibles nicamente en tiempo de ejecucin. Cuando por primera vez una caja de texto recibe el enfoque, el punto de insercin o cursor por defecto se ubica a la izquierda de cualquier texto existente. Este punto de insercin puede moverlo el usuario usando el teclado o el ratn. Si esta caja de texto pierde el enfoque y despus vuelve a obtenerlo, el punto de insercin aparecer en el sitio en que lo dej el usuario la ltima vez. Algunas veces este comportamiento podra desconcertar al usuario. En una aplicacin de procesadores de palabras, el usuario espera que los nuevos caracteres aparezcan despus de cualquier texto existente. En una aplicacin de entrada de datos, el usuario espera que lo que digite sustituya cualquier dato existente. Las propiedades SEL START y SEL LENGTH le permiten modificar este comportamiento y ajustarlo a su propsito. La propiedad SEL START es un nmero que indica el punto de insercin dentro de la cadena del texto, siendo cero la posicin ms a la izquierda. Si la propiedad SEL START es establecida en un valor que sea igual o mayor que la cantidad de caracteres que acuse la cadena de texto, el punto de insercin aparecer despus del ltimo carcter. La propiedad SEL LENGTH es un valor numrico que establece el ancho del punto de insercin. Estableciendo SEL LENGTH a un nmero mayor que cero provoca que ese nmero de caracteres sea seleccionado, inicindose desde el actual punto de insercin. Si el usuario inicia el tecleo mientras un bloque de texto est seleccionado, el texto seleccionado ser sustituido. En algunos casos, podra desear sustituir el texto seleccionado con nuevo texto usando el comando PASTE. La propiedad SEL TEXT es una cadena de texto que puede asignar en tiempo de ejecucin para sustituir la actual seleccin. Si no existe texto seleccionado, SEL TEXT insertar su texto a partir del actual punto de insercin. A continuacin se presenta un programa que ejemplifica estos casos: Dibuje un formulario con las siguientes caractersticas:

32

The multiline property is set to false in this text box

The multiline property is set to true in this text box

Set the insertion point o o o o o Default Settings Insertion Point at End Insertion Point After 5th Character Select All Text Insert Text RESET Select an option to see its effect on the first text box

CLOSE

Las propiedades del formulario diseado anteriormente son las siguientes: Object Property Settings Form Name FrmText Caption Text Box Properties TextBox Name TxtDisplay Mutiline False Text The multilane property is set to false in this example TextBox Name TxtMulti Multilane True Text The multilane property is set to true in this text box Frame Name FraInsert Caption Set the insertion point OptionButton Name OptDefault Caption Default Settings OptionButton Name OptEnd Caption Insertion point at end OptionButton Name OptInsert Caption Insertion point after 5th character OptionButton Name OptSelect Caption Select all text OptionButton Name OptText Caption Insert Text Label Name LblHelp Caption Select an option to see its effect on the first text box CommandButton Name CmdReset Caption Reset CommandButton Name CmdClose

33

Caption

Close

A continuacin se presenta el cdigo que funciona con el formulario y las propiedades antes descritas: Private Sub cmdClose_Click() Unload Me ' Unload this form. End Sub Private Sub cmdReset_Click() ' restore the original text txtDisplay.Text = "The MultiLine property is set to False in this example" ' reset the option buttons to the default optDefault.Value = True End Sub Private Sub optDefault_Click() ' place the insertion point at the beginning txtDisplay.SelStart = 0 ' set the focus to the text box so we can see ' the result of our settings txtDisplay.SetFocus End Sub Private Sub optEnd_Click() ' find the length of the string and place ' the insertion point at the end txtDisplay.SelStart = Len(txtDisplay.Text) ' set the focus to the text box so we can see ' the result of our settings txtDisplay.SetFocus End Sub Private Sub optInsert_Click() ' place the insertion point after 5th char txtDisplay.SelStart = 5 ' set the focus to the text box so we can see ' the result of our settings txtDisplay.SetFocus End Sub Private Sub optSelect_Click() ' place the insertion point at the beginning txtDisplay.SelStart = 0 ' find the length of the string and ' select that number of characters txtDisplay.SelLength = Len(txtDisplay.Text) ' set the focus to the text box so we can see ' the result of our settings txtDisplay.SetFocus End Sub Private Sub optText_Click() ' insert "NEW STRING" at the insertion point ' if text is selected, it will be replaced txtDisplay.SelText = "NEW TEXT" ' set the focus to the text box so we can see ' the result of our settings txtDisplay.SetFocus End Sub Controles que presentan elecciones al usuario

34

La mayora de las aplicaciones necesitan presentar elecciones a sus usuarios, yendo desde una simple opcin de s / no, hasta selecciones de una lista que contiene centenares de posibilidades. Visual Basic incluye diversos controles que son tiles para la presentacin de elecciones. La siguiente tabla resume estos controles y su uso apropiado. Para proporcionar esta caracterstica Use este control Un juego pequeo de elecciones a partir del cual el usuario pueda Check Boxes elegir una o ms opciones. Un juego pequeo de elecciones a partir del cual el usuario pueda Option Buttons (use FRAMES si grupos elegir solo una opcin. adicionales se necesitan). Una lista de elecciones escalable desde la cual el usuario pueda List Box elegir. Una Bold lista de elecciones escalable con un campo para the bold or italic check Select editar texto. Combo Box Italic El usuario puede, elegir de la lista, o teclear su eleccin en el effect on the boxes to see their campo de edicin.

above text

Some sample text Close

Seleccionar opciones individuales con CHECK BOXES Un CHECK BOX se usa para indicar que una condicin en particular est activada o desactivada. Usa CHECK BOXES en la aplicacin para suministrar a los usuarios opciones de verdadero o falso, y de si o no. En vista que los CHECK BOXES funcionan en forma independiente entre ellos, el usuario puede seleccionar cualquier nmero de CHECK BOXES a un mismo tiempo. Un CHECK BOX por defecto est desactivado; cuando el CHECK BOX est desactivado la propiedad VALUE es cero; cuando est activado la propiedad VALUE es uno. Visual Basic proporciona las constantes vbChecked y vbUnchecked para representar los valores uno y cero. Por ejemplo: If ChkBold.Value=vbChecked then TxtDisplay.Font.Bold=True Else TxtDisplay.Font.Bold=False End If A continuacin se presenta un programa que ejemplicifica lo anterior. Disee un formulario que tenga lo siguiente: A continuacin establezca las propiedades del formulario de la siguiente manera: Object Property Setings Form Name FrmCheck Caption Check Box Example TextBox Name TxtDisplay Text Some Sample Text CheckBox Name ChkBold Caption Bold

35

CheckBox Label

Name Caption Name BorderStyle Caption

CommandButton

Name Caption

ChkItalic Italic LblEnter 0-None Select the Bold or Italic check boxes to see their effect on the above text CmdClose Close

A continuacin se presenta el cdigo que el formulario y las propiedades anteriores necesitan: Private Sub chkBold_Click() ' The Click event occurs when the check box changes state. ' Value property indicates the new state of the check box. If chkBold.Value = 1 Then ' If checked. txtDisplay.FontBold = True Else ' If not checked. txtDisplay.FontBold = False End If End Sub Private Sub chkItalic_Click() ' The Click event occurs when the check box changes state. ' Value property indicates the new state of the check box. If chkItalic.Value = 1 Then ' If checked. txtDisplay.FontItalic = True Else ' If not checked. txtDisplay.FontItalic = False End If End Sub Private Sub cmdClose_Click() Unload Me ' Unload this form. End Sub Agrupar las opciones con los OPTION BUTTONS Los OPTIONS BUTTONS presentan juegos de dos o ms elecciones al usuario. Al contrario de los CHECK BOXES, sin embargo, los OPTIONS BUTTONS deben siempre permanecer como parte de un grupo; seleccionar uno de los botones desactiva en el acto al resto de los botones en el grupo. Una definicin de un grupo de botones de opcin sera: Aqu est este juego de opciones, de las cuales podr elegir una y solamente una. A los OPTIONS BUTTONS se les conoce tambin como botones de radio. Creacin de grupos de OPTION BUTTON Todos los OPTION BUTTON situados directamente en un formulario (esto es, no dentro de un FRAME ni de un PICTURE BOX) constituyen un grupo. Si desea crear grupos adicionales debe depositarlos en FRAMES o PICTURE BOXES. Todos los OPTION BUTTON depositados en un FRAME constituyen un grupo separado, de igual forma los depositados en un PICTURE BOX. Cuando crea grupos separados de esta forma, siempre debe primero dibujar el FRAME o el PICTURE BOX, y despus dibujar los OPTION BUTTON sobre el FRAME o sobre el PICTURE BOX. Para agrupar controles en un FRAME:

36

1.

Seleccione el FRAME de la caja de herramientas y dibjelo sobre el formulario.

2. Seleccione el OPTION BUTTON de la caja de herramientas y dibjelo sobre el FRAME.


3. Repita el paso dos por cada OPTION BUTTON adicional que desee agregar al FRAME. Dibujar primero el FRAME y despus dibujar el OPTION BUTTON sobre el FRAME le permite mover el FRAME y los OPTION BUTTON juntos. Si utiliza el mtodo del doble clic para traslado de controles de la caja de herramientas hacia el formulario, o si dibuja primero el FRAME sobre el formulario y dibuja despus los OPTION BUTTON tambin sobre el formulario, y despus arrastra los OPTION BUTTON y los ubica sobre el FRAME, no podr mover el FRAME y los OPTION BUTTON juntos. La clave para que esto funcione adecuadamente es dibujar primero el FRAME, y despus, sobre el FRAME, dibujar los OPTION BUTTON. Recuerde que la accin dibujar implica dos pasos: dar un clic sobre el control ubicado en la caja de herramientas, en este caso el FRAME, y despus trasladarse al formulario para dibujar el FRAME, que se logra teniendo presionado el botn izquierdo del ratn y arrastrndolo hacia la derecha y un poquito hacia abajo, soltando el botn del ratn hasta que consiga dibujar el control del tamao deseado; este tamao no debe ser tan exacto, ya que posteriormente podr ajustar el tamao a su gusto. Despus, para trasladar los OPTION BUTTON, hace el mismo procedimiento: da un clic al OPTION BUTTON, y despus se traslada al formulario, pero dibuja el OPTION BUTTON no sobre el formulario, sino sobre el FRAME. Esta ltima accin la repetir por cada OPTION BUTTON que desee ubicar sobre el FRAME. Nota: Si ya existen sobre el formulario FRAME y OPTION BUTTON y desea trasladar estos ltimos al FRAME, puede lograrlo satisfactoriamente, no arrastrndolos, sino usando el procedimiento de CUT y PASTE, de esta forma: selecciona el OPTION BUTTON dndole un clic, despus da clic en CUT, a continuacin selecciona el FRAME dndole un clic, y finalmente da clic en PASTE; el sistema mostrar un mensaje en pantalla que solicita que confirme si est creando un arreglo de controles, a lo cual se debe responder afirmativamente. Contenedores para controles Aunque los controles son objetos independientes, cierta relacin de padres e hijos existe entre los formularios y controles. Para comprender el concepto de contenedores, Usted debe entender que todos los controles son hijos del formulario sobre el cual son dibujados. En realidad, muchos controles aceptan propiedades READ ONLY PARENT, que devuelve el formulario sobre el cual el control est ubicado. Siendo un hijo afecta la ubicacin de un control sobre el formulario padre. Las propiedades LEFT y TOP de un control son relativas al formulario padre, y los controles no pueden moverse ms all de la frontera que indique el padre. Al mover un contenedor se mueven tambin sus controles, y las posiciones del control en relacin a las propiedades LEFT y TOP de su contenedor no cambian en vista de que los controles se mueven junto con el contenedor. Seleccionar o Deshabilitar botones de opcin Un OPTION BUTTON puede ser seleccionado por: Darle clic en tiempo de ejecucin. Dar tab hasta llegar al grupo de OPTION BUTTON y despus usar las flechas de direccin hasta seleccionar un OPTION BUTTON del grupo. Asignar, a su propiedad VALUE, el atributo TRUE, en cdigo: optChoice.Value=True Usar una tecla de acceso rpido indicada por la letra subrayada en el ttulo del control. Para que un OPTION BUTTON sea el botn por defecto dentro del grupo, establezca su propiedad VALUE a TRUE en tiempo de diseo. Se mantendr seleccionado, hasta que el usuario seleccione un OPTION BUTTON diferente o cuando se cambie a travs de cdigo. Para deshabilitar un OPTION BUTTON, establezca su propiedad ENABLE a FALSE. Cuando la aplicacin est activa, este OPTION BUTTON se mostrar difuminado, dando a entender que no se encuentra disponible.

37

A continuacin se presenta un programa que ejemplifica lo antes dicho. Disee un formulario con las siguientes caractersticas:

You Selected a Pentium running Windows NT


o o o 486 Pentium Pentium Pro

Operating System o Windows 95 o Windows NT

Select a processor and Operating System

Close

Para el formulario anterior, establezca las siguientes propiedades: Object Property Form Name Caption OptionButton Name Caption OptionButton Name Caption OptionButton Name Caption Frame Name Caption OptionButton Name Caption OptionButton Name Caption Label Name BorderStyle Caption CommandButton Name Caption

Settings FrmOptions Options Opt486 486 Opt586 Pentium Opt686 Pentium Pro FraSystem Operating System OptWin95 Windows 95 OptWinNT Windows NT LblHelp 0-None Select a Processor and Operating System CmdClose close

El cdigo que acompaa al formulario y propiedades anteriores es el siguiente: ' set up two string variables to hold the captions Dim strComputer As String Dim strSystem As String Sub DisplayCaption() ' concatenate the caption with the two string ' variables.

38

lblDisplay.Caption = "You selected a " & _ strComputer & " running " & strSystem End Sub Private Sub cmdClose_Click() Unload Me 'unload the form End Sub Private Sub Form_Load() ' invoke a Click event in the default options ' to update the label caption opt486_Click optWin95_Click End Sub Private Sub opt486_Click() ' assign a value to the first string variable strComputer = "486" ' call the subroutine Call DisplayCaption End Sub Private Sub opt586_Click() ' assign a value to the first string variable strComputer = "Pentium" ' call the subroutine Call DisplayCaption End Sub Private Sub opt686_Click() ' assign a value to the first string variable strComputer = "Pentium Pro" ' call the subroutine Call DisplayCaption End Sub Private Sub optWin95_Click() ' assign a value to the second string variable strSystem = "Windows 95" ' call the subroutine Call DisplayCaption End Sub Private Sub optWinNT_Click() ' assign a value to the second string variable strSystem = "Windows NT" ' call the subroutine Call DisplayCaption End Sub La aplicacin anterior, llamada OPTIONS, responde a los eventos de la siguiente manera: El evento clic para los tres primeros OPTION BUTTONS asigna la correspondiente descripcin a la variable de cadena a nivel de formulario llamada strComputer. El evento clic para los dos ltimos OPTION BUTTONS asigna la correspondiente descripcin a una segunda variable de cadena a nivel de formulario llamada strSystem. Lo fundamental en este planteamiento es el uso de estas dos variables a nivel de formularios, strComputer y strSystem. Estas variables contienen diferentes valores de cadena, en dependencia de cuales botones de opcin fueron ltimamente seleccionados. Cada vez que un nuevo botn de opcin es seleccionado, el cdigo de su correspondiente evento clic actualiza la variable correcta:

39

Private Sub opt586_Clic ( ) StrComputer=Pentium Call DisplayCaption End Sub Este despus llama a un procedimiento, llamado DisplayCaption, que concatena las dos variables y actualiza la propiedad CAPTION del control LABEL: Sub DisplayCaption ( ) LblDisplay.Caption=You selected a & _ StrComputer & running & strSystem End Sub Un procedimiento es usado en vista de que la actualizacin de la propiedad CAPTION es esencialmente la misma para todos los cinco botones de opcin, solo el valor de las variables cambia de una instancia a la siguiente. Esto le ahorra tener que repetir el mismo cdigo por cada evento clic. Traduccin: Derechos de Autor: RBsoftware (2001) Viernes, 6 de abril 2001. 10:26. Archivo: Traduccin VB3

Uso de LIST BOXES y COMBO BOXES Las LIST BOXES y COMBO BOXES presentan una lista de opciones al usuario. Por defecto las opciones son desplegadas verticalmente en una columna, aunque puede colocar tambin mltiples columnas. Si el nmero de elementos excede lo que va a ser desplegado, aparecen automticamente barras de navegacin sobre el control. El usuario despus puede navegar dentro de la lista, hacia arriba o hacia abajo, hacia la derecha o hacia la izquierda. El control COMBO BOX combina las cualidades de una caja de texto y una lista. Este control permite que el usuario efecte la seleccin ya sea tecleando texto dentro de la caja de texto, o seleccionando uno de los elementos que se muestran en la lista. En contraste con algunos de los otros controles que contienen un nico valor; por ejemplo, la propiedad CAPTION del LABEL o la propiedad TEXT de la caja de texto, los LIST BOXES y COMBO BOXES contienen valores mltiples o una coleccin de valores. Ellos tienen mtodos intrnsicos para agregar, remover y recuperar valores de sus colecciones en tiempo de ejecucin. Para agregar elementos diversos a un LIST BOX llamada LIST1, se usa el cdigo siguiente: List1.AddItem Paris List1.AddItem Nueva York List1.AddItem Buenos Aires LIST BOXES y COMBO BOXES son un medio efectivo para presentar un extenso nmero de elecciones al usuario en una cantidad de espacio limitada. Uso de SCROLL BARS como dispositivos de entrada Aunque los SCROLL BARS son a menudo anexadas a cajas de texto y ventanas, algunas veces podr verlas como dispositivos de entrada. En vista que estos controles pueden indicar la posicin actual sobre una escala, los controles SCROLL BAR pueden ser usados en forma individual para controlar entradas al programa, por ejemplo, para controlar el volumen de sonido o para ajustar los colores de una imagen. Los controles HScrollBar (Horizontal) y VScrollBar (vertical) operan en forma independiente de otros controles y disponen de su propio juego de eventos, propiedades y mtodos. Los controles SCROLL BAR no son los mismos SCROLL BAR que estn internos y que aparecen en forma automtica en LIST BOXES y COMBO BOXES, ni son los mismos SCROLL BAR que se muestran en los controles TEXT BOX y MDI FORM, ya que estos son propiedades que pueden agregarse o removerse y que se anexan a estos controles.

40

Controles que despliegan imgenes y grficos Ya que Windows es una interfase de usuario grfica, es importante tener un medio para desplegar imgenes grficas en la interfase de su aplicacin. Visual Basic incluye cuatro controles que facilitan el trabajo con grficos: el control PICTURE BOX, el control IMAGE, el control SHAPE y el control LINE. Los controles IMAGE, SHAPE, y LINE, algunas veces son tambin conocidos como controles grficos peso pluma. Ellos demandan menos recursos del sistema y en consecuencia se despliegan de alguna forma ms rpidos que el control PICTURE BOX; ellos contienen juegos de propiedades, mtodos y eventos tambin disponible en el PICTURE BOX. Cada uno de ellos se ajusta a particulares propsitos, acorde como lo muestra la siguiente tabla: Para proporcionar esta caracterstica Use este control Un contenedor para otros controles. Mtodos para imprimir o graficar. Desplegar una imagen. Desplegar un elemento grfico simple. Picture Box Picture Box Image Control o Picture Box Shape o Line

Trabajando con el control PICTURE BOX El uso primordial del control PICTURE BOX es desplegar una imagen al usuario. La imagen actual que es desplegada es determinada por la propiedad PICTURE. La propiedad PICTURE contiene el nombre del archivo (y una ruta opcional) para el archivo de imagen que Usted desea desplegar. Nota: Los objetos formularios tienen tambin la propiedad PICTURE que puede ser establecida para desplegar una imagen directamente sobre el fondo del formulario. Para desplegar o sustituir una imagen en tiempo de ejecucin, puede usar la funcin LoadPicture para establecer la propiedad PICTURE. Usted suministra el nombre (y la ruta opcional) de la imagen y la funcin LoadPicture se encarga de los detallas de cargarla y desplegarla. Por ejemplo: picMain.Picture=LoadPicture(VANGOGH.BMP) El control PICTURE BOX dispone de la propiedad AUTO SIZE que, cuando es establecida a TRUE, ocasiona que el PICTURE BOX se redimensione automticamente para ajustarse a las dimensiones de su contenido. Tenga cuidado adicional al disear su formulario si planea usar el PICTURE BOX con la propiedad AUTO SIZE establecida. La imagen se dimensionar sin tener cuidado de los otros controles que estn sobre el formulario, posiblemente causando resultados no esperados, tales como recubrir otros controles. Es una buena idea hacer pruebas de esto, cargando cada una de las imgenes en tiempo de diseo. Uso del PICTURE BOX como contenedor El PICTURE BOX puede tambin ser usado como contenedor de otros controles. Igual al control FRAME, puede dibujar controles sobre el PICTURE BOX. La ubicacin de los controles dentro de la imagen ser relativa a la imagen y no al formulario. El uso comn de un PICTURE BOX como contenedor es que sirve como barra de herramientas o barra de estado. Puede situar sobre el PICTURE BOX controles IMAGES para que acten como botones, o agregar etiquetas para desplegar mensajes de estado. Estableciendo las propiedades TOP, BOTTON, LEFT o RIGHT, el PICTURE BOX se adhiere a la orilla del formulario. Otros usos del PICTURE BOX

41

El control PICTURE BOX tiene diversos mtodos que son de utilidad para otros propsitos. Piense que el PICTURE BOX es como una blanca lona sobre la cual puede pintar, dibujar o imprimir. Un simple control puede ser usado para desplegar texto, grficos, incluso animacin sencilla. El mtodo PRINT le permite dar salida de texto hacia el control PICTURE BOX justamente como lo hace hacia una impresora. Diversas propiedades de fuente estn disponibles para controlar la salida de texto por el mtodo PRINT; el mtodo CLS puede usarse para borrar la salida. Los mtodos CIRCLE, LINE, POINT y PSET pueden ser usados para dibujar grficos sobre un PICTURE BOX. Las propiedades tales como DRAW WIDTH, FILL COLOR y FILL STYLE le permiten ajustar la apariencia de los grficos. La animacin puede ser creada usando el mtodo PAINT PICTURE a travs del movimiento de las imgenes dentro del control PICTURE y haciendo cambios rpidos entre diferentes y diversas imgenes. Controles grficos peso pluma Los controles IMAGE, SHAPE y LINE, son considerados como controles peso pluma, es decir, ellos toleran solamente algunas de las propiedades que se encuentran en un PICTURE BOX. En vista de esto ellos requieren menos recursos del sistema y se cargan ms rpido que un control PICTURE BOX. Uso de controles IMAGE en vez de PICTURE BOXES El control IMAGE es similar al control PICTURE BOX pero es usado solamente para desplegar imgenes. No tiene la cualidad para actuar como contenedor de otros controles, y no acepta los mtodos avanzados del PICTURE BOX. Las imgenes son cargadas dentro del control IMAGE de la misma forma en que ellas son cargadas en un PICTURE BOX: en tiempo de diseo, estableciendo la propiedad PICTURE a un nombre de archivo con su ruta; en tiempo de ejecucin usando la funcin LoadPicture. El comportamiento de redimensionamiento del control IMAGE difiere del PICTURE BOX. El IMAGE control tiene la propiedad STRECH mientras que el PICTURE BOX tiene la propiedad AUTO SIZE. Estableciendo la propiedad AUTO SIZE a TRUE ocasiona que el PICTURE BOX se redimensione a la dimensin de la imagen; establecindola a FALSE motiva que la imagen sea recortada (solo una porcin de la imagen es visible). Cuando en el control IMAGE su propiedad STRECH es establecida en FALSE provoca que el control sea redimensionado a la dimensin de la imagen. Estableciendo la propiedad STRECH a TRUE produce que la imagen sea redimensionada a la dimensin del control, lo que puede ser causa de que la imagen aparezca distorsionada.

Uso del control IMAGE para crear sus propio botones El control IMAGE reconoce el evento clic, de manera que puede usar este control en cualquier lugar en que vaya a usar un botn de comando. Este es un mtodo conveniente para crear botones con imgenes es vez de botones con texto o ttulos. El agrupamiento de diversos controles IMAGE juntados horizontalmente a lo largo de la parte superior de la pantalla usualmente dentro de un control PICTURE BOX permite crear una barra de herramientas en su aplicacin. Para hacer que un borde rodee al control IMAGE, establezca la propiedad BORDER STYLE en 1 Fixed Single. Nota: Al contrario de los botones de comando, los controles IMAGE no dan la apariencia de ser oprimidos cuando se les da clic. Esto significa que a no ser que no cambie este mapa de bits dentro del evento MouseDown, no existir efecto visual de que el usuario ha oprimido este botn. Uso de los controles SHAPE y LINE

42

Los controles SHAPE y LINE son beneficiosos para dibujar elementos grficos sobre la superficie del formulario. Estos controles no aceptan eventos; ellos estrictamente son para propsitos decorativos. Diversas propiedades son proporcionadas para controlar la apariencia del control SHAPE. Estableciendo la propiedad SHAPE, puede ser desplegado como un rectngulo, cuadrado, ovalado, rectngulo redondeado o un cuadrado redondeado. Las propiedades BORDER COLOR y FILL COLOR pueden ser instaladas para cambiar el color; las propiedades BORDER STYLE, BORDER WIDTH, FILL STYLE y DRAW MODE, controlan cmo el control SHAPE es dibujado. El control LINE es similar al control SHAPE, pero solo puede ser usado para dibujar lneas rectas. A continuacin se presenta la aplicacin llamada IMAGES, que sirve de ejemplo a los casos tratados hasta ahora. Dibuje un formulario que tenga lo siguiente: Los cuatro cuadrados en realidad son cuatro imgenes.

Click on an image and see what happen

Close

Al formulario anterior, asgnele las siguiente propiedades: Object Property Form Name Caption Shape Name BorderWidth Shape Image Name Picture Image Name Picture Image Name Picture Image Name Picture Label Name BorderStyle Caption

Settings FrmImages Images ShpCard 2 4-Rounded Rectangle ImgClub (*) IconMisc35 ImgDiamond (*)IconMisc36 ImgHeart (*)IconMisc34 ImgSpade (*)IconMisc37 LblEnter 0-None Clic on an image and see what happen

43

CommandButton PictureBox

Name Caption Name Align AutoSize TabStop

CmdClose Close PicStatus 2-AlignButton True False

A continuacin se presenta el cdigo que acompaa a este formulario y propiedades: Option Explicit Private Sub cmdClose_Click() Unload Me End Sub Private Sub Form_Load() shpCard.Left = -500 End Sub Private Sub imgClub_Click() shpCard.Left = imgClub.Left picStatus.Cls picStatus.Print "Selected: Club" End Sub Private Sub imgDiamond_Click() shpCard.Left = imgDiamond.Left picStatus.Cls picStatus.Print "Selected: Diamond" End Sub Private Sub imgHeart_Click() shpCard.Left = imgHeart.Left picStatus.Cls picStatus.Print "Selected: Heart" End Sub Private Sub imgSpade_Click() shpCard.Left = imgSpade.Left picStatus.Cls picStatus.Print "Selected: Spade" End Sub La aplicacin IMAGES responde a los eventos de la siguiente manera: El evento clic en cada uno de los controles de imgenes establece la propiedad LEFT del control SHAPE igual que su propiedad LEFT, moviendo la figura encima de la imagen. El mtodo CLS del PICTURE BOX es invocado, borrando el mensaje actual de la barra de estatus. El mtodo PRINT del PICTURE BOX es invocado, imprimiendo el nuevo mensaje sobre la barra de estatus. El cdigo en el evento clic del control IMAGE es el siguiente: Private Sub ImgHeart_Click ( ) ShpCard.Left=ImgClub.Left PicStatus.Cls PicStatus.Print Selected: Club ShpCard.Visible=True End Sub Observe que la primera lnea del evento clic asigna un valor (la propiedad LEFT del control IMAGE) a la propiedad LEFT del control SHAPE usando el operador =. Las siguientes dos lneas invocan mtodos, de forma que el operador no es necesitado. En la tercera lnea, el valor (Selected: Club) es un argumento del mtodo PRINT.

44

Existe una lnea ms de cdigo en la aplicacin que es de inters y que est en el evento FORM LOAD: ShpCard.Visible=False Estableciendo la propiedad VISIBLE a FALSE, el control SHAPE es escondido hasta que a la primer imagen se le da clic. La propiedad VISIBLE es establecida a TRUE como un ltimo paso que ejecuta el control IMAGE en el evento clic. El Proyecto Completo A continuacin se presentan todos los programas, vistos hasta este momento, integrados en un solo proyecto, para dar a conocer cmo se integran los programas al final de su etapa de desarrollo. Los programas son los mismos que se han visto, la diferencia es que ahora se presenta nicamente el programa principal, o mejor dicho, proyecto, el programa que los une, y que sirve de punto de inicio para la ejecucin del programa, y su punto de retorno, una vez que la actividad del programa a finalizado. Primeramente disee un formulario con las siguientes caractersticas:

Test Buttons

Check Box Option Buttons Images

Word Wrap

Text Box Exit

Establezca las propiedades del formulario anterior de la siguiente manera: Object Property Settings Form Name FrmMain Caption Control Examples CommandButton Name CmdButtons Caption Text Buttons CommandButton Name CmdWordWrap Caption Word Wrap CommandButton Name CmdText Caption Text Box CommandButton Name CmdCheck Caption Check Box CommandButton Name CmdOption Caption Option Buttons CommandButton Name CmdImages Caption Images CommandButton Name CmdExit Caption Exit

45

A continuacin se presenta el cdigo que funciona en conjunto con el formulario antes descrito, y con las propiedades antes detalladas: Private Sub cmdButtons_Click() ' invoke a Click event in the menu mnuButtons_Click End Sub Private Sub cmdCheck_Click() ' invoke a Click event in the menu mnuCheck_Click End Sub Private Sub cmdExit_Click() Unload Me ' unload the form End ' end the application End Sub Private Sub cmdImages_Click() ' invoke a Click event in the menu mnuImages_Click End Sub Private Sub cmdOption_Click() ' invoke a Click event in the menu mnuOption_Click End Sub Private Sub cmdText_Click() ' invoke a Click event in the menu mnuText_Click End Sub Private Sub cmdWordWrap_Click() ' invoke a Click event in the menu mnuWordWrap_Click End Sub Private Sub Form_Load() frmMain.Height = 3600 frmMain.Width = 4965 End Sub Private Sub mnuButtons_Click() ' display the form frmButton.Show End Sub Private Sub mnuCheck_Click() ' display the form frmCheck.Show End Sub Private Sub mnuFileExit_Click() ' invoke a Click event in the command button cmdExit_Click End Sub Private Sub mnuImages_Click() ' display the form frmImages.Show End Sub Private Sub mnuOption_Click() ' display the form frmOptions.Show End Sub Private Sub mnuText_Click()

46

' display the form frmText.Show End Sub Private Sub mnuWordWrap_Click() ' display the form frmWordWrap.Show End Sub Traduccin: Derechos de Autor: RBsoftware (2001) Sbado, 7 de abril 2001. 06:34p. Archivo: Traduccin VB4

Controles adicionales Otros controles estndar son incluidos en la caja de herramientas de Visual Basic. Otros controles son aptos para trabajar con grandes cantidades de datos contenidos en bases de datos externas. Otros controles pueden ser usados para acceder al sistema de archivos de Windows. Incluso otros controles desafan ser caracterizados, pero son tiles sin lugar a dudas. Tambin puede usar controles ActiveX, primeramente llamados controles OLE, dentro de una aplicacin Visual Basic de la misma forma que usa los controles estndar. Adems de las cualidades inherentes a los controles ActiveX, puede usarlos para crear sus propios controles. Controles ActiveX adicionales para casi todo propsito imaginable estn disponibles y son vendidos por numerosos vendedores. Controles para acceso de datos En los negocios de nuestro tiempo la mayora de la informacin es almacenada en una o ms bases de datos. Visual Basic incluye diversos controles para acceso de datos para acceder las ms populares bases de datos, incluyendo ACCESS de Microsoft y SQL SERVER. El control DATA es usado para conectar a una base de datos. Piense que esto es un conducto que conecta la base de datos con los diversos controles de su formulario. Sus propiedades, mtodos y eventos le permiten navegar y manipular los datos externos desde dentro de su propia aplicacin. El control DBLIST es similar al control LIST BOX. Cuando es usado con el control DATA, puede ser automticamente alimentado de una lista de datos proveniente de un campo ubicado en un base externa. El control DBCOMBO es parecido a una combinacin de un DBLIST y una caja de texto. El texto seleccionado en la caja de texto puede ser editado, y los cambios aparecern en la base de datos que se encuentra tras bastidores. El control DBGRID despliega datos en un cuadro o tabla. Cuando se usa en conjunto con el control DATA, presenta edicin completa de datos en mltiples campos en una base de datos. El control MSFLEXGRID es un control nico con respecto a la presentacin de los datos desde diversos ngulos. En tiempo de ejecucin, el usuario puede reordenar filas y columnas para proporcionar diferentes presentaciones de los datos. Controles del sistema de archivos Visual Basic proporciona tres controles para agregar capacidad de manipulacin de archivos a su aplicacin. Estos controles normalmente son usados en conjunto para proporcionar un panormica de unidades, directorios y archivos. Ellos disponen de propiedades y eventos especiales que los une como un solo control. El control DriveListBox se parece a un combo box. Proporciona una lista que se despliega mostrando las unidades que el usuario puede seleccionar. El control DirListBox tiene similitud a control LIST BOX, pero dispone de capacidades intrnsecas que le permiten desplegar la lista de directorios que se encuentran en la unidad seleccionada.

47

El control FileListBox tambin tiene apariencia a un LIST BOX, presentando una lista de los archivos que existan en el directorio seleccionado. El control CommonDialog une a los tres anteriores y proporciona un mtodo fcil para trabajar con el acceso a archivos.

Controles miscelneos Otros controles estndar con incluidos en Visual Basic. Cada uno sirve a aun propsito muy particular. El control TIMER puede ser usado para crear un evento en su aplicacin en un intervalo de tiempo determinado. Esto puede ser provechoso para ejecutar cdigo sin que tenga necesidad de intervenir el ser humano. El control contenedor OLE es un mtodo fcil para agregar capacidades de conexin y acoplamiento a su aplicacin. A travs del control contenedor OLE puede proporcionar acceso a la funcionalidad de cualquier aplicacin compatible con OLE, tales como EXCEL, WORD y muchos otros. El control CommonDialog agrega a su aplicacin cajas de dilogo intrnsecas para la seleccin de archivos, colores, fuentes y funciones de impresora. Entendiendo el enfoque El enfoque es la habilidad de recibir entrada del usuario a travs del ratn o del teclado. Cuando un objeto tiene el enfoque puede recibir datos del usuario. En la interfase Windows de Microsoft diversas aplicaciones pueden estarse ejecutando a un mismo tiempo, pero solamente la aplicacin que tiene el enfoque tendr una activa barra de ttulo y podr recibir datos del usuario. En un formulario Visual Basic con varias cajas de texto, solamente la caja de texto que tenga el enfoque desplegar el texto que se introduzca a travs del teclado. Los eventos GotFocus y LostFocus ocurren cuando un objeto recibe o pierde el enfoque. Los formularios y la mayora de los controles toleran estos eventos. Evento Descripcin GotFocus Ocurre cuando un objeto recibe el enfoque. LostFocus Ocurre cuando un objeto pierde el enfoque. Un procedimiento LostFocus es primordialmente usado para propsitos de verificacin y validacin, o para revertir o cambiar las condiciones que Usted estableci en el procedimiento GotFocus. Usted puede dar el enfoque a un objeto por: Seleccionado el objeto en tiempo de ejecucin. Usando una llave de acceso para seleccionar el objeto en tiempo de ejecucin. Usar el mtodo SetFocus en cdigo. Usted puede ver cundo un objeto tiene el enfoque. Por ejemplo, cuando un botn de comando tiene el enfoque, este aparece con un borde resaltado rodeando el ttulo o mensaje. Un objeto puede recibir el enfoque nicamente que su propiedad ENABLE y VISIBLE est establecida en TRUE. La propiedad ENABLE permite que el objeto responda a eventos generados por el usuario tales como los eventos del teclado y del ratn. La propiedad VISIBLE determina cundo un objeto podr ser visto en pantalla. Nota: Los controles FRAMES, LABELS, MENUS, LINES, SHAPES, IMAGES y TIMERS, no pueden recibir enfoques. Un formulario puede recibir el enfoque solamente si ninguno de los controles que contiene pueden recibir el enfoque. Estableciendo el orden TAB El orden TAB es el orden a travs del cual el usuario puede moverse de un control a otro presionando la tecla TAB. Cada formulario tiene su propio orden TAB. Usualmente el orden TAB es el mismo orden que Usted ha establecido al crear los controles.

48

Por ejemplo, Usted ha creado dos cajas de texto, TEXT1 y TEXT2, y despus un botn de comando, COMMAND1. Cuando la aplicacin se activa, TEXT1 tiene el enfoque. Presionando TAB el enfoque se mueve entre los controles en el orden que ellos fueron creados. Para cambiar el orden TAB de un control, establezca la propiedad TabIndex. La propiedad TabIndex de un control determina cual es su posicin dentro de la secuencia del orden TAB. Por defecto, el primer control creado tiene un TabIndex con valor cero, el segundo tiene un valor TabIndex de 1, y as sucesivamente. Cuando cambiar el orden de posicin de un control, Visual Basic automticamente renumera el orden de posiciones de los dems controles para reflejar inserciones y borres. Por ejemplo, si hace que el Command1 se convierta el primero en el orden TAB, los valores TabIndex de los otros controles son automticamente ajustados en orden ascendente, tal como se muestra en la tabla siguiente: Control TabIndex antes de que sea TabIndex despus de haber sido cambiado cambiado Text1 Text2 Command1 0 1 2 1 2 0

El valor mayor en el TabIndex siempre es uno menos que el nmero de controles en el orden TAB (esto porque la numeracin se inicia de cero). An cuando establezca la propiedad TabIndex a un nmero mayor que el nmero de controles, Visual Basic lo reconvierte al nmero de controles, menos 1. Nota: Los controles que no pueden recibir el enfoque, as como los deshabilitados como los controles hechos invisibles, no tiene propiedad TabIndex y no son incluidos en el orden TAB. Cuando el usuario pulsa la tecla TAB, estos controles son saltados. Excluir un control del orden TAB Usualmente, presionando TAB en tiempo de ejecucin selecciona cada uno de los controles contenidos en el orden TAB. Puede excluir un control del orden TAB estableciendo su propiedad TabStop a FALSE (0). Un control cuya propiedad TabStop ha sido establecida a FALSE contina manteniendo su posicin dentro del orden TAB actual, aun cuando sea saltado cada vez que el ciclo recorra el orden TAB. Nota: Un grupo de botones de opcin tienen solamente un TabStop. El botn seleccionado (esto es, el botn cuyo valor es establecido a TRUE) tiene la propiedad TabStop automticamente establecida en TRUE, mientras que los otros botones de opcin dentro de su grupo tienen su propiedad TabStop establecida en FALSE. Men Bsicos Si desea que su aplicacin suministre un juego de comandos a sus usuarios, los mens ofrecen un medio conveniente y consistente, y un medio fcil para que los usuarios accedan a ellos. La barra de mens aparece inmediatamente debajo de la barra de ttulo del formulario y contiene uno o ms ttulos de mens. Cuando da clic a un ttulo de men, por ejemplo Archivo, se despliega, en forma de cascada, una lista de elementos de mens. Estos elementos de mens pueden incluir comandos (tales como Nuevo y Salir), barras de separacin y subttulos de mens. Cada elemento de men que mira el usuario corresponde a un control de men definido con el editor de mens. Para que una aplicacin sea sencilla de usar, debe agrupar los mens de acuerdo a su funcin. Por ejemplo, los comandos que se relacionan con archivos, tales como Nuevo, Abrir, Guardar, todos son encontrados en el men Archivo. Algunos elementos de men ejecutan acciones en forma directa; por ejemplo el elemento SALIR, del men Archivo, cierra la aplicacin. Otros elementos del men despliegan una caja de dilogo una ventana que requiere que el usuario suministre informacin necesitada para que la aplicacin ejecute una accin. Estos

49

elementos deben ser seguidos de puntos suspensivos (...). Por ejemplo, cuando selecciona Guardar Como... a partir del men Archivo, la caja de dilogo Guardar Como aparece. Un control de men es un objeto; igual que los otros objetos tiene propiedades que pueden ser usadas para definir su apariencia y comportamiento. Puede establecer las propiedades CAPTION, ENABLED, VISIBLE, CHECKED, y otras en tiempo de diseo o en tiempo de ejecucin. Los controles de men contienen solamente un evento, el evento CLIC, el cual es invocado cuando el control de men es seleccionado con el ratn o usando el teclado. Mens Pop-up Un menu Pop-up es un men flotante que es desplegado sobre un formulario, independientemente de la barra de men. Los elementos desplegados en el men Pop-up dependen del lugar en donde est apuntando el ratn en el momento en que se pulse el botn derecho del ratn; en consecuencia, los men Pop-up son llamados mens contextuales. Usa mens Pop-up para proporcionar un mtodo eficiente de acceso a comandos comunes, en el contexto. Por ejemplo, si da clic sobre una caja de texto con el botn derecho del ratn, aparecer un men contextual. Cualquier men que tiene al menos un elemento de men puede ser desplegado en tiempo de ejecucin como men contextual. Para desplegar un men contextual, use el mtodo PopupMenu. Uso del Editor de Men Con el editor de men puede agregar nuevos comandos a mens existentes, reemplazar existentes comandos de men con sus nuevos comandos, crear nuevos mens y barras de mens, y cambiar y borrar mens existentes y barras de mens. La ventaja principal del editor de men es su uso sencillo. Puede personalizar men de una forma completamente interactiva que involucra muy poca programacin. Para desplegar el editor de men: Desde el men TOOLS, seleccione Menu Editor. Aunque casi todas las propiedades del control men pueden ser establecidas con el editor de mens, todas las propiedades del men estn tambin disponible en la ventana propiedades. Normalmente crear el men con el editor de men; sin embargo, para cambiar una propiedad debe usar la ventana propiedades. Requerir al usuario con caja de dilogo En una aplicacin bajo ambiente Windows, las cajas de dilogo son usadas para requerir del usuario datos que se necesitan para que la aplicacin contine o para desplegar informacin al usuario. Las cajas de dilogo son un tipo especializado de objetos de formulario que pueden ser creadas en una de tres diferentes maneras: Cajas de Dilogo predefinidas que pueden ser creadas a travs de cdigo usando las funciones MsgBox e InputBox. Cajas de Dilogo personalizadas que pueden ser creadas usando formularios estndar o personalizando una caja de dilogo existente. Cajas de Dilogo estndar, tales como Print y File Open, que pueden ser creadas usando el control CommonDialog. Cuando invoca la funcin MsgBox en cdigo lo hace de la siguiente manera: MsgBox Error al Abrir un Archivo. & vbCrLf & intente de nuevo. & vbexclamation & Editor de Texto. Usted suministra tres piezas de informacin o argumentos a la funcin MsgBox: el texto del mensaje, una constante (valor numrico) para determinar el estilo de la caja de dilogo, y un ttulo. Existen disponibles estilos con varias combinaciones de iconos y botones para que la creacin de las cajas de dilogo sea fciles. En vista que la mayora de las cajas de dilogo requieren intervencin del usuario, ellas de hecho son desplegadas como cajas de dilogo modales. Una caja de dilogo modal debe ser cerrada (escondida o guardada) antes de que Usted pueda continuar trabajando con el resto de la aplicacin. Por ejemplo, una caja

50

de dilogo es modal si requiere que Usted le de clic o cancel antes de que pueda cambiar a otro formulario o caja de dilogo. Las cajas de dilogo no modales le permiten que cambie el enfoque entre la caja de dilogo y otro formulario sin tener necesidad de cerrar la caja de dilogo. Puede continuar trabajando en cualquier parte de su aplicacin mientras se est desplegando la caja de dilogo. Las cajas de dilogo no modales son raras; usualmente desplegar dilogos porque una respuesta es necesaria antes de que la aplicacin pueda continuar. Desde el men EDIT, la caja de dilogo FIND en Visual Basic es un ejemplo de una caja de dilogo no modal. Use caja de dilogo no modales para desplegar comandos usados frecuentemente o informacin. Manejando proyectos Para crear una aplicacin con Visual Basic Usted trabaja con proyectos. Un proyecto es una coleccin de archivos que Usted usa para construir una aplicacin. A continuacin se describe cmo construir y manejar proyectos. Cuando crea una aplicacin usualmente crea nuevos formularios; puede incluso volver a usar o modificar formularios que fueron creados para anteriores proyectos. De igual manera para otros mdulos o archivos que quiera incluir en su proyecto. Los controles ActiveX y objetos de otras aplicaciones pueden ser compartidas entre proyectos. Despus que todos los componentes dentro de un proyecto han sido ensamblados y el cdigo ha sido escrito, compila el proyecto para crear un archivo ejecutable. Trabajando con proyectos A la vez que desarrolla una aplicacin trabaja con un proyecto para manipular los diversos archivos que estructuran la aplicacin. Un proyecto consiste de: Un archivo de proyecto que mantiene el enlace entre todos los componentes (.vbp) Un archivo para cada formulario (.frm) Un archivo de datos binario para cada formulario, que contiene informacin sobre las propiedades de los controles depositados en el formulario (.frx). Estos archivos no son editables y son generados en forma automtica para cada archivo .frm que contiene propiedades binarias, tales como PICTURE o ICON. Opcionalmente un archivo por cada mdulo de clase. Opcionalmente un archivo por cada mdulo estndar. Opcionalmente un o ms archivos conteniendo controles ActiveX (.ocx). Opcionalmente un nico archivo de recursos. Un archivo de proyecto simplemente es una lista de archivos y objetos asociados con el proyecto, as como informacin sobre las opciones de ambiente que establezca. Esta informacin es actualizada cada vez que salva el proyecto. Todos los archivos y objetos pueden ser compartidos tambin por otros proyectos. Cuando ha completado todos los archivos para un proyecto puede convertir el proyecto en un archivo ejecutable (.exe) de la siguiente manera: a partir del men Archivo, seleccione el comando MAKE PROJECT.EXE. El explorador de proyectos A la vez que crea, agrega, o remueve archivos editables de un proyecto, Visual Basic refleja sus cambios en la ventana explorador de proyectos, que contiene la lista actualizada de los archivos en el proyecto. La ventana explorador de proyecto muestra los tipos de archivos que puede incluir en su proyecto. El archivo proyecto Cada vez que salva un proyecto, Visual Basic actualiza el archivo proyecto (.vbp). Un archivo proyecto contiene la misma lista de archivos que se muestra en la ventana explorador de proyecto, as como referencias a controles ActiveX y objetos insertables que son usados en el proyecto.

51

Puede abrir un existente archivo de proyecto dndole doble clic a su icono; o eligindolo, a travs del men FILE, dndole clic a la opcin OPEN PROJECT; o arrastrando el archivo y depositndolo en la ventana explorador de proyecto. La estructura de un proyecto Visual Basic Las siguientes secciones describen los diferentes tipos de archivos y objetos que puede incluir en un proyecto. Mdulos de formularios Los mdulos de formularios (nombres de archivos con extensin .frm) contienen descripcin textual del formulario y sus controles, incluyendo las propiedades instaladas. Pueden tambin contener declaraciones a nivel de formulario de constantes, variables y procedimientos externos; procedimientos de evento; y procedimientos generales. Mdulos de clases Los mdulos de clases (nombres de archivos con extensin .cls) son similares a los mdulos de formulario, excepto que ellos no tiene interfase visual. Puede usar los mdulos de clases para crear sus propios objetos, incluyendo cdigo para mtodos y propiedades. Mdulos Estndar Los mdulos estndar (nombres de archivo con extensin .bas) pueden contener declaraciones a nivel de formulario o publicas, de tipos, constantes, variables, procedimientos externos y procedimientos pblicos. Archivos de recursos Los archivos de recursos (nombres de archivo con la extensin .res) contienen mapas de bits, cadenas de texto y otros datos que pueden ser cambiados sin tener necesidad de re editar de nuevo su cdigo. Por ejemplo, si planea ubicar su aplicacin en un lenguaje extranjero, puede mantener todas las cadenas de texto usadas en la interfase del usuario, as como los mapas de bits, en un archivo de recursos, el cual puede personalizar en vez de modificar toda la aplicacin. Un proyecto no puede tener ms de un archivo de recursos. Documentos ActiveX Los documentos ActiveX (.dob) son similares a los formularios, pero son desplegado bajo ambiente de internet. Mdulos de pgina de propiedades y controles de usuario Los mdulos de pgina de propiedades (.pag) y controles de usuario (.ctl) son tambin similares a los formularios pero son usados para crear controles ActiveX y sus asociadas pginas de propiedades para desplegar propiedades en tiempo de diseo. Componentes Adicionalmente a los archivos y mdulos, diversos de otros tipos de componentes pueden ser agregado al proyecto. Controles ActiveX Los controles ActiveX (nombres de archivo con extensin .ocx) son controles opcionales que pueden ser agregados a la caja de herramientas y usados en los formularios. Adicionales controles ActiveX estn disponibles de una amplia gama de fuentes. Usted tambin puede crear sus propios controles. Objetos insertables Los objetos insertables, tales como Excel, son componentes que puede usar para construir los bloques para estructurar soluciones integradas. Una solucin integrada puede contener datos en diversos formatos, tales como hojas de clculo, mapas de bits, y texto, que hayan sido creadas por diferentes aplicaciones. Referencias Puede tambin agregar referencias a componentes ActiveX externos que pueden ser usados por su aplicacin. Asigna referencias usando el dilogo de Referencias, accedido a travs del men Project, opcin References.

52

Diseadores ActiveX Diseadores ActiveX son herramientas para diseo de clases a partir de las cuales son creados los objetos. La interfase de diseo para formularios es la interfase de diseo por defecto. Diseos adicionales estn disponibles de otras fuentes. Controles estndar Los controles estndar son suministrados por Visual Basic. Los controles estndar, tales como botones de comando o el control FRAME, son siempre incluidos en la caja de herramientas, al contrario de los controles ActiveX y los objetos insertables, que pueden ser agregados o removidos de la caja de herramientas. Creando, Abriendo y Salvando proyectos Cuatro comandos, en el men File, le permiten crear, abrir y salvar proyectos. Comando Men New Project Open Project Descripcin Cierra el proyecto activo, sugirindole que salve cualquier archivo que haya cambiado. Puede seleccionar un tipo de proyecto desde la caja de dilogo New Project. Visual Basic crea despus un nuevo proyecto como archivo nico. Cierra el proyecto activo, solicitando al usuario que salve cualquier archivo que haya cambiado. Visual Basic despus abre cualquier proyecto que exista, incluyendo los formularios, mdulos y controles ActiveX detallado en su archivo proyecto (.vbp). Actualiza el archivo proyecto del proyecto activo y todos sus formularios, estndar y mdulos de clases. Actualiza el archivo de proyecto del proyecto actual, salvando el archivo de proyecto bajo un nombre de archivo que Usted especifica. Visual Basic tambin solicita que salve cualquier formulario o mdulo que haya cambiado.

Save Project Save Project As

Es tambin posible compartir archivos entre proyectos. Un nico archivo, como un formulario, puede ser parte de uno o ms proyectos. Tenga presente que los cambios hechos a un formulario o a un mdulo en un proyecto sern propagados entre todos los proyectos que compartan tal mdulo. Trabajando con mltiples proyectos Es posible tener abierto ms de un proyecto a un mismo tiempo. Esto es til para construir y probar soluciones que involucren controles creados por el usuario u otros componentes. Cuando ms de un proyecto es cargado el ttulo de la ventana del explorador de proyecto cambiar a Proyect Group y los componentes de todos los proyectos abiertos sern desplegados. Para agregar un proyecto adicional al grupo de proyectos actual: 1. A partir del men File, seleccione Add Project. La caja de dilogo Add Project ser desplegada. 2. Seleccione un proyecto existente o un nuevo tipo de proyecto, y seleccione Open. Para eliminar un proyecto del grupo de proyectos activos: 1. Seleccione un proyecto o componente de un proyecto de la ventana explorador de proyecto. 2. A partir del men File, elija Remove Project. Agregando, eliminando y salvando archivos Trabajar con archivos dentro de un proyecto es igual que trabajar con los propios proyectos. Para agregar un archivo a un proyecto: 1. Seleccionar el proyecto. Dar clic a Add file type, en donde file type es el tipo de archivo. La caja de dilogo Add File Type se despliega. 2. Seleccionar un archivo existente o nuevo tipo de archivo, y dar clic en Open.

53

Cuando agrega un archivo a un proyecto simplemente est incluyendo una referencia al archivo existente en el proyecto; no est agregando una copia del archivo. En consecuencia, si hace cambios al archivo y lo salva, estos cambios afectarn todos los proyectos que involucren a este archivo. Para hacerle cambios al archivo y no afectar otros proyectos, seleccione el archivo en el explorador de proyectos, seleccione Save filename As del men File y despus salve el archivo bajo otro nombre. Nota: Puede arrastrar y soltar archivos desde el explorador de Windows, File Manager o Network Neighborhood dentro de la ventana proyecto para agregarlos al proyecto. Puede tambin arrastrar y soltar archivos .ocx dentro de la caja de herramientas para agregar nuevos controles. Para borrar un archivo de un proyecto: 1. Seleccionar el archivo en el explorador de proyectos. 2. A partir del men Project, dar clic en Remove filename. El archivo ser borrado del proyecto, pero no del disco. Si borra un archivo de un proyecto, Visual Basic actualiza esta informacin en el archivo proyecto cuando lo salva. Sin embargo, si lo borra fuera del ambiente de Visual Basic ste no podr actualizar el archivo proyecto, en consecuencia, cuando abra este proyecto Visual Basic desplegar un mensaje de error alertndole que ese archivo se ha perdido. Para salvar un archivo individual sin salvar el proyecto: 1. Seleccionar el archivo en el explorador de proyectos. 2. Del men File, dar clic en Save filename. Intercalar texto Puede insertar texto existente en otros archivos e integrarlo en su mdulo de cdigo. Esto es til para agregar una lista de constantes o para agregar pedacitos de cdigo que podra haber salvado en archivos de texto. Para insertar un archivo de texto en su cdigo: 1. A partir de la ventana Project, seleccione el formulario o mdulo al cual desea insertarle el cdigo. 2. Elija el botn View Code, y mueva el cursor en el editor de cdigo a donde desea insertar el cdigo. 3. A partir del men Edit, elija Insert File. 4. Seleccione el nombre del archivo de texto que desea insertar, y dar clic en Open. Agregando controles a un proyecto El juego de controles disponibles en la caja de herramientas puede ser personalizado para cada proyecto. Cualquier control debe primero estar en la caja de herramientas antes de que pueda agregarlo al formulario en el proyecto. Agregando controles ActiveX al proyecto Puede agregar controles ActiveX y objetos insertables a su proyecto agregndolos a la caja de herramientas. Para agregar controles a la caja de herramientas del proyecto: 1. A partir del men Project, dar clic en Components. La caja de dilogo Componentes es desplegada. Los elementos listados en esta caja de dilogo incluyen todos los controles ActiveX registrados, objetos insertables y diseadores ActiveX. 2. Para agregar un control (nombre de archivo con extensin .ocx) o un objeto insertable a la caja de herramientas active la marca que se encuentra a la izquierda del nombre del control. Para ver los controles cuyos nombres de archivos tienen extensin .ocx, de clic a la pestaa Controls. Para ver los objetos insertables, tales como Microsoft Excel Chart, seleccione la pestaa Insertable Objects. 3. De clic en OK, para cerrar la caja de dilogo de los componentes. Todos los controles ActiveX que haya seleccionado ahora aparecern en la caja de herramientas. Para agregar controles ActiveX a la caja de dilogo Components, d clic al botn Browse, y busque en otros directorios los archivos cuyos nombres tengan extensin .ocx. Cuando agrega un control a la lista de los

54

controles disponibles, Visual Basic automticamente activa la marca que se encuentra a la izquierda del nombre del control. Nota: Cada control ActiveX es acompaado de un archivo cuya extensin es .oca. Estos archivos almacenan informacin de librera de tipo escondido y otros datos especficos al control. Los archivos .oca tpicamente son almacenados en el mismo directorio que los controles ActiveX y cada vez que se necesitan son creados (los tamaos de archivo y fechas pueden cambiar). Borrando controles de un proyecto Para borrar un control de un proyecto: 1. Del men Project, dar clic en Components. La caja de dilogo Components es desplegada. 2. Borre la marca que existe a la izquierda del nombre del control que desee eliminar. El icono del control ser removido de la caja de herramientas. Nota: No debe remover de la caja de herramientas ningn control que haya sido utilizado en cualquier formulario del proyecto. Usando objetos de otras aplicaciones Puede usar objetos de otras aplicaciones, tales como los incluidos en la librera objeto de Microsoft Excel, ya sea como controles en la caja de herramientas, o como objetos programables en su cdigo. Para lograr que los objetos de otras aplicaciones estn disponible en nuestro cdigo, no como controles, establezca una referencia hacia esa librera de objetos de la aplicacin. Para agregar una referencia a la librera de objetos de otra aplicacin: 1. A partir del men Project, da clic en References. La caja de dilogo References es desplegada. 2. Marque cada referencia que desee agregar al proyecto. Para agregar referencias no incluidas en la caja de dilogo References, d clic en el botn Browse, y despus selecciona la aplicacin. 3. D clic a OK para agregar las referencias seleccionadas a su proyecto. Si no est usando ningn objeto en una librera de referencias, debe de limpiar la marca de esa referencia para minimizar el nmero de referencias objeto que Visual Basic debe realizar, reduciendo de esta forma el tiempo que toma su proyecto para ser compilado. Una vez que ha establecido las referencias a las libreras objeto que necesita, puede encontrar el objeto especfico y sus mtodos y propiedades dando clic en View, y despus en Object Browser. Puede utilizar cualquiera de los objetos listados en su cdigo. Usando un archivo de recursos Un archivo de recursos le permite coleccionar todo el texto especfico y mapa de bits de una aplicacin en un solo sitio. Esto puede incluir declaraciones constantes, iconos, texto de pantalla y otro material que deba cambiarse entre versiones localizables, en revisiones, o en configuraciones especficas. Para agregar un archivo de recursos a un proyecto: 1. A partir del men Project, seleccionar AddFile. La caja de dilogo AddFile es desplegada. 2. Seleccione un archivo de recursos (.res) que exista y da clic en Open. Un proyecto puede tener solamente un archivo de recursos. Haciendo y activando un archivo ejecutable Puede crear un archivo ejecutable desde Visual Basic utilizando el siguiente procedimiento:

55

1. A partir del men File, seleccione Make projectname.exe en donde projectname es el nombre de la
2. 3. 4. 5. 6. aplicacin para el proyecto. Teclee un nombre de archivo, o despliegue los directorios y seleccione un nombre de archivo que exista, para que sea sustituido con la nueva versin. Dndole clic al botn Options, puede especificar un nmero de versin o sobre detalles especficos del archivo ejecutable en la caja de dilogo Project Properties. Si quiere modificar el nmero de versin del proyecto, establezca apropiadamente los nmeros de Revision, Major y Minor. Seleccionando AutoIncrement automticamente se incrementar el nmero de versin cada vez que ejecute el comando MAKE PROJECT NAME.EXE para este proyecto. Para especificar un nuevo nombre para la aplicacin, bajo Application, teclee un nuevo nombre dentro de la caja Title. Si desea especificar un nuevo icono, escoja uno de la lista. Puede escribir comentarios especficos a la versin dentro de la caja Version Information (comentarios, nombre de la compaa, marca de fbrica e informacin sobre derechos de autor) seleccionando un tpico de la caja de lista e introduciendo la informacin en la caja de texto. Da clic en OK para cerrar la caja de dilogo Project Properties, y despus escoge OK en la caja de dilogo Make appname.exe para compilar y encadenar el archivo ejecutable.

7.

Puede activar el archivo ejecutable igual a como lo hace con cualquier otra aplicacin bajo ambiente Windows: da doble clic al icono del archivo ejecutable. Nota: Construyendo un archivo ejecutable a partir de la lnea de comandos de MS DOS puede ser til cuando desea compilar un proyecto de forma programada. En un archivo Batch teclee: V32 /make projectname[,vbp][exename] En projectname teclee el nombre de archivo del proyecto. Use la variable exename para cambiar el nombre del archivo ejecutable resultante. Compilacin condicional La compilacin condicional le permite compilar en forma selectiva ciertas partes de su programa. Puede incluir caractersticas especficas de su programa en diferentes versiones, tales como cambio de los filtros de despliegue de fecha y moneda para una aplicacin que ser distribuida en diferentes lenguajes. Estableciendo opciones del proyecto Visual Basic le permite personalizar cada proyecto a travs del establecimiento de un nmero de propiedades. Use la caja de dilogo Project Properties, accesible a travs del men Project. Las propiedades establecidas son salvadas en el archivo del proyecto (.vbp). La tabla que sigue a continuacin describe algunas de las opciones que puede establecer: Opcin Descripcin Startup Object El primer formulario que Visual Basic despliega en tiempo de ejecucin, o Sub Main ( ). Project Name Identifica el proyecto en cdigo. No puede incluir puntos, espacios, o comenzar con un carcter no alfabtico. Para un nombre de clase pblico, el nombre del proyecto y el nombre de clase no pueden exceder un total de 37 caracteres. Help File El nombre del archivo de ayuda asociado con el proyecto Project Help Context ID La identificacin de contexto por cada tpico de ayuda especfico a ser usado cuando el usuario seleccione el botn ? mientras la librera de objetos de la aplicacin es seleccionada en el Object Browser. Project Description Un nombre amistoso de usuario para el proyecto. Desplegado en la caja de dilogo References y Object Browser. Muchas otras opciones estn disponibles, incluyendo aquellas para compilacin, componentes, y multi hilos. Usando Wizards y Add-Ins

56

Visual Basic le permite seleccionar y manejar Add-Ins, que son extensiones para Visual Basic. Estas extensiones le agregan capacidades al ambiente de desarrollo de Visual Basic, por ejemplo, capacidades de control de cdigo fuente especiales. Microsoft y otros desarrolladores han creado Add-Ins que puede usar en su aplicacin. Wizards es un tipo de Add-Ins que puede simplificar ciertas tareas, tales como las de crear un formulario. Diversos Wizards estn incluidos en Visual Basic. Para que un Add-Ins pueda aparecer en la caja de dilogo Add-In Manager, el desarrollador del add in debe asegurarse que est instalado apropiadamente. Usando el Add in Manager Puede agregar o borrar un add in a su proyecto usando el Add in Manager, el cual puede accederse a travs del men Add Ins. La caja de dilogo del Add Ins Manager lista los Add Ins disponibles. La marca que aparece a la izquierda de caja add ins indica cundo un add ins est actualmente seleccionado o instalado. Para instalar un add in: 1. A partir del men Add ins, elija Add in Manager. 2. Para agregar un add ins pngale una marca. Para borrarlo qutele la marca. 3. Cuando haya finalizado de hacer las selecciones, de clic en OK. Visual Basic conecta los add ins seleccionados y desconecta los add ins borrados. Nota: Seleccionar un add in podra agregar elementos de men en el men Add Ins de Visual Basic. Usando Wizards Wizards convierte el trabajo con Visual Basic todava ms fcil a travs de proporcionarle asistencia para tareas especficas. Por ejemplo, el Application Wizard, incluido en Visual Basic, le ayuda a crear la estructura de una aplicacin presentndole una serie de preguntas o elecciones. Este genera los formularios y el cdigo que estar detrs de los formularios, todo basado y acorde con las respuestas que Usted haya dado. Todo lo que necesita es agregar cdigo para su propia y especfica funcionalidad. El Data Form Wizard permite usar formularios que pueden ser usados como bases de datos y el ActiveX Documente Wizard convierte los formularios para ser usados en aplicaciones de internet. Los Wizards son instalados y borrados usando el Add Ins Manager. Una vez instalados ellos aparecern como selecciones en el men Add Ins. Algunos de los Wizards tambin aparecen como iconos en cajas de dilogo relacionadas; por ejemplo, el Application Wizard puede tambin ser accedido usando su icono en la caja de dilogo New Project. Para activar el Application Wizard: A partir del men Add Ins, seleccione Application Wizard. o 1. 2. A partir del men File, seleccione New Project. Seleccione el icono Application Wizard.

Traduccin: Derechos de Autor: RBsoftware (2001) Domingo, 8 de abril 2001. 11:54p. Archivo: Traduccin VB5

57

Fundamentos de programacin Esta es una introduccin a los componentes esenciales del lenguaje Visual Basic. Despus de crear la interfase de su aplicacin utilizando formularios y controles, Usted necesitar escribir el cdigo que definir el comportamiento de la aplicacin. As como cualquier lenguaje de programacin moderno, Visual Basic tolera un nmero de estructuras de programacin comunes y elementos de lenguaje. Visual Basic es un lenguaje de programacin basado en objetos. La sola mencin de objetos puede causar indebida ansiedad en muchos programadores. No tema: aunque Usted no lo crea Usted ha estado tratando con objetos la mayor parte de su vida. Una vez que entienda algunos conceptos bsicos, los objetos en realidad le ayudarn a hacer el trabajo de programacin ms fcil que nunca. Si Usted ha programado en otros lenguajes, mucho del material que se cubrir le parecer familiar. Aunque la mayora de las construcciones son similares en otros lenguajes, la naturaleza conducida por eventos de Visual Basic introduce algunas diferencias sutiles. Trate y aborde este material con mente abierta; una vez que entiende las diferencias puede usarlas para tomar ventaja. Si Usted es nuevo en programacin, este material le servir como una introduccin a los bloques de construccin bsica para la escritura de cdigo. Una vez que entiende las bases, Usted tendr la capacidad para construir poderosas aplicaciones usando Visual Basic. La estructura de una aplicacin Visual Basic Una aplicacin en realidad no es ms que un juego de instrucciones que dirigen al computador para que ejecute una o ms tareas. La estructura de una aplicacin es el camino sobre el cual las instrucciones estn organizadas; esto es, dnde estn almacenadas las instrucciones y el orden en que estas instrucciones son ejecutadas. Aplicaciones triviales, tal como el ejemplo Hola Mundo! tienen una estructura simple; la organizacin no es importante cuando se trata de una simple lnea de cdigo. A medida que la aplicacin crece en complejidad, la necesidad de organizacin o estructuracin se torna ms obvia. Imagnese el caos que resultara si el cdigo de su aplicacin se estableciera a ser ejecutado en orden aleatorio. Adems de controlar la ejecucin de una aplicacin, la estructura es importante para el programador: cun fcil puede encontrar instrucciones especficas dentro de su aplicacin? En vista que una aplicacin Visual Basic est basada en objetos, la estructura de su cdigo modela cercanamente su representacin fsica en pantalla. Por definicin, los objetos contienen datos y cdigo. El formulario que mira en pantalla es una representacin de las propiedades que define su apariencia y comportamiento intrnsecos. Para cada formulario en la aplicacin, existe su correspondiente mdulo de formulario (con un nombre de archivo cuya extensin es .FRM) que contiene su cdigo. Cada mdulo de formulario contiene procedimientos de evento secciones de cdigo donde sita las instrucciones que sern ejecutadas en respuesta a eventos especficos. Los formularios contienen controles. Por cada control en un formulario, existe su correspondiente juego de procedimientos de eventos en el mdulo de formulario. Adems de los procedimientos de eventos, los mdulos de formularios pueden contener procedimientos generales que son ejecutados en respuesta a llamadas desde cualquier otro evento de procedimiento. El cdigo que no se relaciona con un formulario especfico o con un control puede situarse en un diferente tipo de mdulo, en un mdulo estndar (.BAS). Un procedimiento que pueda ser usado para que responda a eventos provenientes de diferentes objetos deber ser situado en mdulos estndar, en vez de duplicar el cdigo en eventos de procedimiento para cada objeto. Un mdulo de clase, class module, es usado para crear objetos que pueden ser llamados desde procedimientos dentro de su aplicacin. Mientras que los mdulos estndar contienen slo cdigo, los mdulos de clase contienen ambos, cdigo y datos puede imaginrselo como un control sin representacin fsica.

58

Por defecto, su proyecto contiene solamente un mdulo de formulario. Puede agregarle adicionales formularios, mdulos estndar y mdulos de clases como los necesite. Cmo trabaja una aplicacin conducida por eventos Un evento es una accin reconocida por cualquier control o formulario. Las aplicaciones conducidas por evento ejecutan cdigo Visual Basic en respuesta a un evento. Cada control y formulario en Visual Basic incluye un predefinido juego de eventos. Si uno de estos eventos ocurre y existe cdigo en el procedimiento de evento asociado a l, Visual Basic invoca este cdigo. A pesar de que los objetos en Visual Basic automticamente reconocen un juego predefinido de eventos, corresponde a Usted decidir si, y cmo, ellos respondern a un evento en particular. Una seccin de cdigo un procedimiento de evento corresponde a cada evento. Cuando desea que un control responda a un evento, escribe cdigo en el procedimiento de evento de ese evento. Los tipos de eventos reconocidos por un objeto varan, pero muchos tipos son comunes para la mayora de los controles. Por ejemplo, muchos objetos reconocen el evento clic si el usuario da clic sobre un formulario, el cdigo del procedimiento de evento clic de ese formulario es ejecutado; si el usuario da clic a un botn de comando, el cdigo del procedimiento de evento de ese comando es ejecutado. El cdigo en cada caso es diferente. Aqu se muestra una tpica secuencia de eventos en una aplicacin conducida por eventos: 1. La aplicacin es activada y un formulario es cargado y desplegado. 2. El formulario (o un control sobre el formulario) recibe un evento. El evento podra ser causado por el usuario (por ejemplo pulsar una tecla), por el sistema (por ejemplo un evento de tiempo), o indirectamente por cdigo (por ejemplo, un evento Load, cuando su cdigo carga el formulario). 3. Si existe cdigo en el correspondiente procedimiento de evento, ste se ejecuta. 4. La aplicacin queda en espera del siguiente evento. Nota: Muchos eventos ocurren en conjunto con otros eventos. Por ejemplo, cuando ocurre el evento doble clic, DblClick, los eventos MouseDown, MouseUp, y Click, tambin ocurren. Antes de que comience a codificar Quizs la parte ms importante (y a menudo pasada por alto) en la creacin de una aplicacin en Visual Basic en su fase de diseo. Ya que es obvio que necesita disear la interfase de usuario para su aplicacin, no parece tan obvio que necesite disear la estructura de su cdigo. La forma en que estructura su aplicacin puede hacer la diferencia entre su desempeo as como en su mantenimiento y disponibilidad de su cdigo. El cdigo en una aplicacin Visual Basic es organizado de una forma jerrquica. Una tpica aplicacin consiste de uno o ms mdulos: un mdulo de formulario para cada formulario de la aplicacin; mdulos estndar opcionales para compartir cdigo; y mdulos de clases opcionales. Cada mdulo contienen uno o ms procedimientos que contienen el cdigo: procedimientos de eventos, procedimientos de funcin, procedimientos Sub y procedimientos de propiedades. Determinar qu procedimiento pertenece a qu mdulo depende de alguna forma del tipo de aplicacin que Usted est creando. En vista de que Visual Basic est basado en objetos, induce a pensar en su aplicacin en trmino de los objetos que representa. Mecnica de la escritura de cdigo Antes de comenzar es importante que conozca la mecnica de la escritura de cdigo en Visual Basic. Igual que cualquier lenguaje de programacin, Visual Basic tiene sus propias reglas para la organizacin, edicin y formateo de cdigo. Los siguientes tpicos son una introduccin a los mdulos de cdigo y procedimientos, explicaciones bsicas del editor de cdigo y cubre las reglas bsicas para escribir cdigo.

59

Mdulos de cdigo El cdigo en Visual Basic es almacenado en mdulos. Existen tres tipos de mdulos: mdulos de formularios, mdulos estndar y mdulos de clases. Aplicaciones simples pueden consistir justamente de un formulario y todo el cdigo de la aplicacin reside en su mdulo de formulario. A medida que su aplicacin se vuelve ms grande y sofisticada, agrega adicionales formularios. Eventualmente podr encontrar que el mismo cdigo debe ejecutarse en formularios diferentes. No desea duplicar el cdigo en ambos formularios, de forma que crea un mdulo separado conteniendo el procedimiento que implementa el cdigo comn. Este mdulo separado puede ser un mdulo estndar. Mas adelante podr construir una librera de mdulos para que contengan procedimientos que puedan ser compartidos. Cada mdulo, ya sea de formulario, de clase, estndar, puede contener: Declaraciones. Puede situar constantes, de tipo, variables y declaraciones de procedimientos de librera de enlace dinmico (DLL), a nivel de formulario, o en mdulos de clase y estndar. Procedimientos. Procedimientos Sub, de funciones, o de propiedad, que contengan partes de cdigo que pueda ser ejecutado como una unidad. Mdulos de formularios Los mdulos de formulario (nombres de archivos con extensin .FRM) son la fundacin de la mayora de las aplicaciones Visual Basic. Ellos pueden contener procedimientos que manejan eventos, procedimientos generales, declaraciones a nivel de formulario de variables, constantes, tipos y procedimientos externos. Si puede observar un mdulo de formulario en un editor de texto, podr ver tambin la descripcin del formulario y sus controles, incluyendo las propiedades establecidas. El cdigo que escribe en un mdulo de formulario es especfico a la aplicacin en particular a la cual pertenece el formulario; puede tambin hacer referencia a otros formularios u objetos dentro de esa aplicacin. Mdulos estndar Los mdulos estndar (nombres de archivo con extensin .BAS) son contenedores para procedimientos y declaraciones comunes que pueden ser accedidas por otros mdulos dentro de la aplicacin. Ellos pueden contener globales (disponibles para toda la aplicacin) o declaraciones a nivel de formulario de variables, constantes, tipos, procedimientos externos y procedimientos globales. El cdigo que escribe en un mdulo estndar no est necesariamente sujeto a una aplicacin en particular; si tiene el cuidado de no referenciar a controles y formularios a travs de sus nombres, los mdulos estndar pueden ser vueltos a usar en muchas diferentes aplicaciones. Mdulos de clases Los mdulos de clases (nombres de archivo con extensin .CLS) son la fundacin de la programacin orientada a objetos. Estos nuevos objetos pueden contener sus propios mtodos y propiedades particularizadas. En realidad, los formularios son simplemente mdulos de clases que pueden contener controles ubicados sobre ellos y que pueden desplegar ventanas de formularios. Nota: Los mdulos ActiveX Documents, ActiveX Designer y User Control, introducen a nuevos tipos de mdulos con diferentes extensiones de nombres de archivo. Desde el punto de vista de escritura de cdigo, estos mdulos pueden ser considerados tambin como mdulos de formulario. Usando el editor de cdigo El editor de cdigo de Visual Basic es una ventana en donde escribe la mayora de su cdigo. Se parece a un procesador de palabras altamente especializado con un nmero de caractersticas que convierte la escritura de cdigo en Visual Basic mucho ms fcil. En vista de que trabaja el cdigo de Visual Basic en mdulos, es abierta una ventana editora de cdigo separada de cada mdulo que selecciona del explorador de proyectos. El cdigo dentro de cada mdulo es dividido en secciones separadas para cada objeto contenido en el mdulo. El cambio entre secciones es llevado a efecto utilizando la lista de objetos, Object Listbox. En un mdulo de formulario, la lista incluye una seccin general, una seccin propiamente para el formulario y una seccin para cada control contenido en el

60

formulario. Para un mdulo de clase, la lista incluye una seccin general y una seccin de clase; para un mdulo estndar solamente una seccin general es mostrada. Cada seccin de cdigo puede contener diferentes procedimientos, que pueden ser accedidos utilizando la lista de procedimientos, Procedure Listbox. La lista de procedimientos para un mdulo de formulario contiene una seccin separada para cada procedimiento de evento para el formulario y para cada control. Por ejemplo, la lista de procedimientos de un control LABEL incluye secciones para los eventos CHANGE, CLICK, y DBLCLICK, adems de otros. Los mdulos de clases listan solamente los procedimientos de evento de su propia clase Initialize y Terminate. Los mdulos estndar no listan ningn procedimiento de evento en vista de que los mdulos estndar no soportan eventos. La lista de procedimientos para una seccin general de un mdulo contiene una sola seccin la seccin de declaraciones, en donde Usted deposita las variables a nivel de mdulo, constantes y declaraciones DLL. A medida que agrega a un mdulo procedimientos Sub o funciones, estos procedimientos son agregados a la lista de procedimientos debajo de la seccin de declaraciones. Dos diferentes vistas de su cdigo estn disponibles en la ventana editora de cdigo. Puede elegir ver un procedimiento a la vez, o ver todos los procedimientos en su conjunto, con una lnea separando cada uno de los procedimientos. Para cambiar entre las dos vistas, utilice los botones de seleccin de vistas, View Selection, botones que se muestran en la esquina inferior izquierda del la ventana del editor. Terminacin de cdigo automtica Visual Basic convierta ms fcil la escritura de cdigo con caractersticas que pueden automticamente completar declaraciones, propiedades y argumentos por Usted. Al mismo tiempo que teclea cdigo, el editor despliega listas de elecciones apropiadas, prototipos de funciones o declaraciones o valores. Las opciones para activar y desactivar estas y otras actividades automatizadas estn disponibles en la pestaa Editor, del dilogo Options, a la que puede acceder a travs del men Tools, comando Options. Cuando escribe un su cdigo el nombre de un control, la caracterstica de lista automtica de miembros, Auto List Members, presenta una lista en cascada de la lista de propiedades disponibles para ese control. Escriba tan solo las primeras letras del nombre de la propiedad y el nombre ser seleccionado de la lista; pulse la tecla Tab para completar la escritura por Usted. Esta opcin es tambin beneficiosa cuando Usted no est seguro sobre qu propiedades determinado control tiene disponible. An cuando elija desactivar la lista automtica de miembros, podr acceder a ella si pulsa la combinacin CTRL.+J. La caracterstica informacin automtica rpida, Auto Quick Info, despliega la sintaxis de funciones y declaraciones. Cuando teclea el nombre de una declaracin o funcin de Visual Basic vlida, su sintaxis es mostrada inmediatamente debajo de la lnea actual, con su primer argumento mostrado en negritas. Despus que teclea el valor de este primer argumento, el segundo argumento se muestra en negritas. La informacin automtica rpida puede ser tambin accedida a travs de la combinacin CTRL.+I. Cdigo bsico Esta seccin presenta informacin sobre la mecnica de escritura de cdigo, que incluye rupturas y combinacin de lneas de cdigo, agregar comentarios a su cdigo, usar nmeros en su cdigo y la observancia de reglas en la creacin de nombres en Visual Basic. Descomponer una declaracin en mltiples lneas Puede descomponer una larga declaracin en mltiples lneas en la ventana de cdigo usando el carcter continuador de lnea, line-continuation character (un espacio seguido por un subrayado). El uso de este carcter hace que su cdigo sea ms fcil de leer, tanto en lnea como impreso. El siguiente cdigo es descompuesto en tres diferentes lneas con el carcter continuador de lnea ( _ ): Data1.RecordSource = _ SELECT * FROM titles, Publishers _ & WHERE Publishers.PubId = Titles.PubID _ & AND Publishers.State = CA

61

No puede escribir despus de un carcter continuador de lnea, una lnea de comentario en la misma lnea. Existen tambin limitaciones tales como dnde debe ser usado el carcter continuador de lnea. Combinando declaraciones en una lnea Usualmente existe una declaracin Visual Basic en una lnea, pero puede situar dos o ms declaraciones en una lnea si usa dos puntos ( : ) para separarlas: Text1.Text = Hola : Red = 255 : Text1.BackColor = _ Red En obediencia a que su cdigo sea lo ms legible, es mejor situar cada declaracin en una lnea separada. Agregar comentarios a su cdigo A medida que lee los ejemplo en esta gua, a menudo se encontrar con el smbolo (). Este smbolo le dice a Visual Basic que ignore las palabras que le siguen. Estas palabras son notas u observaciones situadas dentro del cdigo para beneficio del desarrollador y de otros programadores que podran despus examinar el cdigo. Por ejemplo: Esta es una lnea de comentario que se inicia a la orilla izquierda de la pantalla. Text1.Text = Qu tal! Situando un saludo en la caja de texto. Los comentarios pueden continuar a una declaracin en la misma lnea, o pueden ocupar una lnea por completo. Ambos fueron ejemplificados en el cdigo anterior. Recuerde que los comentarios no pueden continuar a un carcter continuador de lnea ( _ ) sobre su misma lnea. Entendiendo el sistema de numeracin La mayora de los nmeros en esta gua son decimales (base 10). Pero ocasionalmente es conveniente usar nmeros hexadecimales (base 16) y nmeros octales (base 8). Visual Basic representa los nmeros hexadecimales con el prefijo &H y los nmeros octales con el prefijo &O. La tabla que sigue a continuacin muestra los mismos nmeros en decimal, octal y hexadecimal. Decimal Octal Hexadecimal 9 &O11 &H9 15 &O17 &HF 16 &O20 &H10 20 &O24 &H14 255 &O377 &HFF Generalmente Usted no necesita tener que aprender el sistema de numeracin octal o hexadecimal en vista que el computador puede trabajar con cualquiera de estos tres sistemas de numeracin. Sin embargo, algunos sistemas de numeracin conducen ciertas tareas, tales como el uso de hexadecimales para establecer la pantalla y controlar los colores. Convencin sobre creacin de nombres en Visual Basic A medida que escribe cdigo Visual Basic, declara y nombra muchos elementos (procedimientos Sub y de funcin, variables, constantes, y dems). Los nombres de los procedimientos, variables y constantes que declara en su cdigo de Visual Basic deben seguir los siguientes modelos: Deben comenzar con una letra. No deben contener puntos intercalados o caracteres de declaracin de tipo (caracteres especiales que especifican el tipo de dato). No pueden ser mayores que 255 caracteres. Los nombres de los controles, formularios, clases y mdulos no debe exceder los 40 caracteres. No pueden ser las mismas palabras claves restringidas. Una palabra clave restringida es una palabra que Visual Basic utiliza como parte de su lenguaje. Estas incluyen declaraciones predefinidas (tales como IF y LOOP), funciones (tales como LEN y ABS) y operadores (tales como OR y MOD).

62

Sus formularios y controles pueden tener el mismo nombre que una palabra clave restringida. Por ejemplo, puede tener un control que se llame LOOP. En el cdigo no puede hacer referencia a este control de la forma usual en vista de que Visual Basic asume que Usted se est refiriendo a la palabra clave LOOP. Por ejemplo, este cdigo causa un error: Loop.Visible = True Causa un error. Para referenciar a un formulario o a un control que tiene el mismo nombre que una palabra clave restringida, Usted debe calificarlo o englobarlo en llaves ([]). Por ejemplo, este cdigo no causa error: MyForm.Loop.Visible = True Calificado con el nombre del formulario. [Loop].Visible = True Tambin funciona englobndolo con llaves. Puede usar las llaves de esta forma cuando se refiera a formularios y controles, pero no cuando declare una variable o defina un procedimiento con el mismo nombre que la palabra clave restringida. Las llaves pueden ser usadas para forzar a que Visual Basic acepte nombres provenientes de otros tipos de librera que tengan conflicto con estas palabras claves restringidas. Nota: En vista que teclear estas llaves puede ser tedioso, Usted podra evitar el uso de palabras claves restringidas como las mismas para formularios y controles. Sin embargo, puede usar esta tcnica si futuras versiones de Visual Basic definen una nueva palabra clave que tenga conflictos con formularios existentes o nombres de controles cuando Usted actualice su cdigo para que trabaje con la nueva versin. Introduccin a variables, constantes y tipos de datos A menudo Usted necesita almacenar valores temporalmente cuando ejecuta clculos con Visual Basic. Por ejemplo, podra desear calcular valores diversos, compararlos y ejecutar diversas operaciones sobre ellos, dependiendo del resultado de las comparaciones. Usted necesita retener los valores si desea compararlos, pero no necesita almacenarlos en una propiedad. Visual Basic, como la mayora de los lenguajes de programacin, utiliza variables para almacenar valores. Las variables tienen un nombre (la palabra que usa para referirse a los valores que la variable contiene) y un tipo de datos, data type, (que determina el tipo de datos que la variable puede almacenar). Los arreglos, arrays, pueden ser usados para almacenar colecciones indexadas de variables relacionadas. Las constantes tambin almacenan valores, pero como su mismo nombre indica, estos valores permanecen constantes e invariables a travs de la ejecucin de la aplicacin. El uso de constantes puede hacer que su cdigo sea ms fcil de leer al proporcionar nombres sugestivos en sustitucin de nmeros. Existen algunas constantes numricas internas en Visual Basic, pero Usted puede crear sus propias. Los tipos de datos, data types, controlan el almacenamiento interno de datos en Visual Basic. Por defecto Visual Basic usa el tipo de datos Variant. Existen disponibles otros tipos de datos que le permiten optimizar su cdigo para ganar velocidad de proceso y disminucin de espacio cuando Usted no necesita la flexibilidad que el tipo variant proporciona. Variables En Visual Basic, Usted usa variables para almacenar valores temporalmente y durante la ejecucin de una aplicacin. Las variables tienen un nombre (la palabra que Usted usa para referirse a los valores que las variables almacenan) y un tipo de datos (el que determina el tipo de dato que la variable puede almacenar). Puede imaginarse a las variables como un lugar de almacenamiento en la memoria usado para guardar datos desconocidos. Usted no conoce el precio de una manzana, ni la cantidad vendida, hasta que la venta ocurre de hecho. Puede usar dos variables para retener los dos valores desconocidos pongmosles por nombres PrecioPorManzana y ManzanasVendidas. Cada vez que el programa es ejecutado el usuario suministra los valores para estas dos variables. Para calcular el total vendido y desplegarlo en una caja de texto llamada txtVentas, su cdigo se parecera al siguiente:

63

TxtVentas.text = PrecioPorManzana * ManzanasVendidas La expresin devuelve un total diferente cada vez dependiendo de qu valores el usuario suministre. Las variables le permiten hacer clculos sin tener necesidad de conocer por adelantado cules son los actuales valores de entrada. En este ejemplo, el tipo de datos PrecioPorManzana es Currency; el tipo de datos de ManzanasVendidas es integer. Las variables pueden representar muchos otros valores tambin: valores de texto, fechas, varios tipos numricos, incluso objetos. Almacenamiento y recuperacin de datos en variables Usa declaraciones de asignacin para efectuar clculos y asignar resultados a variables: ManzanasVendidas = 10 el valor 10 es trasladado a la variable. ManzanasVendidas = ManzanasVendidas + 1 la variable es incrementada en uno. Note que el signo igual en este ejemplo es un operador de asignacin, no un operador igualador; el valor (10) es asignado a la variables (ManzanasVendidas). Declarando variables Declarar una variable es decirle al programa acerca de la misma por adelantado. Declara una variable con la instruccin Dim, suministrando el nombre para la variable: Dim variablename [As type] Las variables declaradas con la palabra reservada Dim dentro de un procedimiento existen solamente mientras el procedimiento est en ejecucin. Cuando el procedimiento finaliza el valor de la variable desaparece. Por ello, el valor de una variable dentro de un procedimiento es local a ese procedimiento esto es, no puede acceder a una variable de un procedimiento desde otro procedimiento. Esta caracterstica le permite usar los mismos nombres de variables en diferentes procedimientos sin tener que preocuparse acerca de conflictos o cambios accidentales. Un nombre de variable: Debe comenzar con una letra. No puede incluir puntos o caracteres de declaracin de tipos. No debe exceder de 255 caracteres. Debe de ser nica dentro de su alcance, el cual es el ambiente bajo el cual la variable pueda ser referenciada un procedimiento, un formulario, y as, sucesivamente. La clusula opcional [As type] en la palabra reservada Dim le permite definir el tipo de dato o tipo de objeto de la variable que est declarando. Los tipos de datos definen el tipo de informacin que almacena la variable. Algunos ejemplos de tipos de datos incluyen cadenas, integrales y currency. Las variables tambin pueden contener objetos de Visual Basic u otras aplicaciones. Ejemplos de tipos de objeto Visual Basic, o clases, incluyen Object, Form1 y TextBox. Existen otros medios para declarar las variables: Declarar la variable en la seccin de declaraciones de un formulario, de un mdulo estndar, o de un mdulo de clase, en vez de dentro de un procedimiento, hace que la variable quede disponible a todos los procedimientos en el mdulo. Declarar la variable utilizando la palabra reservada Public hace que sta se encuentre disponible en toda la aplicacin. Declarar la variable como local usando la palabra reservada Static hace que se preserven sus valores an cuando finalice el procedimiento. Declaraciones implcitas No necesita declarar una variable antes de usarla. Por ejemplo, puede escribir una funcin donde no necesita declarar TempVal antes de usarla: Function SafeSqr(num) TempVal = Abs(num)

64

SafeSqr = Sqr(TempVal) End Function Visual Basic automticamente crea una variable con ese nombre, la cual puede usarla sin haberla declarado explcitamente. Aunque esto es conveniente, puede ocasionarle sutiles errores en su cdigo si se equivoca al escribir el nombre de la variables. Por ejemplo, supngase que esta fue la funcin que escribi: Function SafeSqr(num) TempVal = Abs(num) SafeSqr = Sqr(TemVal) End Function A primera vista ambos ejemplos parecen los mismos. Pero, en vista que la variable TempVal fue mal escrita en la penltima lnea, esta funcin siempre retornar valor cero. Cuando Visual Basic encuentra un nuevo nombre, no puede dilucidar cundo Usted est indicando que est declarando un nuevo nombre de variable implcita o si se trata de una variable mal escrita, en consecuencia crea la nueva variable con ese nombre. Declaraciones explcitas Para anular el problema de escribir mal las variables, puede estipular a Visual Basic que siempre le advierta cada vez que encuentre nombres que no hayan sido explcitamente declarados como variables. Para declarar variables explcitas: Ubique la siguiente palabra reservada en la seccin de declaraciones del formulario, de un mdulo estndar, o de un mdulo de clase: Option Explicit o A partir del men Tools, elija Options, da clic en la pestaa Editor, y marca la opcin Require Variable Declaration. Esto automticamente insertar la declaracin Option Explicit en cualquier nuevo mdulo, pero no en los mdulos que ya hayan sido creados, de manera que, Usted tendr que agregar manualmente Option Explicit en todos los mdulos que existan en el proyecto. Si hubiese existido la palabra reservada Option Explicit escrita en el ejemplo que contiene la funcin SafeSqr, Visual Basic hubiera reconocido que las variables TempVal y TemVal estn no declaradas y hubiera generado errores por ambas. Entonces, podra haber declarado explcitamente TempVal: Function SafeSqr(num) Dim TempVal TempVal = Abs (num) SafeSqr = Sqr (TemVal) End Function Ahora Usted enteder el problema inmediatamente en vista de que Visual Basic desplegar un mensaje de error por la variable TemVal escrita incorrectamente. En vista de que la declaracin Option Explicit le ayuda a pescar este tipo de errores, es muy buena idea usarla en todo su cdigo. Nota: La declaracin Option Explicit opera en mdulos individuales; debe ser situada en la seccin de declaraciones de cada formulario, de cada mdulo estndar y de cada mdulo de clase que desee forzar a que Visual Basic verifique la declaracin de variables explcitas. Si selecciona Require Variable Declaration, Visual Basic insertar Option Explicit en todos los subsecuentes formularios, mdulos estndar y mdulos de clase, pero no lo agregar a cdigo que ya exista. Usted debe agregar manualmente Option Explicit a todos los mdulos que existan en el proyecto. Entendiendo el alcance de las variables El alcance de una variable define qu parte de su cdigo debe estar enterado de su existencia. Cuando declara una variable dentro de un procedimiento, solamente el cdigo dentro de ese procedimiento podr acceder o cambiar el valor de esa variable; tiene un alcance que es local a ese procedimiento. Algunas veces, sin embargo, necesita usar variables que tengan mayor alcance, tales como aquellas que permiten estar disponibles sus valores a todos los procedimientos dentro del mismo mdulo, o incluso para todos los procedimiento dentro de la aplicacin entera. Visual Basic le permite especificar el alcance de la variable cuando la declara.

65

Asignando el alcance a las variables Dependiendo de cmo es declarada, el alcance de la variable es a nivel de procedimiento (local) o a nivel de mdulo. Scope A nivel de procedimiento A nivel de mdulo Private Las variables son privadas al procedimiento en el cual ellas aparecen. Las variables son privadas a nivel del mdulo en donde ellas aparecen. Public No aplicable. No puede declarar variables pblicas dentro de un procedimiento. Las variables estn disponibles para todos los mdulos.

Variables usadas dentro de un procedimiento Las variables a nivel de procedimiento son reconocidas solamente dentro del procedimiento en el cual hayan sido declaradas. Esto tambin es conocido como variables locales. Usted las declara con las palabras reservadas Dim o Static. Por ejemplo: Dim intTemp As Integer o Static intPermanent as Integer Los valores de las variables locales declaradas con Static existen todo el tiempo que su aplicacin est activa, mientras que las variables declaradas con Dim existen solamente mientras se encuentre en ejecucin el procedimiento. Las variables locales son una buena eleccin para todo tipo de clculos temporales. Por ejemplo, puede crear una docena de diferentes procedimientos que contengan la variable intTemp. A medida que cada variable intTemp es declarada como variable local, cada procedimiento reconoce solamente su propia versin de intTemp. Cualquier procedimiento puede alterar el valor de su local intTemp sin afectar las variable intTemp de los otros procedimientos. Variables usadas dentro de un procedimiento Por defecto, una variable a nivel de mdulo est disponible a todos los procedimientos en ese mdulo, pero no al cdigo de otros mdulos. Las variables a nivel de mdulo se crean declarndolas con la variable Private en la seccin de Declaraciones, al inicio del mdulo. Por ejemplo: Private intTemp as Integer A nivel de mdulo, no existe diferencia entre Private y Dim, pero Private es preferida en vista de que realmente contrasta con Public y hace que el cdigo sea ms fcil de entender. Variables usadas por todos los mdulos Para hacer que una variable a nivel de mdulo est disponible para el resto de los mdulos, use la palabra reservada Public para declarar la variable. Los valores de las variables pblicas estn disponibles a todos los procedimientos en su aplicacin. Igual que las variables a nivel de mdulo, las variables pblicas son declaradas en la Seccin de Declaraciones al inicio del mdulo. Por ejemplo: Public intTemp As Integer Nota: No puede declarar variables pblicas dentro de un procedimiento, solamente dentro de la seccin de declaraciones de un mdulo. Traduccin: Derechos de Autor: RBsoftware (2001) Mircoles, 11 de abril 2001. 06:27p. Archivo: Traduccin VB6.

66

Tpicos sobre variables avanzadas Si las variables pblicas en diferentes mdulos comparten el mismo nombre, es posible diferenciarlas en cdigo refirindose a ambas, el nombre del mdulo y el nombre de la variable. Si existe una variable integral pblica declaradas tanto en Form1 como en Module1, puede referirse a ellas como: Module1.intX y Form1.intX para captar los correctos valores. Para que vea cmo funciona esto, inserte dos mdulos estndar en un nuevo proyecto y dibuje tres botones de comando sobre el formulario. Una variable, intX, es declarada en el primer mdulo estndar, Module1. El procedimiento Test establece su valor: Public intX As Integer declara intX del mdulo 1. Sub Test( ) intX=1 establece el valor de la variable intX del mdulo 1. End Sub La segunda variable, que tiene el mismo nombre, intX, es declarada en el segundo mdulo estndar, Module2. De nuevo, un procedimiento llamado Test establece su valor: Public intX As Integer declara intX del mdulo 2. Sub Test ( ) intX=2 establece el valor de la variable intX del mdulo 2. End Sub La tercer variable intX es declarada en el mdulo de formulario. Y de nuevo, un procedimiento llamado Test establece su valor: Public intX As Integer declara intX del formulario. Sub Test ( ) intX=3 establece el valor de la variable intX del formulario. End Sub Cada uno de los eventos de procedimiento clic de los botones de comando llama el apropiado procedimiento Test, y usa MsgBox para desplegar los valores de las tres variables. Private Sub Command1_Click ( ) Module1.Test llama al procedimiento Test en Mdulo 1. MsgBox Module1.intX despliega intX del Mdulo 1. End Sub Private Sub Command2_Click ( ) Module2.Test llama al procedimiento Test en Mdulo 2. MsgBox Module2.intX despliega intX del Mdulo 2. End Sub Private Sub Command3_Click ( ) Test llama al procedimiento Test del formulario. MsgBox intX despliega intX del formulario. End Sub Ejecute la aplicacin y de click en cada uno de los tres botones de comando. Ver las referencias separadas para las tres variables pblicas. Note que en el tercer procedimiento de evento clic del botn de comando no necesita especificar Form1.Test cuando llama al procedimiento Test del formulario, o Form1.intX cuando llama al valor de la variable integral del formulario. Si existen variables y procedimientos mltiples con el mismo nombre, Visual Basic toma el valor de la variable ms local, la cual en este caso es, la variable de Form1. Variables locales versus variables pblicas Puede tener variables del mismo nombre con diferente alcance. Por ejemplo, podra tener una variable pblica llamada Temp y dentro de un procedimiento, declarar una variable local llamada Temp. Si hace una referencia a Temp dentro del procedimiento acceder a esta variable local; referenciar a Temp fuera del

67

procedimiento acceder a la variable pblica. La variable a nivel de mdulo podr ser accedida desde dentro del procedimiento si tambin se hace referencia al nombre del mdulo. Public Temp As Integer Sub Test ( ) Dim Temp As Integer Temp=2 Temp tiene valor 2. MsgBox Form1.Temp Form1.Temp tiene valor de 1. End Sub Private Sub Form_Load Temp=1 Establecer Temp, de Form1, a 1. End sub Private Sub Command1_Click Test End Sub En general, cuando las variables tienen el mismo nombre pero diferente alcance, la variable ms local siempre ensombrece (es decir, es accedida en forma preferente de) a las variables menos locales. De forma que si tiene a nivel de procedimiento una variable llamada Temp, esta ensombrecer a la variable pblica Temp dentro de tal mdulo. Ensombrecer propiedades de formulario y controles Debido al efecto del ensombramiento, las propiedades de los formularios, controles, constantes y procedimientos son tratadas como variables a nivel de mdulo dentro del mdulo del formulario. No es legal tener una propiedad de formulario o un control con el mismo nombre que una variable a nivel de mdulo, constante, tipo definido de usuario, o procedimiento, en vista de que ambos estn dentro del mismo alcance. Dentro del mdulo de formulario, las variables locales con el mismo nombre que los controles ubicados sobre el formulario ensombrecen los controles. Usted debe calificar al control con una referencia al formulario, o establecer la palabra reservada Me, u obtener su valor, o cualquiera de sus propiedades. Por ejemplo: Private Sub Form_Click ( ) Dim Text1, BackColor asume que existe un control sobre el formulario que se llama Text1. Text1=Variable la variable ensombrece al control. Me.Text1=Control debe calificarla con Me para obtener el control. Text1.Top=0 esto causa un error! Me.Text1.Top=0 debe calificarla con Me para obtener el control. BackColor=0 la variable ensombrece la propiedad. Me.BackColor=0 debe calificarla con Me para obtener la propiedad del formulario End Sub Usando variables y procedimientos con el mismo nombre Los nombres de sus variables privadas a nivel de mdulo y de sus variables pblicas a nivel de mdulo pueden tambin causar conflicto con los nombres de los procedimientos. Una variable dentro del mdulo no puede tener el mismo nombre de cualquier procedimiento o tipo definido en el mdulo. Puede, sin embargo, tener el mismo nombre como procedimiento pblico, tipos, o variables definidas en otros mdulos. En este caso, cuando la variable es accedida desde otro mdulo, debe ser calificada con el nombre del mdulo. Aunque las reglas de ensombrecimento descritas antes no son complejas, el ensombrecimiento puede ser confuso y conducir a sutiles errores en su cdigo; es una buena prctica de programacin mantener los nombres de las variables distintas unas de otras. En los mdulos de formulario, trate de usar nombres de variables que sean diferentes de los nombres de controles sobre esos formularios. Variables estticas Adems del alcance, las variables tienen un tiempo de vida, el periodo de tiempo durante el cual ellas retienen su valor. Los valores a nivel de mdulo y variables pblicas son preservados durante el tiempo que est en funcionamiento su aplicacin. Sin embargo, las variables locales declaradas con Dim existen solamente durante el tiempo en que est en ejecucin el procedimiento dentro del cual fueron declaradas. Usualmente,

68

cuando el procedimiento finaliza su ejecucin, los valores de las variables locales no son preservados y la memoria usada por las variables locales es reclamada. La prxima vez que se ejecuta el procedimiento, todas sus variables locales son reinicializadas. Sin embargo, Usted puede preservar el valor de una variable local haciendo static a la variable. Utilice la palabra reservada static para declarar una o ms variables dentro de un procedimiento, exactamente como lo hara con la declaracin Dim: Static Depth Por ejemplo, la siguiente funcin calcula un total acumulativo sumndole un nuevo valor al total de valores previos almacenados en la variable esttica Accumulate: Function RunningTotal(num) Static ApplesSold AppelsSold=ApplesSold+num RunningTotal=ApplesSold End Function Si ApplesSold hubiese sido declarada con Dim en vez de Static, los previos valores acumulados no seran preservados a travs de las llamadas de la funcin, y la funcin simplemente retornara el mismo valor con el cual fue llamada. Puede producir el mismo resultado declarando ApplesSold en la seccin de declaraciones del mdulo, hacindola una variable a nivel de mdulo. Una vez que cambia el alcance de la variable de esta manera, sin embargo, no tarda el procedimiento de dejar de tener acceso exclusivo a ella. En vista que otros procedimientos pueden acceder y cambiar el valor de la variable, los totales acumulativos podran ser irreales y el cdigo podra llegar a ser ms difcil de darle mantenimiento. Declarando como static todas las variables locales Para hacer que todas las variables locales en un procedimiento sean estticas, site la palabra reservada Static al comienzo del encabezamiento del procedimiento. Por ejemplo: Static Function RunningTotal(num) Esto hace que todas las variables locales en el procedimiento se conviertan en estticas sin importar que ellas hayan sido declaradas con Static, Dim, Private, o declaradas implcitamente. Puede situar Static al inicio de cualquier Sub o encabezamiento de procedimiento de funcin, incluyendo procedimientos de eventos y aquellos declarados como Private. Constantes A menudo encontrar que su cdigo contiene valores constantes que se repiten una y otra vez. O encontrar que su cdigo depende de ciertos nmeros que son difciles de recordar nmeros que, por su contenido o por ellos mismos, no tienen significados obvios. En estos casos, puede Usted mejorar la lectura de su cdigo y hacerlo ms fcil de mantener a travs del uso de constantes. Una constante es un nombre significativo que toma el lugar de un nmero o cadena que no cambia. Aunque una constante de cierta forma se parece a una variable, Usted no puede modificar una constante, o asignarle un nuevo valor, como puede hacerlo con una variable. Existen dos fuentes de constantes: Las constantes Intrnsecas o definidas por el sistema son proporcionadas por aplicaciones y controles. Las constantes de Visual Basic son listadas con el Object Browser, que tambin lista las libreras objeto para acceso de datos (DAO). Otras aplicaciones que proporcionan libreras objeto, tales como Microsoft Excel y Microsoft Project, tambin proporcionan una lista de constantes que puede usar con sus objetos, mtodos y propiedades. Las constantes son tambin definidas en la librera objeto de cada control ActiveX. Las constantes Simblicas o Definidas por el Usuario son declaradas usando la instruccin Const. En Visual Basic los nombres de constantes son una mezcla de letras minsculas y maysculas, con un prefijo indicando la librera objeto que define la constante. Las constantes de las libreras objeto de Visual Basic son

69

aquellas que llevan el prefijo vb, por ejemplo, vbTileHorizontal. Las constantes de la librera objeto de acceso de datos llevan como prefijo db, por ejemplo, dbRelationUnique. Los prefijos estn dirigidos a prevenir accidentales colisiones en los casos en que las constantes tengan idnticos nombres y representen diferentes valores. An con prefijos, es posible que dos objetos de librera contengan idnticas constantes representando diferentes valores. La constante que ser referenciada en este caso depende sobre cual librera objeto tienen mayor prioridad. Para estar absolutamente seguro de evitar colisiones de nombres de constantes, puede calificar referencias a constantes con las sintaxis siguiente: [libname.][modulename.]constname Usualmente libname es el nombre de clase del control o librera. Modulename es el nombre del mdulo que define la constante. Constname es el nombre de la constante. Cada uno de estos elementos estn definidos en la librera objeto y pueden ser vistos con el Objetc Browser. Creando sus propias constantes La sintaxis para declarar una constante es: [Public/Private]Const constantname [As type] = expression El argumento constantname es un nombre simblico vlido (las reglas son las mismas que aquellas para la creacin de nombres de variable), y expression es compuesta de constantes numricas o de cadena y operadores; sin embargo, no puede usar llamadas de funcin en expression. Una instruccin Const puede representar cantidades matemticas o de fecha/hora: Const conPi = 3.14159265358979 Public Const conMaxPlanets As Integer = 9 Const conReleaseDate = #1/1/95# La declaracin Const puede tambin ser usada para definir constantes de cadena: Public Const conVersion = 07.10.A Const conCodeName = Enigma Puede situar ms de una declaracin de constantes en una lnea si las separa con comas: Public Const conPi=3.14, conMaxPlanets=9, _ ConWorldPop=6E+09 La expresin a la derecha del signo igual (=) a menudo es un nmero o una cadena literal, pero puede ser tambin de una expresin que resulte de un nmero o cadena (aunque esta expresin no puede contener llamadas de funcin). Incluso puede definir constantes en trminos de constantes ya definidas: Const conPi2=conPi*2 Una vez que define las constantes puede incluirlas en su cdigo para hacerlo ms leble. Por ejemplo: Static SolarSystem (1 to conMaxPlanets) If numPeople > conWorldPop then Exit Sub Alcance de las constantes definidas por el usuario Una declaracin Const tiene alcances igual que una declaracin de variables, y las mismas reglas se aplican: Para declarar una constante que exista dentro de un procedimiento, declrela dentro de ese procedimiento. Para declarar una constante que est disponible a todos los procedimientos dentro de un mdulo, pero no a todo cdigo fuera de ese mdulo, declrela en la seccin de Declaraciones de ese mdulo. Para crear una constante disponible a toda la aplicacin, declare la constante en un mdulo estndar en la seccin de Declaraciones y site la palabra reservada Public antes de Const. Las constantes Public no pueden ser declaradas en un formulario o en un mdulo de clase.

70

Evitando referencias circulares En vista que las constantes deben ser definidas en trmino de otras constantes, debe tener el cuidado de no establecer un crculo o referencia circular entre dos o ms constantes. Un crculo ocurre cuando Usted tiene dos o ms constantes pblicas, cada una de las cuales est definida en trmino de las otras. Por ejemplo: En Mdulo 1: Public Const conA = conB * 2 disponible para toda la aplicacin. En Mdulo 2: Public Const conB = conA / 2 Si un crculo ocurre, Visual Basic genera un error cuando se trata de poner en funcionamiento la aplicacin. No podr hacer funcionar la aplicacin hasta que resuelva la referencia circular. Para evitar la creacin de crculos, restrinja todas sus constantes pblicas a un solo mdulo, o, a lo sumo, un pequeo nmero de mdulos. Tipos de datos Las variables son lugares usados para almacenar valores. Ellas tienen nombres y tipos de datos. El tipo de dato de una variable determina cmo los bits representando esos valores sern almacenados en la memoria de la computadora. Cuando declara una variable tambin est suministrando un tipo de dato para ella. Todas las variables tienen un tipo de dato que determinan que tipo de dato pueden ellas almacenar. Por defecto, si no suministra el tipo de dato, a la variable se le otorga el tipo de dato Variant. El tipo de dato Variant es como un camalen puede representar muchos diferentes tipos de datos en diferentes situaciones. No necesita convertir entre estos tipos de datos cuando sean asignados a una variable Variant: Visual Basic ejecuta automticamente todas las conversiones necesarias. Si sabe que una variable siempre almacenar un particular tipo de datos, por esta causa, Visual Basic podr manejar en forma ms eficiente los datos si declara la variable con tal tipo. Por ejemplo, una variable que almacena el nombre de una persona estar mejor representada con un tipo de datos de cadena, en vista de que un nombre siempre est compuesto de caracteres. Los tipos de datos se aplican a otras cosas, adems de las variables. Cuando asigna un valor a una propiedad ese valor tiene un tipo de datos. Los argumentos de funciones tambin tienen tipos de datos. En realidad, en Visual Basic, casi todo lo que involucra datos tambin involucra tipos de datos. Declarando variables con tipos de datos Antes de usar una variable No-Variant, debe utilizar las declaraciones Private, Public, o Static, para declarar su tipo de datos, As type. Por ejemplo, las siguientes instrucciones declaran tipos de datos Integer, Double, String y Currency, respectivamente: Private I As Integer Dim Amt As Double Static YourName As String Public BillsPaid As Currency Una declaracin puede combinar declaraciones mltiples, como en estas instrucciones: Private I As Integer, Amt As Double Private YourName As String, BillsPaid As Currency Private Test, Amount, J As Integer Nota: Si no suministra un tipo de datos, a la variable se le asigna el tipo de datos por defecto. En el ejemplo anterior, las variables Test y Amount son de tipo Variant. Si usted es un experto programador esto podr sorprenderlo pues en la mayora de los lenguajes de programacin todas las variables en la misma lnea de declaracin tienen el mismo tipo de datos especificado, en este caso, Integer.

71

Tipos de datos numricos Visual Basic suministra diversos tipos de datos numricos Integer, Long (integral larga), Single (precisin sencilla de punto flotante), Double (precisin doble de punto flotante), y Currency. El uso de los tipos de datos numricos generalmente utiliza menos espacio de almacenamiento que un tipo de datos Variant. Si sabe que una variable siempre almacenar nmeros enteros (tales como 12) en vez de nmeros fraccionales (tales como 3.57), declrela como tipo de datos Integer o Long. Las operaciones son ms rpidas con Integer, y estos tipos consumen menos memoria que los otros tipos de datos. Son especialmente provechosas como variables de contador, en los bucles For...Netx. Si la variable contiene una fraccin, declrela como variable Single, Double o Currency. El tipo de datos Currency est apto para manejar hasta cuatro dgitos a la derecha del punto decimal y quince dgitos a la izquierda; este es un preciso tipo de dato de punto fijo apropiado para clculos monetarios. Los nmeros de punto flotante (Single y Double) tienen mucho mayores rangos que Currency, pero estn sujetos a pequeos errores de redondeo. El tipo de datos Byte Si la variable contiene datos binarios, declrela como un arreglo de tipos de datos Byte. Usando variables Byte para almacenar datos binarios hace que se preserven durante la conversin de formato. Cuando las variables de cadena son convertidas entre los formatos ANSI y Unicode, cualquier dato binario en la variable queda corrompido. Visual Basic puede automticamente convertir entre ANSI y Unicode, cuando: Lectura desde archivos. Escritura hacia archivos. Llamadas a DLLs. Llamadas de mtodos y propiedades de objetos. Todos los operadores que trabajan con enteros trabajan con los tipos de datos Byte, excepto unary minus. En vista que Byte es un tipo sin signo en el rango de 0-255, este no puede representar nmeros negativos. As para unary minus, Visual Basic restringe el Byte primero a un entero con signo. Todas las variables numricas pueden ser asignadas entre ellas y entre las variables del tipo Variant. Visual Basic redondea, en vez de truncar, la parte fraccional de los nmeros de punto flotante antes de asignarlas a un entero. El tipo de datos de cadena Si tiene una variable que siempre contendr cadenas y nunca valores numricos, puede declararla como tipo de datos de cadena. Por ejemplo: Private S As String Despus asigna cadenas a esta variable y la manipula usando funciones de cadena: S = Data Base S = Left (S,4) Por defecto, una variable de cadena o argumento es una cadena de longitud variable; la cadena crece o se acorta a medida que le asigna nuevos datos. Puede tambin declarar cadenas de longitud fija. Especifica cadenas de longitud fija con esta sintaxis: String * size Por ejemplo, para declarar una cadena que tendr siempre 50 caracteres de largo usa cdigo como este: Dim EmpName As String * 50 Si asigna cadenas menores de 50 caracteres, EmpName es rellanado de tantos espacios como se necesiten para totalizar los 50 caracteres. Si asigna una cadena que es ms larga que la cadena de longitud fija, Visual Basic simplemente trunca los caracteres sobrantes.

72

En vista de que las cadenas de longitud fija son rellenadas con espacios en blanco, podr encontrar que las funciones Trim y RTrim son de beneficio pues remueven estos espacios de las cadenas. Las cadenas de longitud fija en los mdulos estndar pueden ser declaradas como pblicas o privadas. En los mdulos de clase y de formulario, las cadenas de longitud fija deben ser declaradas como privadas. Intercambiando cadenas y nmeros Puede asignar una cadena a una variable numrica si la cadena representa un valor numrico. Es posible tambin asignar un valor numrico a una variable de cadena. Por ejemplo, site un botn de comando, una caja de texto, y un List Box sobre un formulario. Teclee el siguiente cdigo en el evento clic del botn de comando: Private Sub Command1_Click ( ) Dim intX As Integer Dim strY As String strY=100.23 intX=strY pasa la cadena a una variable numrica. List1.AddItem Cos(strY) agrega al Listbox el coseno del nmero en la cadena. strY=cos(strY) pasa el coseno a la variable de cadena. Text1.Text=strY se imprime la variable de cadena en la caja de texto. End Sub Visual Basic automticamente fuerza las variables al apropiado tipo de dato. Debe tener cuidado cuando intercambie cadenas y nmeros; pasar un valor no numrico a la cadena causar que ocurra un error en tiempo de ejecucin. Tipo de dato Booleano Si tiene una variable que contiene informacin simple de falso / verdadero, si / no, encendido / apagado, puede declararla como de tipo Booleano. El valor por defecto del tipo Booleano es Falso. En el siguiente ejemplo, blnRunning es una variable booleana que guarda condiciones simples de si / no: Dim blnRunning As Boolean ver si la cinta est trabajando: If Recorder.Direction=1 then blnRunning=True End if El tipo de datos de fecha Los valores de fecha y hora pueden almacenarse en especficos tipos de datos Date, o en variables Variant. Las mismas caractersticas generales se aplican a los dos tipos en la fecha. Cuando otros tipos de datos numricos son convertidos a Date, los valores a la izquierda del punto decimal representan informacin de fecha, mientras que los valores a la derecha del punto decimal representan tiempo. Medianoche es cero, y medioda es 0.5. Nmeros enteros negativos representan fechas anteriores al 30 de Diciembre de 1899. El tipo de datos objeto Las variables objeto pueden ser almacenadas como direcciones de 32 bits (4-bytes) que se refieren a objetos dentro de la aplicacin o dentro de alguna otra aplicacin. Una variable declarada como objeto es una que puede ser subsecuentemente asignada (usando la declaracin Set) para referirse a cualquier objeto actual reconocido por la aplicacin: Dim objDb As Object Set objDb=OpenDatabase (c:\Vb5\Biblio.mdb) Cuando declare variables objetos trate de usar clases especficas (tales como TextBox en vez de Control, como en el caso precedente, Database en vez de Object) en vez de objetos genricos. Visual Basic puede resolver las referencias a las propiedades y mtodos de los objetos con tipos especficos antes de hacer funcionar la aplicacin. Esto permite que la aplicacin funcione ms rpido en tiempo de ejecucin. Las clases especficas son listadas por el Object Browser.

73

Cuando trabaje con los objetos de otras aplicaciones, en vez de usar Variant o el objeto genrico, declare los objetos tales como ellos son listados en la lista de clases del Object Browser. Esto asegura que Visual Basic reconocer el tipo especfico de objeto al cual Usted se est refiriendo, permitiendo que la referencia sea resuelta en tiempo de ejecucin. Conversin de tipos de datos Visual Basic proporciona diversas funciones de conversin que puede usar para convertir valores dentro de un especfico tipo de datos. Para convertir un valor a Currency, por ejemplo, usa la funcin Ccur: PayPerWeek = Ccur (hours * hourlyPay) A continuacin se muestra la tabla de conversin: Funcin de Conversin CBool CByte CCur CDate CDbl Cint CLng CSng CStr Cvar CVErr Convierte una expresin a Boolean Byte Currency Date Double Integer Long Single String Variant Error

Nota: Los valores pasados a una funcin de conversin deben ser vlidos para el tipo de datos de destino o un error ocurrir. Por ejemplo, si intenta convertir Long a Integer, Long deber estar dentro del rango vlido del tipo de datos Integer. El tipo de datos Variant Una variable Variant es capaz de almacenar todos los tipos de datos definidos por el sistema. No necesita de conversiones entre estos tipos de datos para asignarlo a una variable Variant; Visual Basic ejecuta automticamente todas las conversiones necesarias. Por ejemplo: Dim SomeValue Variant por defecto. SomeValue=17 SomeValue contiene 17 (una cadena de dos caracteres) SomeValue=SomeValue 15 SomeValue ahora contiene el valor numrico 2. SomeValue=U & SomeValue SomeValue ahora contiene una cadena de dos caracteres (U2) Aunque puede efectuar operaciones sobre variables Variant sin preocuparse mucho por el tipo de datos que ellas contengan, existen algunas trampas que debe evitar: Si ejecuta operaciones aritmticas o funciones sobre una Variant, la Variant debe contener nmeros. Si est concatenando cadenas debe usar el operador & en vez del operador +. Adicionalmente a actuar igual que cualquier otro tipo de datos estndar, las Variant contienen tres valores especiales: Empty, Null, y Error. El valor Empty Algunas veces necesita saber si un valor ha sido asignado alguna vez a la variable creada. Una variable Variant tiene el valor Empty antes de que se le asigne un valor. El valor Empty es un valor especial, diferente de cero, una cadena de longitud cero (), o el valor nulo. Puede comprobar si existe el valor Empty con esta funcin: If IsEmpty(Z) Then Z = 0

74

Cuando una Variant contiene un valor Empty, puede usarla en expresiones; es tratada como cero, o como una cadena de cero longitud, dependiendo de la expresin. El valor Empty desaparece en cuanto cualquier valor (incluyendo cero, cadena de longitud cero, o nulo) es asignado a la variable Variant. Puede hacer que Variant regrese a su valor Empty asignando la palabra reservada Empty a la Variant. El valor Null El tipo de datos Variant puede contener otro valor especial: Null. Null es usado comnmente en aplicaciones de bases de datos para indicar un dato desconocido o un dato perdido. En vista del modo en que este es usado en bases de datos, Null tiene algunas caractersticas nicas: Las expresiones que involucran a Null resultan en Nul. Es decir, se dice que Null se propaga a travs de las expresiones. Si cualquiera de las partes de una expresin es evaluada como Null, la expresin entera es evaluada como Null. Pasar Null, una Variant que contenga Null, o una expresin que evala como Null como un argumento a ms funciones causa que la funcin retorne Null. Los valores Null se propagan a travs de las funciones intrnsecas que retornan tipos de datos Variant. Puede tambin asignar Null con la palabra reservada Null: Z=Null Puede usar la funcin IsNull para comprobar si una variable Variant contiene Null: If IsNull(X) And IsNull(Y) Then Z=Null Else Z=0 End If Si asigna Null a una variable de cualquier otro tipo que no sea Variant, ocurre un error. Asignar Null a una variable Variant no causa un error, y Null se propaga a travs de las expresiones que involucren variables Variant (aunque Null no se propaga a travs de ciertas funciones). Puede retornar Null desde cualquier procedimiento de funcin con un valor retornado por la Variant. Las variables no son establecidas a Null a no ser que explcitamente a ellas se les asigne Null, de forma que si no usa Null en su aplicacin, no tiene que escribir cdigo para probarla y manejarla. El valor Error En una Variant, Error es un valor especial usado para indicar que una condicin de error ha ocurrido en un procedimiento. Sin embargo, al contrario de otros tipos de errores, no se presentan los manejadores de error a nivel de aplicacin. Esto le permite, o a la propia aplicacin, tomar alguna alternativa basada en el valor del error. Los valores de error son creados convirtiendo nmeros reales a valores de error usando la funcin CVErr. Traduccin: Derechos de Autor: RBsoftware (2001) Viernes Santo, 13 de abril 2001. 03:10p. Archivo: Traduccin VB7.

Tpicos Variant Avanzados Representacin interna de los valores en Variants

75

Las variables Variant mantienen una representacin interna de los valores que ellas almacenan. Esta representacin determina cmo Visual Basic trata estos valores cuando ejecuta comparaciones y otras operaciones. Cuando asigna un valor a una variable Variant, Visual Basic usa la ms compacta representacin que con exactitud grabe el valor. Posteriores operaciones pueden causar que Visual Basic cambie la representacin que est usando para una variable en particular. (Una variable Variant no es una variable sin tipos de datos; antes bien, es una variable que puede libremente cambiar su tipo de datos). Nota: Una Variant siempre toma un mximo de 16 bytes, sin importar lo que almacene ah. Los objetos, cadenas y arreglos no son fsicamente almacenados en las Variant; en estos casos, cuatro bytes de la Variant son usados para guardar ya sea una referencia objeto o un apuntador hacia la cadena o el arreglo. El dato actual es almacenado en cualquier lado. La mayora del tiempo no necesita preocuparse sobre qu representacin interna est usando Visual Basic para una variable en particular; Visual Basic maneja estas conversiones en forma automtica. Sin embargo, si necesita saber que valor est usando Visual Basic, puede usar la funcin VarType. Por ejemplo, si almacena valores con fracciones decimales en una variable Variant, Visual Basic siempre usa la representacin interna Double. Si sabe que su aplicacin no necesita alta exactitud (y menor velocidad) que un valor Double suministra, puede incrementar la velocidad de sus clculos convirtiendo los valores a Single, o an a Currency: If VarType(X)=5 Then X=CSng(X) la convierte a Single. Con una variable de arreglo, el valor de VarType es la suma del arreglo y de los valores retornados por el tipo de datos. Por ejemplo, este arreglo contiene valores Double: Private Sub Form_Click( ) Dim dblSample(2) As Double MsgBox VarType(dblSample) End Sub Valores numricos almacenados en Variants Cuando almacena nmeros enteros en variables Variant, Visual Basic usa la ms compacta representacin posible. Por ejemplo, si almacena un nmero pequeo sin fraccin decimal, Variant usa la representacin Integer para el valor. Si despus asigna un nmero ms largo, Visual Basic usa el valor Long o, si es verdaderamente largo, o si tiene un componente fraccional, usa un valor Double. Algunas veces desea usar una representacin especfica para un nmero. Por ejemplo, podra desear que una variable Variant almacene un valor numrico como Currency para evitar errores de redondeo durante los clculos. Visual Basic proporciona diversas funciones de conversin que puede usar para convertir los valores dentro de un tipo especfico. Por ejemplo, para convertir un valor a Currency, usa la funcin Ccur: PayPerWeek=Ccur(hours * hourlyPay) Un error ocurre si intenta ejecutar operaciones matemticas o funciones sobre una Variant que no contiene un nmero o algo que pueda ser interpretado como un nmero. Por ejemplo, no puede ejecutar operaciones aritmticas sobre el valor U2 an cuando este contiene un carcter numrico, en vista que la totalidad del valor no es un nmero vlido. De igual manera no puede ejecutar ningn clculo sobre el valor 1040EZ; sin embargo, puede ejecutar clculos sobre el valor +10, o 17E6, en vista de que estos son nmeros vlidos. Por esta razn a menudo querr determinar si una variable Variant contiene un valor que pueda ser utilizado con nmero. La funcin IsNumeric ejecuta esta tarea: Do anyNumber = InputBox (Enter a Number) Loop Until IsNumeric(anyNumber) MsgBox The Square root is: & Sqr(anyNumber)

76

Cuando Visual Basic convierte una representacin que no es numrica (tales como una cadena conteniendo un nmero) a un valor numrico, usa las condiciones regionales (especificadas en el panel de control de Windows) para interpretar el separador de millares, el separador decimal, y el smbolo de la moneda. De manera que, si la condicin de pas establecida en el panel de control de Windows es Estados Unidos, Canad, o Australia, estas dos declaraciones retornan verdadero: IsNumeric($100) IsNumeric(1,560.50) Mientras que estas dos declaraciones retornan falso: IsNumeric(DM100) IsNumeric(1.560,50) Sin embargo, el caso sera lo contrario, los dos primeros retornaran falso, y los dos ltimos verdadero, si la condicin de pas establecida en el panel de control de Windows hubiese sido establecida a Alemania. Si asigna una Variant que contenga un nmero a una variable de cadena o a una propiedad, Visual Basic convierte automticamente la representacin del nmero a una cadena. Si desea explcitamente convertir un nmero a una cadena, use la funcin CStr. Puede usar tambin la funcin Format para convertir un nmero a una cadena que incluya formateo tales como valores monetarios, que incluyen los smbolos de separador de millares y punto decimal. La funcin Format automticamente utiliza los smbolos apropiados acorde con las propiedades regionales establecidas en la caja de dilogo del panel de control de Windows. Cadenas almacenadas en Variants Generalmente, el almacenamiento y uso de cadenas en variables Variant plantea pocos problemas. Como se mencion antes, sin embargo, algunas veces el resultado del operador + puede ser ambiguo cuando se usa con dos valores Variant. Si ambos Variant contienen nmeros, el operador + ejecutar una adicin. Si ambos Variant contienen cadenas, el operador + ejecutar una concatenacin de cadenas. Pero si uno de los valores es representado por un nmero y el otro es representado por una cadena, la situacin se vuelve ms complicada. Visual Basic primero intenta convertir la cadena a un nmero, si esta conversin tiene xito el operador + suma los dos valores; si no tiene xito genera un error type mismatch. Para asegurarse que la concatenacin ocurrir, sin importar la representacin de los valores en las variables, use el operador &, en vez del operador +. Por ejemplo, el siguiente cdigo: Sub Form_Click ( ) Dim X,Y X=6 Y=7 Print X + Y, X & Y X=6 Print X + Y, X & Y End Sub Produce este resultado en el formulario: 67 67 13 67 Nota: Visual Basic almacena internamente las cadenas como Unicode. Valores de fecha y tiempo almacenados en Variants Las variables Variant pueden contener valores de fecha y tiempo. Muchas funciones retornan valores Fecha / Tiempo. Por ejemplo, DateSerial retorna el nmero de das que faltan para concluir el ao: Private Sub Form_Click ( ) Dim rightnow, daysleft, hoursleft, minutesleft rightnow=Now Now regresa la fecha y hora actual daysleft=int(DateSerial(Year(rightnow) _ + 1, 1, 1 ) rightnow)

77

hoursleft=24-Hour (rightnow) minutesleft=60-Minute(rightnow) Print daysleft & das que faltan en el ao. Print hoursleft & horas que faltan en el da. Print minutesleft & minutos que faltan en la hora. End Sub Puede efectuar tambin operaciones matemticas en los valores fecha y tiempo. Sumando o restando enteros, suma y resta das; sumando y restando decimales, suma y resta tiempo. En consecuencia, sumando 20 suma 20 das; mientras que restando 1/24 resta una hora. El rango de las fechas almacenadas en variables Variant va del primero de enero del ao cien (1 enero 0100), al treinta y uno de diciembre del ao nueve mil novecientos noventa y nueve (31 diciembre 9999). Los clculos en fechas no toman en cuenta las revisiones de calendario hechas antes de cambiarse al calendario Gregoriano, en consecuencia, los clculos que producen valores de fechas darn resultados incorrectos si involucran fechas anteriores a la adopcin del calendario Gregoriano, 1752 en Gran Bretaa y sus colonias; ms temprano o ms tarde en otros pases. Puede usar literales de fecha / tiempo en su cdigo encerrndolas con el smbolo nmero (#), de la misma forma que encierra las literales de cadena con las comillas ( XX...). Por ejemplo, puede comparar una Variant conteniendo un valor Fecha / Tiempo contra una literal que tenga fecha: If SomeDate > #3/6/93# Then ... De la misma forma, puede comparar un valor fecha / tiempo contra una literal completa que tenga fecha / tiempo: If SomeDate > #3/6/93 1:20pm# Then ... Si no incluye la hora en una literal fecha / tiempo, Visual Basic asume que la hora es medianoche (inicio del da). Si no incluye la fecha en una literal fecha / tiempo Visual Basic asume que la fecha es 30 de diciembre de 1899. Visual Basic acepta una amplia variedad de formatos de fecha / tiempo en literales. Estos son todos valores vlidos de fecha / tiempo: SomeDate=#3-6-93 13:20# SomeDate=#March 27, 1993 1:20am# SomeDate=#Apr-2-93# SomeDate=#4 April 1993# De la misma manera que puede usar la funcin IsNumeric para determinar si una variable Variant contiene un valor que puede ser considerado valor numrico vlido, puede usar la funcin IsDate para determinar si la Variant contiene un valor de fecha / tiempo considerado vlido. Puede usar despus la funcin CDate para convertir el valor en un valor fecha / tiempo. Por ejemplo, el siguiente cdigo comprueba la propiedad Text de una caja de texto con IsDate. Si la propiedad contiene texto que puede ser considerado como una fecha vlida, Visual Basic convierte el texto a fecha y calcula los das que faltan para que finalice el ao: Dim SomeDate, daysleft If IsDate(Text1.Text) Then SomeDate=CDate(Text1.Text) daysleft=DateSerial(Year(SomeDate) + _ 1, 1, 1) SomeDate Text2.Text=daysleft & das que faltan en el ao. Else MsgBox Text1.Text & no es una fecha vlida. End If

78

Objetos almacenados en Variants Los objetos pueden almacenarse en variables Variant. Esto puede ser til si necesita manejar una variada cantidad de tipos de datos, incluyendo objetos. Por ejemplo, todos los elementos dentro de un arreglo deben ser del mismo tipo. Establecer el tipo de datos a Variant en un arreglo le permite almacenar objetos adems de cualquier otro tipo de datos. Arreglos Si ha programado en otros lenguajes probablemente le resultar familiar el concepto de arreglos. Los arreglos le permiten referenciar a una serie de variables con el mismo nombre y usar un nmero (un ndice) para referirse a ellas en forma individual. Esto ayuda a crear poco y simple cdigo en muchas situaciones, en vista de que puede establecer bucles para manejar eficientemente cualquier nmero de casos a travs del uso de un nmero de ndice. Los arreglos tienen fronteras superiores e inferiores, y los elementos del arreglo estn contiguos dentro de estas fronteras. En vista de que Visual Basic asigna espacio para cada nmero de ndice, elimina la necesidad de declarar un arreglo ms grande de lo necesario. Nota: Los arreglos abordados en esta seccin son arreglos de variables, declarados en cdigo. Estos son diferentes de los arreglos de control que establece a travs de la propiedad index de los controles en tiempo de diseo. Los arreglos de variables son siempre contiguos; al contrario de los arreglos de control, que no puede cargar o descargar elementos en la mitad del arreglo. Todos los elementos en un arreglo tienen el mismo tipo de dato. Desde luego, cuando el tipo de datos en Variant cada elemento puede contener diferente tipo de dato (objetos, cadenas, nmeros, y ms). Puede declarar un arreglo en cualquiera de los tipos fundamentales de datos, incluyendo los tipos definidos por el usuario. En Visual Basic existen dos tipos de arreglos: los arreglos de tamao fijo que siempre permanecen del mismo tamao, y los arreglos dinmicos cuyo tamao puede cambiar en tiempo de ejecucin. Declarando arreglos de tamao fijo Existen tres modos para declarar un arreglo de tamao fijo, dependiendo del alcance que Usted desea que tenga el arreglo: Para crear un arreglo pblico use la declaracin Public en la seccin de declaraciones de un mdulo para declarar el arreglo. Para crear un arreglo a nivel de mdulo, use la declaracin Private en la seccin de declaraciones de un mdulo para declarar el arreglo. Para crear un arreglo local, use la declaracin Private en un procedimiento para declarar el arreglo. Estableciendo las fronteras superiores e inferiores Cuando declare un arreglo, contine el nombre del arreglo con la frontera superior entre parntesis. La frontera superior no puede exceder el rango de un tipo de datos Long (-2,147,483,648 a 2,147,483,647). Por ejemplo, estas declaraciones de arreglo pueden aparecer en la seccin de declaraciones de un mdulo: Dim Counters(14) As Integer 15 elementos. Dim Sums(20) As Double Para crear un arreglo pblico, usa Public, en vez de Dim: Public Counters(14) As Integer Public Sums(20) As Double La misma declaracin, dentro de un procedimiento, usa Dim: Dim Counters(14) As Integer Dim Sums(20) As Double

79

La primera declaracin crea un arreglo de 15 elementos, con los nmeros de ndice entre cero y catorce. El segundo crea un arreglo con 21 elementos, con los nmeros de ndice en un rango entre cero y veinte. La frontera inferior por defecto es cero. Para especificar una frontera inferior, suminstrela explcitamente (como tipo de datos Long) usando la palabra reservada To: Dim Counters(1 To 15) As Integer Dim Sums (100 To 120) As String En las declaraciones precedentes los nmeros de ndice de Counters estn por el rango entre 1 y 15, y los nmeros de ndices de Sums estn por el rango entre 100 y 120. Arreglos que contienen otros arreglos Es posible crear un arreglo Variant y poblarlo de otros arreglos de diferentes tipos de datos. El siguiente cdigo crea dos arreglos, uno conteniendo enteros y el otro cadenas. Despus crea un tercer arreglo Variant y lo puebla con los arreglos de enteros y de cadenas. Private Sub Command1_Click ( ) Dim intX As Integer declara una variable contador. declara y puebla el arreglo de enteros... Dim countersA(5) As Integer For intX=0 To 4 countersA(intX)=5 Next intX declara y puebla el arreglo de cadenas Dim countersB(5) As String For intX=0 To 4 countersB(intX)=Hola Next intX Dim arrX(2) As Variant declara un nuevo arreglo de dos miembros arrX(1)=countersA( ) puebla el arreglo con otros arreglos. arrX(2)=countersB( ) MsgBox arrX(1) (2) despliega un miembro de cada arreglo... MsgBox arrX(2) (3) End Sub Arreglos multidimensionales Algunas veces necesita seguir la pista de informacin relacionada en un arreglo. Por ejemplo, para mantener la pista de cada pxel en la pantalla del computador, se necesita referir a sus coordenadas X y Y. Esto puede lograrse usando arreglos multidimensionales para almacenar los valores. Con Visual Basic puede declarar arreglos de mltiples dimensiones. Por ejemplo, las siguientes instrucciones declaran un arreglo de dos dimensiones, 10 por 10, dentro de un procedimiento: Static MatrixA(9,9) As Double Cualquiera o ambas dimensiones deben ser declaradas con fronteras inferiores explcitas: Static MatrixA(1 To 10, 1 To 10) As Double Puede extender esto a ms de dos dimensiones. Por ejemplo: Dim MultiD(3, 1 to 10, 1 To 15) Esta declaracin crea un arreglo que tiene tres dimensiones con tamaos 4 por 10 por 15. el nmero total de elementos es el producto de estas tres dimensiones, o sea 600. Nota: Cuando agregue dimensiones a un arreglo, el almacenamiento total necesitado por el arreglo se incrementa en forma dramtica, de forma que use los arreglos multidimensionales con cuidado. Tenga especial cuidado con los arreglos Variant, en vista que ellos son ms grandes que los de otros tipos de datos.

80

Usando bucles para manipular arreglos Puede eficientemente manipular arreglos multidimensionales usando bucles FOR NEXT. Por ejemplo, las siguientes instrucciones inicializan cada elemento en la matriz MatrixA al valor basado en su ubicacin en el arreglo: Dim I As Integer, J As Integer Static MatrixA (1 To 10, 1 To 10) As Double For I=1 to 10 For J=1 to 10 MatrixA ( I, J ) = I * 10 + J Next J Next I Arreglos dinmicos Algunas veces no sabe con exactitud cun grande tiene que hacer un arreglo. Puede desear tener la capacidad de cambiar el tamao del arreglo en tiempo de ejecucin. Un arreglo dinmico puede ser cambiado de tamao en cualquier momento. Los arreglos dinmicos son una de las caractersticas ms flexibles y convenientes en Visual Basic y ayudan a manejar la memoria eficientemente. Por ejemplo, puede usar un arreglo grande por un corto tiempo y despus liberar la memoria al sistema cuando ya no lo est usando. La alternativa es declarar el arreglo lo ms grande posible y despus ignorar los elementos del arreglo que no necesite. Sin embargo, este planteamiento, si no es aprovechado, puede causar que el ambiente del sistema trabaje con poca memoria. Para crear un arreglo dinmico: 1. Declarar el arreglo con la instruccin Public (si desea que el arreglo sea pblico), o con la instruccin Dim a nivel de mdulo (si desea que el arreglo est a nivel de mdulo), o con las instrucciones Static o Dim en un procedimiento (si desea que el arreglo sea local). Declara el arreglo como dinmico dndole una lista de dimensiones vaca: Dim DynArray ( ) 2. Colocar el nmero actual de elementos con la instruccin ReDim: ReDim DynArray ( X + 1 ) La instruccin ReDim puede solamente aparecer en un procedimiento. Al contrario de las instrucciones Dim y Static, ReDim es una instruccin ejecutable: hace que la aplicacin lleve a efecto una accin en tiempo de ejecucin. La instruccin ReDim acepta la misma sintaxis usada con los arreglos fijos. Cada ReDim puede cambiar el nmero de elementos, as como las fronteras superiores e inferiores, en cada redimensionamiento. Sin embargo, el nmero de dimensiones en el arreglo no puede cambiar: ReDim DynArray ( 4 To 12 ) Por ejemplo, el arreglo dinmico Matriz1 es creado primeramente declarndolo a nivel de mdulo: Dim Matrix1( ) As Integer Despus un procedimiento ubica espacio para el arreglo: Sub CalcValuesNow ( ) . . . ReDim Matrix1 ( 19, 29 ) End Sub La instruccin ReDim mostrada aqu ubica una matriz de 20 por 30 enteros (para un total de 600 elementos). De forma alternativa, las fronteras de un arreglo dinmico pueden ser establecidas usando variables: ReDim Matrix1 ( X , Y )

81

Preservando el contenido de los arreglos dinmicos Cada vez que ejecuta la instruccin ReDim todos los valores actualmente almacenados en el arreglo se pierden. Visual Basic convierte los valores a un valor Empty (para los arreglos Variant), a un valor cero (para los arreglos numricos); a un valor de longitud cero (para los arreglos de cadena); y un valor nada (para los arreglos de objetos). Esto es provechoso cuando desea preparar el arreglo para nuevos datos, o cuando desea empequeecer el arreglo para que ste utilice menos memoria. Algunas veces puede desear cambiar el tamao del arreglo sin perder los datos almacenados en el arreglo. Puede hacer esto con la instruccin ReDim ms la palabra reservada Preserve. Por ejemplo, puede agrandar el arreglo en un elemento sin perder los valores de los elementos existentes usando la funcin UBound para referirse a la frontera superior: ReDim Preserve DynArr ( UBound (DynArray) + 1 ) Solamente la frontera superior de la ltima dimensin en un arreglo multidimensional puede ser cambiada cuando usa la palabra reservada Preserve; si cambia cualquiera de las otras dimensiones, o la frontera inferior de la ltima dimensin, ocurre un error en tiempo de ejecucin. As, puede usar cdigo con este: ReDim Preserve Matriz ( 10, UBound(Matriz, 2 ) + 1 ) Pero no puede usar este cdigo: ReDim Preserve Matriz ( UBound (Matriz, 1 ) + 1, 10 ) Traduccin: Derechos de Autor: RBsoftware (2001) Sbado, 14 de abril 2001. 04:13p. Archivo: Traduccin VB8.

Introduccin a procedimientos Puede simplificar las tareas de programacin partiendo el programa en componentes lgicos ms pequeos. Estos componentes, llamados procedimientos, pueden despus convertirse en los bloques de construccin que le permitan realzar y extender Visual Basic. Los procedimientos son provechosos para condensar tareas repetidas o compartidas, tales como las que son frecuentemente usadas en clculos, manipulacin y control de texto, y en operaciones de bases de datos. Existen dos amplios beneficios al programar con procedimientos: Los procedimientos le permiten partir los programas dentro de unidades lgicas discretas, cada una de las cuales pueden ser revisadas ms fcilmente que un programa por entero sin procedimientos. Los procedimientos usados en un programa pueden actuar como bloques de construccin para otros programas, usualmente con poca o sin ninguna modificacin. Existen diferentes tipos de procedimientos usados en Visual Basic: Sub Procedimientos que no retornan valor. Procedimientos de funcin que retornan valor. Procedimientos de propiedades, pueden retornar y asignar valores, y establecer referencias a objetos. Sub Procedimientos Un sub procedimiento es un bloque de cdigo que es ejecutado en respuesta a un evento. Partiendo el cdigo de un mdulo en sub procedimientos, se torna ms fcil encontrar y modificar el cdigo en su aplicacin. La sintaxis de un sub procedimiento es:

82

[Private | Public] [Static] Sub procedurename (arguments) statements End Sub Cada vez que es llamado el procedimiento, las instrucciones entre Sub y End Sub son ejecutadas. Los sub procedimientos pueden ser ubicados en mdulos estndar, mdulos de clases y mdulos de formulario. En todos los mdulos los procedimientos son por defecto pblicos, lo que significa que pueden ser llamados desde cualquier lugar dentro de la aplicacin. Los argumentos para un procedimiento son iguales que las declaraciones de variables, declarando los valores que son pasados desde el procedimiento que ha hecho el llamado. En Visual Basic es importante distinguir entre dos tipos de sub procedimientos: procedimientos generales y procedimientos de eventos. Procedimientos generales Un procedimiento general le dice a la aplicacin cmo ejecutar una tarea especfica. Una vez que el procedimiento general es definido, este debe ser especficamente invocado por la aplicacin. En cambio, un evento de procedimiento permanece aislado hasta que es llamado para que responda a eventos causados por intervencin del usuario o disparados por el sistema. Para qu crear procedimientos generales? Una razn es que algunos procedimientos de eventos diferentes pueden necesitar las mismas acciones ejecutadas. Una buena estrategia de programacin es poner las instrucciones comunes en un procedimiento separado (un procedimiento general) y tener procedimientos de eventos que lo llamen. Esto elimina la necesidad de duplicar cdigo y tambin hace que la aplicacin sea ms fcil de mantener. Procedimientos de evento Cuando un objeto en Visual Basic reconoce que un evento ha ocurrido, automticamente invoca el procedimiento de evento usando el nombre correspondiente al evento. En vista que el nombre establece una asociacin entre el objeto y el cdigo, los procedimientos de evento se dicen que estn encadenados a formularios y controles. Un procedimiento de evento para un control combina el nombre actual del control (establecido en la propiedad Name), un carcter de subrayado ( _ ) y un nombre de evento. Por ejemplo, si desea que un botn de comando, llamado cmdPlay invoque a un procedimiento de evento cuando se le de clic, use el procedimiento cmdPlay_Click. Un procedimiento de evento para un formulario combina la palabra Form, un subrayado y el nombre del evento. Si desea que un formulario invoque un procedimiento de evento cuando se le de clic al formulario, use el procedimiento Form_Click. (Como los controles, los formularios tienen un nombre nico, pero estos nombres no son usados en los nombres de procedimientos de evento). Si est usando formularios MDI, los procedimientos de evento combinan la palabra MDIForm, un subrayado, y el nombre del evento: MDIForm_Load. Todos los eventos de procedimiento usan la misma sintaxis general: Sintaxis para un evento de control Sintaxis para un evento de formulario Private Sub ControlName_EventName (arguments) Private Sub Form_EventName (arguments) Declaraciones Declaraciones End Sub End Sub

Aunque puede escribir procedimientos de evento desde cero, es ms fcil utilizar el cdigo de procedimiento proporcionado por Visual Basic, el cual automticamente incluye los nombres de procedimientos correctos. Puede seleccionar un modelo de la ventana Editor de Cdigo seleccionando un objeto de la caja de objetos y seleccionando un procedimiento de la caja de procedimientos.

83

Es buena idea tambin establecer los nombres de las propiedades de los controles antes de escribir los procedimientos de evento para ellos. Si cambia el nombre de un control despus de haberlo conectado a un procedimiento, debe obligatoriamente cambiar el nombre del procedimiento para que calce con el nuevo nombre del control. De otro modo, Visual Basic no ser capaz de equiparar el nombre del control con el procedimiento. Cuando un nombre de procedimiento no tiene su gemelo como nombre de control, se convierte en procedimiento general. Procedimientos de funcin Visual Basic incluye funciones intrnsecas, tales como Sqr, Cos, o Chr. Adems, puede usar las instrucciones Function para escribir sus propios procedimientos de funcin. La sintaxis de un procedimiento de funcin es: [Private | Public] [Static] Function procedureName (arguments) [As type] Declaraciones End Function Igual que los sub procedimientos, un procedimiento de funcin es un procedimiento separado que puede tomar argumentos, ejecutar una serie de instrucciones y cambiar el valor de sus argumentos. Al contrario del sub procedimiento, el procedimiento de funcin puede emitir un valor de retorno hacia el procedimiento que hizo la llamada. Existen tres diferencias entre sub procedimientos y procedimientos de funcin: Generalmente, llama a una funcin incluyendo el nombre del procedimiento de funcin y los argumentos al lado derecho de una expresin o instruccin larga (returnvalue=function). Los procedimientos de funcin tienen tipos de datos, como lo tienen las variables. Esto determina el tipo de valor retornado. (Si la clusula As falta, el tipo por defecto es Variant). Retorna un valor asignndolo al propio nombre del procedimiento. Cuando el procedimiento de funcin retorna un valor, este valor puede despus convertirse en parte de una expresin ms larga. Por ejemplo, puede escribir una funcin que calcule el tercer lado, o hipotenusa, de un tringulo derecho, dando los valores de los otros dos lados: Function Hypotenuse (A As Integer, B As Integer) As String Hypotenuse=Sqr ( A ^ 2 + B ^ 2 ) End Function Llama a un procedimiento de funcin de la misma manera que llama a cualquier funcin intrnseca en Visual Basic: Label.Caption=Hypotenuse(CInt(Text1.Text), CInt(Text2.Text) strX=Hypotenuse(Width,Height) Trabajando con procedimientos Creando nuevos procedimientos Para crear un nuevo procedimiento general: Teclee el encabezado de procedimiento en la ventana cdigo y pulse enter. El encabezamiento de procedimiento puede ser tan simple como Sub o Function seguido por un nombre. Por ejemplo, puede dar entrada a cualquiera de lo siguiente: Sub UpdateForm ( ) Function GetCoord ( ) Visual Basic responde completando el modelo para el nuevo procedimiento. Seleccin de procedimientos existentes Para ver un procedimiento en el mdulo actual: Para ver un procedimiento general existente, seleccione General de la caja objeto en la ventana cdigo, y despus seleccione el evento en la caja de procedimientos. Para ver un procedimiento en otro mdulo:

84

1. 2. 3. 4.

A partir del men View, seleccione Object Browser. Seleccione el proyecto de la caja Project / Library. Seleccione el mdulo de la lista Classes, y el procedimiento de la lista Members. Seleccione Vew Definition.

Llamando procedimientos Las tcnicas para llamar procedimientos varan, dependiendo del tipo de procedimiento, dnde est ubicado, y cmo es usado en su aplicacin. Las siguientes secciones describen cmo llamar sub procedimientos y procedimientos de funcin. Llamando sub procedimientos Un sub procedimiento difiere de un procedimiento de funcin en que el sub procedimiento no puede ser llamado usando su nombre dentro de una expresin. Una llamada a un sub procedimiento es una instruccin ngrima, aislada, solitaria. Tambin, un sub procedimiento no retorna un valor en su nombre, como lo hace una funcin. Sin embargo, como una funcin, un sub procedimiento puede modificar los valores de cualquiera de las variables pasadas a l. Existen dos formas para llamar sub procedimientos: ambas instrucciones llaman a un sub procedimiento llamado MyProc. Call MyProc (FirstArgument, SecondArgument) MyProc FirstArgument, SecondArgument Note que cuando usa la sintaxis Call, los argumentos deben ser encerrados entre parntesis. Si omite la palabra Call, tambin debe omitir los parntesis que engloban los argumentos. Llamando procedimientos de funcin Usualmente llama a procedimientos de funcin que haya escrito de la misma forma en que llama a las funciones intrnsecas de Visual Basic, tales como Abs; esto es, usando su nombre en la expresin: todas las siguientes instrucciones llaman a una funcin llamada ToDec: Print 10 * ToDec X=ToDec If ToDec=10 Then Debug.Print Out Of Range X=AnotherFunction(10 * ToDec) Es tambin posible llamar a una funcin igual a como se llama a un sub procedimiento. Las siguientes instrucciones ambas llaman a la misma funcin: Call Year(Now) Year Now Cuando llama a una funcin de esta manera, Visual Basic elimina el valor de retorno. Llamando procedimientos en otros mdulos Los procedimientos pblicos en otros mdulos pueden ser llamados desde cualquier lugar del proyecto. Necesita especificar el mdulo que contiene el procedimiento que est llamando. La tcnica para hacer esto vara dependiendo en dnde el procedimiento est alojado, ya sea en un formulario, en una clase, o en un mdulo estndar. Procedimientos en formularios Todas las llamadas fuera de un mdulo de formulario deben apuntar al mdulo del formulario que contiene el procedimiento. Si un procedimiento llamado SomeSub est en un formulario llamado Form1, puede llamar este procedimiento ubicado en Form1 usando estas instrucciones: Call Form1.SomeSub(arguments) Procedimientos en mdulos de clases Igual a llamar un procedimiento en un formulario, llamar un procedimiento en un mdulo de clase requiere que la llamada al procedimiento sea calificada con la variable que apunta a la instancia de la clase. Por ejemplo, DemoClass es una instancia de la clase llamada Class1:

85

Dim DemoClass As New Class1 DemoClass.SomeSub Sin embargo, al contrario del formulario, el nombre de la clase no puede ser usado como calificador cuando se haga referencia a la instancia de la clase. La instancia de la clase debe primero ser declarada como una variable objeto (en este caso DemoClass) y referenciada por el nombre de la variable. Procedimientos en mdulos estndar Si un nombre de procedimiento es nico, no necesita incluir el nombre del mdulo en la llamada. Una llamada desde dentro o desde fuera del mdulo se referir a ese nico procedimiento. Un procedimiento es nico si aparece solamente en un sitio. Si dos o ms mdulos contienen un procedimiento con el mismo nombre, necesita calificarlos con el nombre del mdulo. Una llamada a un procedimiento comn desde el mismo mdulo ejecuta el procedimiento en ese mdulo. Por ejemplo, con un procedimiento llamado CommonName en Modulo1 y Modulo2, una llamada a CommonName desde Modulo2 ejecutar el procedimiento CommonName del Modulo2, no el CommonName del Modulo1. Una llamada a un nombre de procedimiento comn desde otro mdulo, deber especificar el nombre del mdulo involucrado. Por ejemplo, si desea llamar el procedimiento CommonName en Modulo2, desde Modulo1, use: Module2.CommonName(arguments) Pasando argumentos a procedimientos Usualmente el cdigo en un procedimiento necesita alguna informacin acerca del estado del programa para hacer su trabajo. Esta informacin consiste de variables pasadas al procedimiento cuando este es llamado. Cuando una variable es pasada a un procedimiento es llamada argumento. Tipos de datos en los argumentos Por defecto los argumentos que se escriben para procedimientos tienen el tipo de dato Variant. Sin embargo, puede declarar otro tipos de datos para los argumentos. Por ejemplo, la siguiente funcin acepta una cadena y un entero: Function WhatsForLunch(WeekDay As String, Hour As Integer) As String regresa el menu de almuerzo basado en el dia y la hora: If WeekDay=Viernes then WhatsForLunch=Pescado Else WhatsForLunch=Pollo End If If Hour>4 then WhatsForLunch=Demasiado Tarde. End Function Pasando argumentos por valor Solamente una copia de la variable es pasada cuando un argumento es pasado por valor. Si el procedimiento cambia el valor, el cambio afecta solamente la copia y no la propia variable. Use la palabra ByVal para indicar un argumento pasado por valor. Por ejemplo: Sub PostAccounts(ByVal intAcctNum as Integer) . . site aqu las instrucciones . End Sub

86

Pasando argumentos por referencia Pasar argumentos por referencia le da al procedimiento acceso al contenido actual de la variable en su localizacin direccin de memoria. Como resultado, el valor de la variable puede ser permanentemente cambiado por el procedimiento al cual es pasado. El paso por referencia es el valor por defecto en Visual Basic. Si especifica un tipo de dato de un argumento pasado por referencia, debe pasar un valor de este tipo para el argumento. Visual Basic evala una expresin y la pasa, como el tipo de dato requerido, si puede. La forma ms simple para convertir una variable dentro de una expresin es englobarla entre parntesis. Por ejemplo, para pasar una variable declarada como entero, a un procedimiento que espera una cadena como argumento, debe hacer lo siguiente: Sub CallingProcedure ( ) Dim intX As Integer intX = 12 * 3 Foo(intX) End Sub Sub Foo(Bar As String) MsgBox Bar el valor de Bar es la cadena 36 End Sub

Traduccin: Derechos de Autor: RBsoftware (2001) Domingo, 15 de abril 2001. 00:11am. Archivo: Traduccin VB9.

Introduccin a Estructuras de Control Las estructuras de control permiten controlar el flujo de la ejecucin del programa. Si no se usan dentro del programa instrucciones de estructuras de control, la lgica del programa fluir de a travs de las instrucciones de izquierda a derecha, y de arriba hacia abajo. Aunque algunos programas simples pueden escribirse con este flujo unidireccional, adems que cierto flujo puede ser controlado a travs del uso de operadores para regular la precedencia de operaciones, la mayora del poder y utilidad de cualquier lenguaje de programacin proviene de su habilidad para cambiar el orden en que se ejecutan sus instrucciones a travs de estructuras y bucles. Estructuras de decisin Los procedimientos Visual Basic pueden probar condiciones y despus, dependiendo de los resultados obtenidos en estas pruebas, ejecutar diferentes operaciones. Las estructuras de decisin que soporta Visual Basic incluye: If...Then If...Then...Else Select Case IfThen Use la estructura IfThen para ejecutar una o ms declaraciones condicionalmente. Puede usar ya sea sintaxis de una lnea o sintaxis de un bloque de lneas mltiples. Sintaxis de una lnea: If condicin Then declaracin

87

Sintaxis de un bloque de lneas mltiples: If condicin Then declaraciones End If La condicin es usualmente una comparacin, pero puede ser cualquier expresin que evale un valor numrico. Visual Basic interpreta este valor como verdadero o falso; un valor numrico cero es falso, y cualquier valor numrico no cero es considerado verdadero. Si la condicin es verdadera, Visual Basic ejecuta todas las declaraciones que aparecen despus de la palabra Then. Puede usar cualquiera, ya sean la sintaxis de una lnea, o la sintaxis de mltiples lneas, para ejecutar una sola declaracin condicionalmente. Los dos ejemplos que siguen son equivalentes: If anyDate<Now Then anyDate=Now If anyDate<Now Then anyDate=Now End If Observe que la sintaxis de una lnea no usa la declaracin End If. Si desea ejecutar ms de una lnea de cdigo cuando la condicin sea verdadera, debe utilizar la sintaxis de lneas mltiples, y en este caso finalizar la estructura con una lnea End If. Por ejemplo: If anyDate<Now Then anyDate=Now Timer1.Enabled=False desactiva el control de tiempo. End If IfThenElse Use la estrctura IfThenElse para definir diversos bloques de declaraciones, de los cuales uno se ejecutar: If condicin1 Then [declaracinBloque1] [ElseIf condicin 2 Then [declaracinBloque2]] ... [Else [declaracinBloqueN]] End If Visual Basic primero comprueba condicin1. Si es falsa, Visual Basic procede a comprobar la condicin2, y as, sucesivamente, hasta encontrar una condicin verdadera. Cuando encuentra una condicin verdadera, Visual Basic ejecuta el correspondiente bloque de declaraciones y despus ejecuta el cdigo que se encuentre despus del End If. Como opcin, puede incluir un bloque de declaraciones Else, que Visual Basic ejecuta si ninguna de las condiciones es verdadera. If...Then...ElseIf es realmente un caso especial de If...Then...Else. Observe que puede tener cualquier nmero de clusulas ElseIf, o del todo ninguna. Puede incluir una clusula Else sin importar que tenga clusulas ElseIf. Por ejemplo, su aplicacin puede ejecutar diferentes acciones dependiendo del control a que se de clic en un men de arreglo de controles: Private Sub mnuCut_Click (Index As Integer) If Index=0 Then Comando Cut CopyActiveControl llama un procedimiento general. ClearActiveControl ElseIf Index=1 Then Comando Copy. CopyActiveControl ElseIf Index=2 Then Comando Clear ClearActiveControl Else

88

PasteActiveControl End If Note que siempre puede agregar ms bloques ElseIf a su estructura If...Then. Sin embargo, esta sintaxis puede ser de escritura tediosa cuando cada ElseIf compare la misma expresin a un valor diferente. Para esta situacin es mejor usar la estructura Select Case. Select Case Visual Basic proporciona la estructura Select Case como una alternativa a la estructura If...Then...Else para selectivamente ejecutar un bloque de declaraciones entre mltiples bloques de instrucciones. La declaracin Select Case proporciona similar capacidad que la declaracin If...Then...Else pero aquella hace que el cdigo tenga lectura ms clara cuando existan diversas opciones. Una estructura Select Case trabaja con una sencilla expresin de comprobacin que es evaluada una vez, al comienzo de la estructura. Visual Basic despus compara el resultado de esta expresin con los valores por cada caso en la estructura. Si existe una igualdad, entonces se ejecuta el bloque de declaraciones asociados con ese caso: Select Case TestExpresion [Case ExpressionList1 [StatementBlock1]] [Case ExpressionList2 [StatementBlock2]] . . [Case Else [StatementBlockN]] End Select Cada ExpressionList es una lista de uno o ms valores. Si existe ms de un valor en una lista sencilla, los valores son separados por comas. Cada StatementBlock contiene cero o ms declaraciones. Si ms de un caso cumple las expresiones de comprobacin, solamente las declaraciones del bloque asociado con el primer caso encontrado se ejecuta. Visual Basic ejecuta las declaraciones en la clusula Case Else (la cual es opcional) si ninguno de los valores en las listas de expresin cumple con la expresin de comprobacin. Por ejemplo, supngase que agrega otro comando al men Edit en el ejemplo If...Then...Else. Puede agregar otra clusula ElseIf, o puede escribir la funcin con Select Case: Private Sub mnuCut_Clic (Index As Integer) Select Case Index Case 0 Comando Cut. CopyActiveControl llama a procedimiento general ClearActiveControl Case 1 Comando Copy. CopyActiveControl Case 2 Comando Clear. ClearActiveControl Case 3 Comando Paste. PasteActiveControl Case Else FrmFind.Show muestra la caja de dilogo Find. End Select End Sub Note que la estructura Select Case evala una expresin a la cabeza de la estructura, en cambio la estructura If...Then...Else puede evaluar una expresin diferente por cada declaracin ElseIf. Puede reemplazar una estructura If...Then...Else por una estructura Select Case solamente si la declaracin If y cada declaracin ElseIf evala la misma expresin.

89

Estructuras de Bucles Las estructuras de bucles le permiten ejecutar una o ms lneas de cdigo en forma repetitiva. Las estructuras de bucle que soporta Visual Basic incluyen: Do...Loop For...Next For EachNext DoLoop Use Do...Loop para ejecutar un bloque de declaraciones en un indefinido nmero de veces. Existen muchas variaciones de las declaraciones Do...Loop, pero cada una evala una condicin numrica para determinar si la ejecucin continuar. Al igual que If...Then, la condicin deber ser un valor o expresin que evale falso (cero) o verdadero (no cero). En el siguiente Do...Loop, las instrucciones se ejecutan mientras la condicin es verdadera: Do While condicin Instrucciones Loop Cuando Visual Basic ejecuta este Do...Loop, primero comprueba la condicin. Si la condicin es falsa (cero), se salta todas las instrucciones. Si es verdadera (no cero), Visual Basic ejecuta las instrucciones y regresa a la declaracin Do While y de nuevo comprueba la condicin. En consecuencia, el bucle puede ejecutarse cualquier nmero de veces, mientras la condicin sea no cero o verdadera. Las instrucciones nunca se ejecutan si la condicin inicialmente es falsa. Por ejemplo, el procedimiento que sigue a continuacin cuenta las veces que un carcter exista dentro de una cadena ejecutando el bucle tantas veces como el carcter exista: Function CountStrings (longstring, target) Dim position, count position=1 Do While InStr(position, longstring, target) position=InStr(position, longstring, target) + 1 count=count+1 Loop CountStrings=count End Function Si el carcter no existe en la cadena, la instruccin InStr retorna cero, y el bucle no se ejecuta. Otra variacin de la instruccin Do...Loop ejecuta las instrucciones primero y despus comprueba la condicin, despus de cada ejecucin. Esta variacin garantiza al menos una ejecucin de las instrucciones: Do instrucciones Loop While condicin Otras dos variaciones que son anlogas a las dos primeras, excepto que ellas ejecutan el bucle mientras la condicin sea falsa en vez de verdadera. Bucle cero o ms veces Do Until condicin instrucciones Loop Al menos un bucle Do instrucciones Loop Until condicin

ForNext Los bucles DoLoop funcionan bien cuando no sabe cuantas veces necesita ejecutar las instrucciones dentro del bucle. Sin embargo, cuando sabe el nmero especfico de veces que se debe ejecutar un bucle, la

90

instruccin For...Next es una mejor opcin. Al contrario del Do...Loop, el bucle For...Next usa una variable, llamado contador, que incrementa o disminuye su valor durante cada repeticin del bucle. La sintaxis es: For counter=start To end [Step increment] instrucciones Next [counter] Los argumentos counter, start, end e increment son numricos todos. Nota: El argumento increment puede ser positivo o negativo. Si increment es positivo, start debe ser menor o igual que end o las instrucciones en el bloque no se ejecutarn. Si increment es negativo, start deber ser mayor o igual que end para que el cuerpo del bucle se ejecute. Si no se usa Step, el incremento por defecto ser uno. Cuando Visual Basic ejecuta el bucle For...Next hace lo siguiente: 1. Establece counter igual a start. 2. Comprueba si counter es mayor que end. Si lo es, Visual Basic se sale del bucle. (Si increment es negativo, Visual Basic comprueba si counter es menor que end.) 3. Ejecuta las instrucciones. 4. Incrementa counter en uno o segn increment, si este es especificado. 5. Repite los pasos 2 a 4. El cdigo que sigue a continuacin imprime todas las fuentes de pantalla disponibles: Private Sub Form_Click ( ) Dim I As Integer For I=0 To Screen.FontCount Print Screen.Fonts(I) Next End Sub For EachNext Un bucle For EachNext es similar a un bucle ForNext, pero este repite un grupo de instrucciones por cada elemento en una coleccin de objetos o en un arreglo en vez de repetir las instrucciones en un especificado nmero de veces. Esto es especialmente til si no se sabe cuntos elementos existen en la coleccin. La sintaxis del bucle For Each...Next es la siguiente: For Each element In group instrucciones Next element Por ejemplo, el siguiente procedimiento Sub abre la base de datos Biblio.mdb y agrega el nombre de cada tabla a una caja de lista: Sub ListTableDefs( ) Dim objDb As Database Set objDb=OpenDatabase(c:\vb\biblio.mdb, True, False) For Each TableDef In objDb.TableDefs( ) List1.AddItem TableDef.Name Next TableDef End Sub Mantenga en mente las siguientes instrucciones cuando use el bucle For Each...Next: Para las colecciones, element puede solamente ser una variable Variant, una variable de objeto genrico, o un objeto listado en el Object Browser. Para los arreglos, element puede solamente ser una variable Variant.

91

No puede usar el bucle For Each...Next con un arreglo de tipo definido por el usuario en vista que Variant no puede contener un tipo definido por el usuario.

Trabajando con estructuras de control Puede situar estructuras de control dentro de otras estructuras de control (tal como un bloque If...Then dentro de un bucle For...Next). Una estructura de control situada dentro de otra estructura de control se dice que est anidada. Las estructuras de control en Visual Basic pueden estar anidadas en tantos niveles como lo desee. Es prctica comn hacer que las estructuras de decisin anidadas y las estructuras de bucle sean ms lebles dndoles margen al cuerpo de la estructura de decisin o bucle. Por ejemplo, este procedimiento imprime todos los nombres de fuentes que son comunes tanto para pantalla como para impresora: Private Sub Form_Clic ( ) Dim Sfont, Pfont For Each Sfont In Screen.Fonts( ) For Each Pfont In Printer.Fonts( ) If Sfont=Pfont Then Print Sfont End If Next Pfont Next Sfont End Sub Observe que el primer Next cierra el bucle For Loop ms interno y el ltimo For cierra el For Loop externo. De igual forma, en instrucciones anidadas, la instruccin End If automticamente se aplica a la ms cercana instruccin If. Los bucles Do...Loop anidados trabajan en forma similar: la declaracin Loop ms interna hacindose equivalente con la declaracin Do ms interna. Saliendo de una estructura de control La declaracin Exit permite salirse en forma directa de los bucles For, Do, procedimientos Sub, y procedimientos de funcin. La sintaxis de la declaracin Exit es simple: Exit For puede aparecer tantas veces como sean necesarias dentro de un bucle For; y Exit Do puede aparecer las veces que se desee dentro de bucle Do. Por ejemplo: For counter = start To end [Step increment] [bloque de instrucciones] [Exit For] [bloque de instrucciones] Next [counter [, counter] [...]] Do [While | Until condition ] [bloque de instrucciones] [Exit Do] [bloque de instrucciones] Loop La declaracin Exit Do funciona con cualquiera de las versiones de la sintaxis Do Loop. Exit For y Exit Do son tiles en vista de que algunas veces es apropiado terminar un bucle en forma inmediata, sin necesidad de tener que efectuar ms iteraciones o instrucciones dentro del bucle. Por ejemplo, en el caso antes visto relacionado con la condicin de que se impriman las fuentes solamente que existan estas tanto a nivel de pantalla como de impresora, en esta estructura, a pesar de que se ha encontrado la fuente que sirve tanto para pantalla como para impresora, el bucle contina buscando ms parejas; una versin ms eficiente sera concluir el trabajo en cuanto se encuentre la primera pareja. El siguiente cdigo hara esto: Private Sub Form_Click ( )

92

Dim Sfont, Pfont For Each Sfont In Screen.Fonts ( ) For Each Pfont In Printer.Fonts ( ) If Sfont=Pfont Then Print Sfont Exit For sale del bucle interior End If Next Pfont Next Sfont End Sub Como lo ilustra el ejemplo, la declaracin Exit casi siempre aparece dentro de una declaracin If o de una declaracin Select Case anidadas dentro del bucle. Cuando usa la declaracin Exit para romper la frecuencia cclica del bucle, el valor de la variable del contador (counter) vara, dependiendo de cmo haya abandonado el bucle: Cuando se completa el bucle, la variable contador contiene el valor de la frontera superior ms Step. Cuando aborta un bucle en forma prematura, la variable contador retiene su valor sujeto a las usuales reglas sobre alcance. Cuando la iteracin est fuera del final de la coleccin, la variable contador contiene Nothing si es un tipo de datos objeto; o contiene Empty si es un tipo de datos Variant. Saliendo de un procedimiento sub o procedimiento de funcin Puede tambin salirse de un procedimiento dentro de una estructura de control. La sintaxis de Exit Sub y de Exit Function es similar que Exit For y Exit Do vistos en la seccin previa. Exit Sub puede aparecer tantas veces como sea necesario, en cualquier lado dentro del cuerpo del procedimiento sub. Exit Function puede aparecer las veces como sea necesario, en cualquier lado dentro del cuerpo del procedimiento de funcin. Exit Sub y Exit Function son tiles cuando el procedimiento ha hecho todo lo que ha necesitado hacer y ahora debe salirse del ciclo. Por ejemplo, si desea cambiar el ejemplo anterior para imprimir la primer pareja de fuentes que sean comunes a pantalla e impresora, podra usar el siguiente procedimiento que usa Exit Sub: Private Sub Form_Click ( ) Dim Sfont, Pfont For Each Sfont In Screen.Fonts ( ) For Each Pfont In Printer.Fonts ( ) If Sfont=Pfont Then Print Sfont Exit Sub sale del procedimiento End If Next Pfont Next Sfont End Sub Traduccin: Derechos de Autor: RBsoftware (2001) Lunes, 16 de abril 2001. 01:12pm. Archivo: Traduccin VB10.

Trabajando con objetos Cuando crea una aplicacin en Visual Basic, trabaja con objetos. Puede usar objetos proporcionados por Visual Basic, tales como controles, formularios, y objetos para acceso de datos. Puede tambin controlar los

93

objetos de otras aplicaciones desde dentro de su aplicacin Visual Basic. Puede incluso crear sus propios objetos, y definir propiedades adicionales y mtodos para ellos. Qu es un objeto? Un objeto es una combinacin de cdigo y datos que puede ser tratado como una unidad. Un objeto puede ser una pieza de una aplicacin, tal como un control o un formulario. Una entera aplicacin puede incluso ser un objeto. La siguiente tabla describe ejemplos de los tipos de objetos que puede usar en Visual Basic. Ejemplo Descripcin CommandButton Controles sobre un formulario, tales como botones de comando y frames, son objetos. Form Cada formulario en un proyecto Visual Basic es un objeto separado. Database Las bases de datos son objetos, y contienen otros objetos, tales como campos e ndices. Chart Un grfico en Microsoft Excel es un objeto. De dnde provienen los objetos? Cada objeto en Visual Basic es definido por una clase. Para entender la relacin entre un objeto y su clase, piense en los cortes de una galleta y las galletas. El corte de la galleta es la clase, define las caractersticas de cada galleta, por ejemplo, tamao y forma. Las clases son usadas para crear objetos. Los objetos son las galletas. Dos ejemplos de la relacin entre clases y objetos hacen esto ms claro: Los controles en la caja de herramientas representan las clases. El objeto conocido como control no existe hasta que lo dibuja sobre el formulario. Cuando crea un control, est creando una copia o instancia de la clase del control. La instancia de la clase es el objeto a que se refiere en su aplicacin. El formulario con el que trabaja en tiempo de diseo es una clase. En tiempo de ejecucin, Visual Basic crea una instancia de la clase del formulario. Todos los objetos son creados como idnticas copias de sus clases. Una vez que ellos existen como objetos individuales, sus propiedades pueden ser cambiadas. Por ejemplo, si dibuja tres botones de comando sobre un formulario, cada botn de comando es una instancia de la clase del botn de comando. Cada objeto comparte un juego comn de caractersticas y capacidades (propiedades, mtodos y eventos), definidos por la clase. Sin embargo, cada uno tiene su propio nombre, puede ser en forma separada activado y desactivado, puede ser ubicado en lugares diferentes en el formulario, y as, sucesivamente. Qu puede hacer con objetos? Un objeto proporciona cdigo que no tiene que escribir. Por ejemplo, puede crear sus propias cajas de dilogo para abrir y guardar archivos, pero no necesita hacerlo, pues puede usar el control common dialog, que es un objeto proporcionado por Visual Basic. Puede crear su propio cdigo de manejo de recursos y agenda, pero no necesita hacerlo, pues puede usar los objetos Calendar, Resources y Task, que son objetos proporcionados por Microsoft Project. Visual Basic puede combinar objetos de otras fuentes Visual Basic proporciona las herramientas para permitirle combinar objetos de diferentes fuentes. Puede ahora construir soluciones que combinan las ms poderosas caractersticas de Visual Basic y las aplicaciones que soportan Automation, que es un estndar en la industria usado para aplicaciones para exponer a los objetos a las herramientas de desarrollo y otras aplicaciones. Ahora puede construir aplicaciones ligando controles intrnsecos a Visual Basic y puede tambin usar objetos proporcionados por otras aplicaciones. Considere que puede situar los siguientes objetos en un formulario Visual Basic: Un objeto grfico de Microsoft Excel Chart. Un objeto de hoja de trabajo de Microsoft Excel Worksheet. Un objeto del procesador de palabras de Microsoft Word. Puede usar estos objetos para producir una aplicacin, ahorrndole tiempo, ya que no necesita escribir cdigo para reproducir la funcionalidad que proporcionan los objetos Word y Excel de Microsoft.

94

Las bases para trabajar con objetos Los objetos Visual Basic aceptan propiedades, mtodos y eventos. En Visual Basic, los datos de un objeto (sus atributos) son llamados propiedades, mientras que los procedimientos que pueden operar sobre el objeto son llamados mtodos. Un evento es una accin reconocida por un objeto, tales como dar clic, o pulsar una tecla, y puede escribir cdigo para que responda a este evento. Cambia las caractersticas de un objeto cambiando sus propiedades. Por ejemplo, un radio: una de sus propiedades es el volumen. En Visual Basic dir que un radio tiene la propiedad volumen que puede ajustarse cambiando su valor. Asuma que se establece el volumen del radio de 0 a 10. Podra controlar el radio con Visual Basic escribiendo cdigo en un procedimiento que cambie la propiedad volumen de 3 a 5 para hacer que la radio suene ms alto: Radio.Volume=5 Adicional a las propiedades, los objetos tienen mtodos. Los mtodos son parte de los objetos, igual a como lo son las propiedades. Generalmente, los mtodos son acciones que desea ejecutar, mientras que las propiedades son atributos que puede establecer o recuperar. Por ejemplo, digita un nmero de telfono para hacer una llamada. Puede decir que el telfono tiene el mtodo digitar, y puede usar esta sintaxis para digitar un nmero de telfono de siete dgitos: 5551111: Phone.Dial 5551111 Los objetos tienen tambin eventos. Los eventos son disparados cuando algn aspecto del objeto ha cambiado. Por ejemplo, un radio puede tener un evento CambioDeVolumen. Un telfono tiene un evento ring. Controlando eventos con sus propiedades Las propiedades individuales varan como cuando establece o recupera sus valores. Algunas propiedades pueden establecerse en tiempo de diseo. Puede usar la ventana de propiedades para establecer estas propiedades sin tener necesidad de escribir cdigo del todo. Algunas propiedades no estn disponibles en tiempo de diseo, por tanto, debe escribir cdigo para establecer estas propiedades en tiempo de ejecucin. Las propiedades que puede establecer y recuperar en tiempo de ejecucin son llamadas propiedades de lectura escritura. Las propiedades que solamente puede leer en tiempo de ejecucin son llamadas propiedades de solo lectura. Estableciendo valor a las propiedades Establece valor a una propiedad cuando desea cambiar la apariencia o comportamiento de un objeto. Por ejemplo, cambia la propiedad Text de un control TextBox para cambiar el contenido de la caja de texto. Para establecer el valor de una propiedad, use la siguiente sintaxis: Object.property = expresin Las instrucciones siguientes demuestran como establecer las propiedades: Text1.Top = 200 establece la propiedad Top a 200 twips. Text1.Visible = True despliega la caja de texto. Text1.Text = Hola despliega Hola en la caja de texto. Obteniendo valor de las propiedades Obtiene el valor de una propiedad cuando desea encontrar el estado de un objeto antes de que su cdigo ejecute acciones adicionales (tales como asignando el valor a otro objeto). Por ejemplo, puede desear obtener el valor de la propiedad Text de un control TextBox para determinar el contenido de la caja de texto antes de ejecutar cdigo que cambie el valor. En la mayora de los casos, para obtener el valor de una propiedad, usa la siguiente sintaxis: Variable = Object.property

95

Puede tambin obtener el valor de una propiedad como parte de una ms compleja expresin, sin necesidad de asignar la propiedad a una variable. En el siguiente ejemplo, la propiedad Top de un nuevo miembro de un arreglo de controles es calculada como la propiedad Top del miembro previo, ms 400: Private Sub cmdAdd_Clic ( ) optButton(n).Top = optButton(n-1).Top + 400 End Sub Tip: Si usar el valor de una propiedad ms de una vez, el cdigo funciona con ms rapidez si almacena el valor en una variable. Ejecutando acciones con mtodos Los mtodos pueden afectar los valores de las propiedades. Por ejemplo, en la analoga del radio, el mtodo SetVolume cambia la propiedad Volume. De forma similar, en Visual Basic, las ListBoxes tienen una propiedad List, que puede ser cambiada con los mtodos Clear y AddItem. Usando mtodos en cdigo Cuando usa un mtodo en cdigo, cmo escriba una declaracin depende de la cantidad de argumentos que requiera el mtodo, y si el mtodo regresa un valor. Cuando un mtodo no toma argumentos, escribe el cdigo usando la siguiente sintaxis: Object.method En el ejemplo que sigue a continuacin, el mtodo Refresh repinta el control PictureBox: Picture1.Refresh obliga a que el control se vuelva a dibujar. Algunos mtodos, como el mtodo Refresh, no tienen argumentos, y no retornan valores. Si el mtodo requiere ms de un argumento, separa los argumentos con una coma. Por ejemplo, el mtodo Circle usa argumentos especificando la localizacin, el radio, y el color de un crculo sobre un formulario: dibuja un crculo azul con 1200 twips de radio: Form1.Circle (1600, 1800) , 1200, vbBlue Si guarda el valor retornado por un mtodo, debe encerrar los argumentos entre parntesis. Por ejemplo, el mtodo GetData regresa una imagen ubicada en el Clipboard: Picture = Clipboard.GetData (vbCFBitmap) Si no existe valor de retorno, el argumento aparece sin parntesis. Por ejemplo, el mtodo AddItem no regresa un valor: List1.AddItem YourName agrega el texto your name a un ListBox. Como se relacionan los objetos? Cuando coloca dos botones de comando sobre un formulario, ellos son dos objetos separados establecidos con propiedad y nombres distintos (command1 y command2), pero ellos comparten la misma clase: CommandButton. Tambin comparten la caracterstica de que ellos estn en el mismo formulario. Anteriormente se explic que un control sobre el formulario implica que el control est contenido en el formulario. Esto ubica a los controles en una jerarqua. Para referirse a un control, debe primero referirse al formulario, de la misma manera que debe teclear el cdigo de ciudad antes de teclear un nmero de telfono en particular. Los dos botones de comando tambin comparten la caracterstica de que ellos son controles. Todos los controles tienen caractersticas comunes que los hacen diferentes de formularios y otros objetos en el ambiente de Visual Basic. Las siguientes secciones explican cmo Visual Basic usa las colecciones para agrupar objetos que son relacionados.

96

Jerarquas de objetos La jerarqua de un objeto proporciona la organizacin que determina como los objetos se relacionan entre ellos, y como puede acceder a ellos. En muchos casos no necesita preocuparse por la jerarqua de objetos en Visual Basic, sin embargo: Cuando manipula objetos de otra aplicacin, debe familiarizarse con la jerarqua de objetos de esa aplicacin. Cuando trabaje con objetos de acceso de datos, debe estar familiarizado con la jerarqua objeto de acceso de datos. Existen algunos casos comunes en Visual Basic donde un objeto contiene otros. Estos son descritos en las secciones siguientes. Trabajando con colecciones de objetos Las colecciones de objetos tienen sus propias propiedades y mtodos. Los objetos en una coleccin de objetos son referidos como miembros de una coleccin. Cada miembro de la coleccin es numerado, comenzando de cero; este es el nmero de ndice del miembro. Por ejemplo, la coleccin de controles contiene todos los controles de un formulario, de forma que puede usar la coleccin para simplificar el cdigo si necesita ejecutar la misma operacin sobre todos los objetos de la coleccin. Por ejemplo, el siguiente cdigo se pasea a travs de la coleccin de controles y lista cada uno de los nombres de los miembros en un control ListBox: For Each Control In Form1.Controls por cada control agregue su nombre a la ListBox: List1.AddItem Control.Name Next Control Aplicando propiedades y mtodos a los miembros de la coleccin Existen dos tcnicas generales que puede usar para ubicar la direccin de un miembro en un objeto coleccin: Especificar el nombre del miembro. Las siguientes expresiones son equivalentes: Controls(List1) Controls!List1 Usar el nmero de ndice del miembro: Controls(3) Una vez en capacidad de acceder a todos los miembro en forma colectiva, o un solo miembro en forma individual, puede aplicar propiedades y mtodos usando cualquiera de los siguientes procedimientos: establezca la propiedad Top del control ListBox a 200: Controls!List1.Top = 200 o For Each Control In Form1.Controls( ) establezca la propiedad Top de cada miembro en 200: Control.Top = 200 Next Control Objetos que contiene otros objetos Algunos objetos en Visual Basic contienen otros objetos. Por ejemplo, un formulario contiene uno o ms controles. La ventaja de tener objetos como contenedores de otros objetos es que se puede referir al contenedor en su cdigo para aclarar qu objeto desea usar. Por ejemplo, si existen dos formularios, uno llamado frmEntradas y otro frmSalidas, y ambos tienen un Listbox llamado lstNumCta, puede especificar exactamente cual de ellos desea usar refirindose al formulario que contiene el Listbox: frmEntradas.lstNumCta.AddItem 1201 o frmSalidas.lstNumCta.AddItem 1201

97

Colecciones comunes en Visual Basic Existen algunos casos comunes en Visual Basic donde un objeto contiene otros objetos. La siguiente tabla describe brevemente las colecciones ms comnmente usadas en Visual Basic: Coleccin Descripcin Forms Contiene formularios cargados. Controls Contiene controles del formulario. Printers Contiene los objetos Printer disponibles. Tambin puede Usted implementar contenedores de objetos en Visual Basic. La propiedad Container Puede usar la propiedad Container para cambiar el contenedor del objeto dentro de un formulario. Los siguientes controles pueden contener otros controles: Frame Picture Box ToolBar El ejemplo que sigue a continuacin muestra el movimiento de un botn de comando de contenedor a contenedor sobre un formulario. Abra un nuevo proyecto, y dibuje un control Frame, un control Picture Box, y un botn de comando, sobre un formulario. El siguiente cdigo en el evento click del formulario incrementa una variable contador, y utiliza el bucle Select Case para rotar el botn de comando de contenedor a contenedor. Private Sub Form_Click Static intX As Integer Select Case intX Case 0 Set Command1.Container = Picture1 Command1.Top = 0 Command1.Left = 0 Case 1 Set Command1.Container = Frame1 Commnad1.Top = 0 Command1.Left = 0 Case 2 Set Command1.Container = Form1 Command1.Top = 0 Command1.Left = 0 End Select IntX = intX + 1 End Sub Comunicacin entre objetos Adems de usar y crear objetos con Visual Basic, puede comunicarse con otras aplicaciones y manipular sus objetos desde dentro de su aplicacin. La habilidad para compartir datos entre aplicaciones es una de las caractersticas principales del sistema operativo de Windows de Microsoft. Con Visual Basic tiene gran flexibilidad en la forma de cmo puede comunicarse con otras aplicaciones. Creacin de objetos La forma ms fcil para crear un objeto es dndole doble clic al control en la caja de herramientas. Sin embargo, para obtener el beneficio pleno de todos los objetos disponibles en Visual Basic y otras aplicaciones, puede usar las caractersticas de programacin de Visual Basic para crear objetos en tiempo de ejecucin. Puede crear referencias a un objeto con variables objeto. Puede crear sus propios objetos, desde cero, con los mdulos de clases.

98

Puede crear sus propias colecciones con el objeto Collection.

Usando las variables objeto Adems de almacenar valores, una variable puede crear una referencia a un objeto. Asigna un objeto a una variable por las mismas razones que asigna cualquier valor a una variable: Los nombres de variable son a menudo ms cortos y fcil de recordar que los valores que ellas contienen (o, en este caso, los objetos que ellas refieren.) Las variables pueden ser cambiadas para referirse a otros objetos al mismo tiempo que el cdigo se est ejecutando. Referirse a una variable que contiene un objeto es ms eficiente que referirse repetidamente al objeto mismo. El uso de una variable objeto es similar al uso de variables convencionales, pero con un paso adicional. Para asignar un objeto a una variable: Primero la declara: Dim variable As class Despus asigna un objeto a ella: Set variable = object Declarando variables objeto Declara una variable objeto de la misma forma que declara otras variables, con Dim, ReDim, Static, Private, o Public. La nica diferencia es la palabra New y el argumento Class. La sintaxis es: {Dim | ReDim | Static | Private | Public } variable As [New] class Por ejemplo, puede declarar una variable objeto que se refiera a un formulario en la aplicacin llamado frmMain: Dim FormVar As New frmMain declara una variable objeto de tipo frmMain. Puede declarar una variable objeto que se refiera a cualquier formulario en la aplicacin: Dim anyForm As Form variable formulario genrica. De igual manera, puede declarar una variable objeto que pueda referirse a cualquier caja de texto en su aplicacin: Dim anyText As TextBox puede referirse a cualquier TextBox. Puede tambin declarar una variable objeto que pueda referirse a un control de cualquier tipo: Dim anyControl As Control variable de control genrica. Observe que puede declarar una variable de formulario para referirse a un formulario especfico en la aplicacin, pero no puede declarar una variable de control para referirse a un control en particular. Puede declarar una variable de control para referirse a un tipo especfico de control (tales como TextBox o ListBox) pero no a ningn control en particular de ese tipo (tales como txtEntrada o List1). Sin embargo, puede asignar un control en particular a una variable de ese tipo. Por ejemplo, para un formulario con un ListBox llamado lstSample, podra escribir: Dim objDemo As ListBox Set objDemo = lstSample Asignando variables objeto Puede asignar un objeto a una variable objeto con la declaracin Set: Set variable = object Use la instruccin Set siempre que quiera que una variable objeto se refiera a un objeto. Algunas veces puede usar variables objeto, y particularmente variables de control, simplemente para acortar el cdigo que haya escrito. Por ejemplo, puede escribir cdigo como este:

99

If frmAccountDisplay!txtAccountBalance.Text < 0 Then frmAccountDisplay!txtAccountBalance.BackColor = 0 End If Puede acortar este cdigo de forma significativa si usa una variable de control: Dim Bal As TextBox Set Bal = frmAccountDisplay!txtAccountBalance If Bal.Text < 0 Then Bal.BackColor=0 End If Tipos de objetos especficos y genricos Las variables de objetos especficos se refieren a un tipo especfico de objeto o clase. Una variable especfica de formulario puede referirse solamente a un formulario en la aplicacin (aunque se puede referir de una a muchas instancias de ese formulario). De forma similar, una variable de control especfico puede referirse solamente a un particular tipo de control en su aplicacin, tales como TextBox o ListBox. Para ver un ejemplo, abra un nuevo proyecto y site un TextBox en el formulario. Agregue el siguiente cdigo al formulario: Private Sub Form_Click( ) Dim anyText As TextBox Set anyText = Text1 AnyText.Text=Hola End Sub Active la aplicacin y d clic al formulario. La propiedad Text del TextBox ser cambiada a Hola. Las variables objeto genricas se pueden referir a uno de muchos tipos especficos de objetos. Una variable de formulario genrico, por ejemplo, puede referirse a cualquier formulario en la aplicacin; una variable de control genrico puede referirse a cualquier control de cualquier formulario en la aplicacin. Para ver un ejemplo, abra un nuevo proyecto y site varios controles Frames, Labels, y botones de comando sobre un formulario, en cualquier orden. Agregue el siguiente cdigo al formulario: Private Sub Form_Click ( ) Dim anyControl As Control Set anyControl = Form1.Controls(3) AnyControl.Caption = Hola End Sub Active la aplicacin y d clic al formulario. La propiedad Caption del control que haya situado como tercero en secuencia sobre el formulario cambiar a Hola. Existen cuatro tipos de objetos genricos en Visual Basic: Tipo de Objeto Genrico Objeto Referenciado Cualquier formulario en la aplicacin (incluyendo MDI children y MDI Form form) Control Cualquier control en la aplicacin. MDIform El formulario MDI en la aplicacin (si su aplicacin tiene uno) Object Cualquier objeto. Las variables objeto genricas son tiles cuando no sabe el tipo especfico de objeto que una variable deber referirse en tiempo de ejecucin. Por ejemplo, si desea escribir cdigo que pueda operar sobre cualquier formulario en la aplicacin, deber usar variables de formulario genricas. Nota: En vista de que solamente puede existir un formulario MDI en la aplicacin, no existe necesidad de usar el tipo MDIForm genrico. En vez de ste, puede usar el tipo MDIForm especfico (MDIForm1, o lo que haya especificado en la propiedad Name del formulario MDI) siempre que necesite declarar una variable de formulario que se refiera a un formulario MDI. De hecho, en vista de que Visual Basic puede resolver referencias a propiedades y mtodos de tipos de formularios especficos antes de que active la aplicacin, debe usar siempre el tipo MDIForm especfico.

100

El tipo MDIForm genrico es proporcionado solo para efectos de completamiento; puede ser que futuras versiones de Visual Basic permitan mltiples formularios MDI en una sola aplicacin, lo cual ser til. Formularios como objetos Los formularios son ms a menudo usados para que sirvan de interfase de una aplicacin, pero tambin ellos son objetos que pueden ser llamados por otros mdulos en la aplicacin. Los formularios son parientes cercanos de los mdulos de clases. La mayor diferencia entre ambos es que los formularios pueden ser objetos visibles, mientras que los mdulos de clase no disponen de interfase visible. Agregar mtodos y propiedades particulares Puede agregar mtodos y propiedades particulares a formularios y accederlas desde otros mdulos en su aplicacin. Para crear un nuevo mtodo para un formulario, agregue un procedimiento pblico: mtodo particular en Form1: Public Sub LateJobsCount ( ) Instrucciones End Sub Puede llamar al procedimiento LateJobsCount desde otro mdulo usando esta instruccin: Form1.LateJobsCount La creacin de una nueva propiedad para un formulario puede ser tan simple como declarar una variable pblica en un mdulo de formulario: Public IDNumber As Integer Puede establecer y retornar el valor de IDNumber sobre Form1 desde otro mdulo usando estas dos instrucciones: Form1.IDNumber = 3 Text1.Text = Form1.IDNumber Puede tambin usar procedimientos de propiedades para agregar propiedades particulares a un formulario. Nota: Puede llamar a una variable, a un mtodo particularizado, o establecer una propiedad particular sobre un formulario sin cargar el formulario. Esto permite ejecutar cdigo sobre un formulario sin necesidad de cargarlo en memoria. Tambin, haciendo referencia a un control sin hacer referencia a sus propiedades o mtodos tampoco carga el formulario. Usando la palabra reservada New Use la palabra reservada New para crear un nuevo objeto definido por su clase. Puede usar New para crear instancias de formularios, clases definidas en mdulos de clases, y colecciones. Usando la palabra reservada New con formularios Cada formulario que crea en tiempo de diseo es una clase. La palabra reservada New puede ser usada para crear nuevas instancias de esa clase. Para ver cmo esto trabaja, dibuje un botn de comando y varios controles sobre el formulario. Establezca la propiedad Name del formulario a Sample, en la ventana de propiedades. Agregue el siguiente cdigo al procedimiento de evento click del botn de comando: Dim x As New Sample x.Show Haga funcionar la aplicacin y d clic al botn de comando varias veces. Haga a un lado el formulario ms al frente. En vista que el formulario es una clase con una interfase visible, puede ver las copias adicionales. Cada formulario tiene los mismos controles, en la misma posicin que los tiene el formulario creado en tiempo de diseo. Nota: Para hacer que una variable de formulario y la instancia del formulario cargado persista, use variables Static o Public en vez de variables locales. Puede usar New con la declaracin Set. Coloque el cdigo siguiente en el procedimiento de evento click de un botn de comando: Dim f As Form1

101

Set f = New Form1 f.Caption = Hola f.Show Usar New con la instruccin Set es ms rpido y es el mtodo recomendado. Uso de la palabra reservada New con otros objetos La palabra reservada New puede ser usada para crear colecciones y objetos de clases que define en mdulos de clases. Para que vea como trabaja esto, trate el ejemplo siguiente: Este ejemplo demuestra cmo la palabra reservada New crea instancias de una clase. Abra un nuevo proyecto, y dibuje con botn de comando en Form1. Desde el men Project, seleccione Add Class Module para agregar un mdulo de clase al proyecto. Establezca la propiedad Name del mdulo de clase a ShowMe. El siguiente cdigo en el mdulo Form1 crea una nueva instancia de la clase ShowMe y llama al procedimiento contenido en el mdulo de clase. Public clsNew As ShowMe Private Sub Command1_Click ( ) Set clsNew = New ShowMe clsNew.ShowFrm End Sub El procedimiento ShowFrm en el mdulo de clase crea una nueva instancia de la clase Form1, muestra el formulario, y despus lo minimiza. Sub ShowFrm ( ) Dim frmNew As Form1 Set frmNew = New Form1 frmNew.Show frmNew.WindowState = 1 End Sub Para ver el ejemplo, ejecute la aplicacin, y de clic al botn de comando varias veces. Ver un icono de formulario minimizado aparecer por cada nueva instancia creada de la clase ShowMe. Restricciones de la palabra reservada New La siguiente tabla muestra lo que no puede hacer con la palabra reservada New: No puede usar New para crear Ejemplo de Cdigo no permitido Variables de tipos de datos fundamentales. Dim X As New Integer Variables de cualquier tipo de objeto genrico. Dim X As New Control Variables de cualquier tipo de control especfico. Dim X As New ListBox Variables de cualquier control especfico. Dim X As New lstNames Liberacin de referencias a objetos Cada objeto usa memoria y recursos del sistema. Es una buena prctica de programacin liberar estos recursos cuando ya no se necesite usar el objeto. Use Unload para descargar un formulario o control de memoria. Use Nothing para liberar recursos usados por una variable objeto. Asigne Nothing a una variable objeto con la declaracin Set. Pasando objetos a procedimientos Puede pasar objetos a procedimientos en Visual Basic. En el siguiente ejemplo de cdigo se asume que existe un botn de comando en el formulario: Private Sub Command1_Click ( ) llama al procedimiento Demo y pasa el formulario a l Demo Form1 End Sub Private Sub Demo (x As Form1) centra el formulario en pantalla

102

x.Left = (Screen.Width x.Width ) / 2 End Sub Es tambin posible pasar un objeto a un argumento por referencia y despus, dentro del procedimiento, establecer el argumento a un nuevo objeto. Para ver como funciona esto abra un nuevo proyecto, e inserte un segundo formulario. Site un control PictureBox en cada formulario. La siguiente tabla muestra las propiedades que tendr que establecer: Objeto Propiedad Atributo PictureBox on Name Picture2 Form2 Picture C:\vb\icons\arrows\arw01dn.ico El procedimiento de evento click de Form1 llama al procedimiento GetPicture en Form2, y pasa el PictureBox vaco a l. Private Sub Form_Click ( ) Form2.GetPicture Picture1 End Sub El procedimiento GetPicture en Form2 asigna la propiedad Picture del PictureBox en Form2 al PictureBox vaco en Form1. Private objX As PictureBox Public Sub GetPicture (x As PictureBox) asigna a una variable objeto el PictureBox pasado Set objX = x asigna el valor de la propiedad Picture al PictureBox de Form1 obj.Picture = picture2.Picture End Sub Para ver el ejemplo, ejecute la aplicacin y de clic en Form1. Ver que el icono de Form2 aparece en el PictureBox de Form1. Traduccin: Derechos de Autor: RBsoftware (2001) Martes, 17 de abril 2001. 00:31am. Archivo: Traduccin VB11.

Qu puede hacer con Visual Basic? Una vez que comprende lo bsico para trabajar con Visual Basic, est listo para moverse hacia nuevos y ms grandes desafos. As que, qu puede hacer con Visual Basic? Sera ms apropiado preguntar que es lo que no puede hacerse. La respuesta es: muy poco! Desde el diseo innovador de interfases de usuario hasta tomar ventaja de los objetos de otras aplicaciones, desde la manipulacin de textos y grficos hasta el trabajo con bases de datos, Visual Basic proporciona todas las herramientas que necesita para hacer que su trabajo sea hecho correctamente. Creacin de la interfase de usuario La interfase de usuario es quizs la parte ms importante de una aplicacin; es ciertamente la ms visible. Para los usuarios, la interfase es la aplicacin; a ellos probablemente no les interesa el cdigo que se est ejecutando detrs de la escena. No importa cunto tiempo y esfuerzo invierta en escribir y automatizar su cdigo, el uso prctico de su aplicacin depende de la interfase. Cuando disea una aplicacin, un nmero de decisiones necesitan ser tomadas sin importar la interfase. Debo utilizar un estilo de documento sencillo o de documento mltiple? Cuntos diferentes formularios necesitar? Qu comandos incluirn los mens? Necesitar barras de mens para duplicar las funciones de

103

los mens? Qu y cuntas cajas de dilogo interactuarn con el usuario? Cunta asistencia necesitar proporcionar? Antes de comenzar a disear la interfase del usuario, necesita pensar acerca del propsito de la aplicacin. El diseo de una aplicacin primaria que estar en uso constante debe de ser diferente de aquella que solamente es usada por cortos periodos de tiempo. Una aplicacin con el primordial propsito de desplegar informacin acusa diferentes requerimientos que aquella que se usa para recolectar informacin. La audiencia a la que va dirigida la aplicacin tambin influencia el diseo. Una aplicacin dirigida hacia principiantes demanda simplicidad en su diseo, mientras que si va dirigida para una audiencia de usuarios expertos podra ser ms compleja. Otras aplicaciones usadas por la audiencia pueden afectar sus expectativas sobre el comportamiento de la aplicacin. Y si planea distribuirla internacionalmente, el lenguaje y la cultura debern ser considerados parte de su diseo. El diseo de la interfase de usuario es mejor cuando se aborda como un proceso iterativo ser muy raro que obtenga un diseo perfecto la primera vez. Aunque el diseo de una interfase no es difcil, disear una que amar el usuario no siempre es tan fcil. Este captulo le introduce en el proceso de diseo de una interfase en Visual Basic, proporcionndole una introduccin a las herramientas que necesita para crear una gran aplicacin para sus usuarios. Estilos de interfases Si tiene algn tiempo de estar usando aplicaciones bajo Windows, probablemente habr notado que no todas las interfases de usuario se miran y comportan de la misma forma. Existen dos estilos principales de interfases de usuario: la interfase de documento simple (SDI) y la interfase de documentos mltiples (MDI). Un ejemplo de una interfase SDI es la aplicacin WordPad, incluida con Windows de Microsoft. En WordPad solamente un solo documento puede ser abierto; necesita cerrar este documento para poder abrir otro. Las aplicaciones Excel de Microsoft y Word de Microsoft para Windows son interfases MDI; ellas permiten desplegar mltiples documentos al mismo tiempo, con cada documento desplegado en su propia ventana. Puede reconocer una aplicacin MDI por la inclusin de una ventana de men con sub mens para cambiar entre ventanas o documentos. Para determinar cual estilo de interfase es mejor, necesitar ver cual es el propsito de la aplicacin. Una aplicacin para procesar reclamos de seguro pueda conducir hacia el estilo MDI un dependiente puede estar trabajando en ms de un reclamo al mismo tiempo o puede necesitar comparar dos reclamos. Por otro lado, una aplicacin de calendario puede mejor ubicarse en el estilo SDI no ser conveniente que tenga abierto ms de un calendario al mismo tiempo; y si ocurre el raro evento de que lo necesite podra abrir una segunda instancia de la aplicacin SDI. El estilo SDI es el ms comn; la mayora de los ejemplos en esta Gua del Programador asumen aplicaciones SDI. Adicionalmente a los dos estilos ms comunes de interfases, SDI y MDI, un tercer estilo de interfase est convirtindose en ms popular: la interfase tipo explorador. La interfase tipo explorador es una sola ventana conteniendo dos hojas o regiones, usualmente consistiendo de un rbol o vista jerrquica a la izquierda y un rea de despliegue a la derecha, tal como en el Explorador de Windows de Microsoft. Este tipo de estilo de interfase permite la navegacin o hojear grandes cantidades de documentos, imgenes, o archivos. Adems de los ejemplos de aplicaciones SDI y MDI que acompaan este captulo, el Application Wizard proporciona un buen medio para comparar los diferentes estilos de interfase. Puede usar el Wizard para generar un ejemplo de cada estilo y ver los formularios y cdigo que genera. Aplicaciones de interfases de documentos mltiples (MDI) La interfase de documentos mltiples le permite crear una aplicacin que mantiene mltiples formularios en un formulario contenedor. Aplicaciones tales como Excel de Microsoft y Word para Windows de Microsoft tienen interfases de documentos mltiples.

104

Una aplicacin MDI permite al usuario desplegar mltiples documentos al mismo tiempo, con cada documento desplegado en su propia ventana. Documentos o ventanas hijos (child windows) estn contenidos en una ventana padre (parent window) que proporciona el espacio de trabajo para todas las child windows en la aplicacin. Por ejemplo, Excel de Microsoft le permite crear y desplegar en ventanas mltiples documentos de diferentes tipos. Cada ventana individual es confinada al rea de la ventana padre de Excel. Cuando minimiza Excel, todas las ventanas de documentos son minimizadas tambin; solamente la ventana padre aparece en la barra de tareas. Un formulario hijo es un formulario ordinario que tiene la propiedad MDIChild establecida en True. Su aplicacin puede incluir muchos formularios MDI child de tipos similares o diferentes. En tiempo de ejecucin, los formularios child son desplegados dentro del espacio de trabajo del formulario padre MDI (el rea dentro de los bordes del formulario y debajo del ttulo y barras de mens). Cuando un formulario child es minimizado, su icono se muestra dentro del espacio de trabajo del formulario MDI en vez de en la barra de tareas. Su aplicacin tambin puede incluir formularios no MDI, estndar, que no estn contenidos en el formulario MDI. El tpico uso de un formulario estndar en una aplicacin MDI es para desplegar cajas de dilogo modales. Un formulario MDI es similar a un formulario ordinario, con una sola restriccin. No puede situar ningn control directamente sobre un formulario MDI a no ser que ese control tenga la propiedad Align (tal como el control PictureBox) o que no tenga interfase visible (tales como el control Timer). Creacin de una aplicacin MDI Use el siguiente procedimiento para crear un formulario MDI y sus formulario child. Para crear una aplicacin MDI: 1. Crear el formulario MDI. A partir del men Project, elija Add MDI Form. Nota: Una aplicacin puede tener solamente un formulario MDI. Si un proyecto ya tiene un formulario MDI, el comando Add MDI Form del men Project no est disponible. 2. Crear los formularios child de la aplicacin. Para crear un formulario child MDI, crear un nuevo formulario (o abrir uno existente) y establecer su propiedad MDIChild a True. Trabajando con formularios MDI Child en tiempo de diseo En tiempo de diseo, los formularios child no estn restringidos al rea dentro del formulario MDI. Puede agregar controles, establecer propiedades, escribir cdigo, y disear las caractersticas de los formularios child igual a como lo hara con cualquier otro formulario Visual Basic. Puede conocer cuando un formulario es MDI child viendo su propiedad MDIChild, o examinando el explorador de proyectos. Si la propiedad MDIChild del formulario est establecida a True, es un formulario child. Visual Basic despliega iconos especiales en el explorador de proyectos para el formulario padre MDI y para los formularios hijos MDI: Para el formulario padre MDI despliega un icono que muestra dos formularios, uno grande y otro pequeo, el formulario pequeo se muestra difuminado. Para el formulario hijo MDI despliega un icono que tambin muestra dos formularios, uno grande y otro pequeo, pero, en este caso, el formulario grande se muestra difuminado. Caractersticas en tiempo de ejecucin de los formularios MDI En tiempo de ejecucin un formulario MDI y sus formularios child toman caractersticas especiales: Todos los formularios child son desplegados dentro del espacio de trabajo del formulario MDI. El usuario puede mover y cambiar de tamao los formularios igual que cualquier otro formulario, sin embargo, est restringido a este espacio de trabajo.

105

Cuando un formulario child es minimizado, su icono aparece en el formulario MDI en vez de en la barra de tareas. Cuando un formulario MDI padre es minimizado, el formulario MDI padre y todos sus formularios child son representados por un icono solo. Cuando el formulario MDI padre es restaurado, el formulario MDI padre y todos sus formularios child son desplegados en el mismo estado en que estaban antes de haber sido minimizados. Cuando un formulario child es maximizado, su ttulo es combinado con el ttulo del formulario MDI y es desplegado en la barra de ttulo del formulario MDI. Estableciendo la propiedad AutoShowChildren puede desplegar formularios child automticamente cuando los formularios son cargados (True) o cargar los formularios child como escondidos (False). Los mens de formularios child activos (si hay alguno) son desplegados en la barra de men del formulario MDI, no sobre el formulario child.

La aplicacin NotePad MDI La aplicacin de ejemplo NotePad MDI es un editor de texto simple similar a la aplicacin NotePad incluida con Windows de Microsoft. La aplicacin NotePad MDI, sin embargo, usa una interfase de documentos mltiples (MDI). En tiempo de ejecucin, cuando el usuario solicita un nuevo documento (implementado con el comando New incluido en el men File de la aplicacin), la aplicacin crea una nueva instancia del formulario child. Esto permite al usuario crear tantos formularios child, o documentos, como sean necesarios. Para crear una aplicacin centrada en documentos en Visual Basic, necesita al menos dos formularios un formulario MDI y un formulario child. En tiempo de diseo, crea un formulario MDI para contener la aplicacin y un formulario child solo para servir como modelo del documento de la aplicacin. Para crear su propia aplicacin NotePad MDI: 1. A partir del men File, elija New Project. 2. A partir del men Project, elija Add MDI Form para crear el formulario contenedor. El proyecto ahora contendr un formulario MDI (MDIForm1) y el formulario estndar (Form1). 3. Crear un TextBox (Text1) en Form1. 4. Establecer las propiedades para los dos formularios y el TextBox como sigue:

5. Objeto
MDIForm1 Form1 Form1 Text1 Text1 Text1 Text1 Caption

Propiedad Caption MDIChild MutiLine Text Left Top MDI NotePad Untitled

Atributo True True (Vaco) 0 0

6. Usando el Editor de Mens (del men Tools), crea el men File para MDIForm1.
Caption &File &New Name mnuFile mnuFileNew Indented No Yes

7. Agregue el siguiente cdigo al procedimiento mnuFileNew_Click:


Private Sub mnuFileNew_Click ( ) crear una nueva instancia de Form1, llamada NewDoc: Dim NewDoc As New Form1 desplegar el nuevo formulario: NewDoc.Show End Sub Este procedimiento crea y despus despliega una nueva instancia (o copia) de Form1, llamada NewDoc. Cada vez que el usuario da clic en New del men File, un duplicado exacto (instancia) es creado,

106

incluyendo todos los controles y el cdigo que contiene.

8. Agregue el siguiente cdigo al procedimiento Form_Resize para Form1:


Private Sub Form_Resize ( ) expandir el TextBox para llenar el formulario child actual: Text1.Height = ScaleHeight Text1.Width = ScaleWidth End Sub El cdigo del procedimiento de evento Form_Resize, igual que todo el cdigo de Form1, es compartido por cada instancia de Form1. Cuando diversas copias de un formulario son desplegadas, cada formulario reconoce sus propios eventos. Cuando ocurre un evento, el cdigo de ese procedimiento de evento es llamado. En vista de que el mismo cdigo es compartido por cada instancia, se preguntar cmo hacer referencia al formulario que ha llamado el cdigo especialmente cuando cada instancia tiene el mismo nombre (Form1), cuestin que se responden en el siguiente tema titulado Trabajando con formulario MDI y formularios child. 9. Presione F5 para activar la aplicacin.

Sugerencia: La aplicacin de ejemplo Mdinote.vbp contiene ejemplos de muchas tcnicas MDI adems de las mencionadas en este captulo. Tmese tiempo para internarse en el cdigo de ejemplo para descubrir estas tcnicas. La aplicacin de ejemplo Sdinote.vbp es la misma aplicacin convertida al estilo SDI; compare los dos ejemplos para aprender las diferencias entre las tcnicas MDI y SDI. Trabajando con formularios MDI y formularios child Cuando los usuarios de su aplicacin MDI abren, salvan, y cierran diversos formularios child en una sesin, ellos deben saber referirse al formulario activo y mantener informacin de estado sobre lo formularios child. Este tpico describe las tcnicas de codificacin que puede usar para especificar el formulario child o el control activos, cargar y descargar formularios MDI y child, y mantener informacin de estado de un formulario child. Especificando el formulario child o el control activos Algunas veces desea proporcionar un comando que opere sobre el control que tiene el enfoque sobre el formulario child activo. Por ejemplo, supngase que desea copiar al clipboard el texto seleccionado en el TextBox de un formulario child. En la aplicacin de ejemplo Mdinote.vbp, el evento click, del elemento Copy, en el men Edit, llama al procedimiento EditCopyProc, un procedimiento que copia el texto seleccionado en el clipboard. Ya que la aplicacin puede tener muchas instancias del mismo formulario child, el EditCopyProc necesita saber qu formulario usar. Para especificar esto, usa la propiedad ActiveForm del formulario MDI, la cual retorna el formulario child que tiene el foco o el que ms recientemente ha estado activo. Nota: Al menos un formulario child MDI debe ser cargado y visible cuando accede a la propiedad ActiveForm, o un error ser emitido. Cuando tiene varios controles en un formulario, tambin necesita especificar cul control est activo. Igual que la propiedad ActiveForm, la propiedad ActiveControl retorna el control con el enfoque en el formulario child activo. He aqu un ejemplo de una rutina de copia que puede ser llamada desde un men de formulario child, un men en el formulario MDI, o un botn sobre la barra de herramientas: Private Sub EditCopyProc ( ) copia el texto seleccionado en el clipboard: Clipboard.SetText frmMDI.ActiveForm.ActiveControl.SelText End Sub Si escribe cdigo que ser llamado por mltiples instancias de un formulario, es buena idea no usar un identificador de formulario cuando se acceda a las propiedades del formulario o a sus controles. Por ejemplo,

107

refirase a la caja de texto de un formulario Form1 como Text1.Height en vez de Form1.Text1.Height. De esta forma, el cdigo siempre afectar el formulario en corriente. Otro medio para especificar el formulario en corriente en cdigo es el uso de la palabra reservada Me. Use Me para referirse al formulario cuyo cdigo est ejecutndose en ese momento. Esta palabra reservada es til cuando necesita pasar una referencia a la instancia del formulario actual como un argumento a un procedimiento. Cargando formularios MDI y formularios child Cuando carga un formulario child, su formulario padre (el formulario MDI) es automticamente cargado y desplegado. Sin embargo, cuando carga el formulario padre, sus hijos no son automticamente cargados. En el ejemplo NotePad MDI, el formulario child es el formulario startup por defecto, de forma que ambos, el formulario padre e hijo son cargados cuando la aplicacin se activa. Si cambia el formulario startup en la aplicacin NotePad MDI a frmMDI (en la pestaa General, de Propiedades del Proyecto) y despus activa la aplicacin, solamente el formulario padre es cargado. El primer formulario child es cargado cuando elige New, del men File. Puede usar la propiedad AutoShowChildren para cargar las ventanas child MDI como escondidas y dejarlas escondidas hasta que las despliegue usando el mtodo Show. Esto permite actualizar varios detalles tales como ttulos, posicin y mens, antes de que el formulario child se torne visible. No puede mostrar el formulario child MDI o el formulario MDI, en forma modal (usando el mtodo Show con un argumento de vbModal). Si desea usar una caja de dilogo modal en una aplicacin MDI, use un formulario con su propiedad MDIChild establecida en falso. Estableciendo el tamao y la posicin del formulario child Cuando un formulario child tiene la propiedad de borde modificable (BorderStyle = 2), Windows de Microsoft determina su altura inicial, anchura y posicin cuando es cargado. La posicin y tamao inicial de un formulario child con un borde modificable depende del tamao del formulario MDI, no del tamao del formulario child en tiempo de diseo. Cuando un formulario child MDI tiene un borde fijo (BorderStyle = 0, 1, o 3), es cargado usando sus propiedades alto y ancho del tiempo de diseo. Si establece la propiedad AutoShowChildren a Falso, puede cambiar la posicin del child MDI despus que lo carga, pero antes de que lo haga visible. Manteniendo informacin de estado para un formulario child Un usuario que ha decidido terminar una aplicacin MDI debe tener oportunidad para salvar su trabajo. Para hacer esto posible, la aplicacin necesita saber determinar, en todo momento, si los datos del formulario child han cambiado desde el ltimo momento en que fue salvado. Puede lograr esto declarando una variable pblica para cada formulario child. Puede declarar una variable en la seccin de declaraciones del formulario child: Public boolDirty As Boolean Cada vez que el texto cambia en Text1, el evento Change del TextBox del formulario child establece boolDirty a True. Puede utilizar este cdigo para indicar que el contenido de Text1 ha cambiado desde la ltima vez que fue salvado: Private Sub Text1_Change ( ) BoolDirty = True End Sub De igual manera, cada vez que el usuario salva el contenido del formulario child, el evento Change del TextBox establece BoolDirty a Falso para indicar que el contenido de Text1 no necesitar ser salvado. En el siguiente cdigo se asume que existe un comando de men llamado Save (mnuFileSave) y un procedimiento llamado FileSave que salva el contenido del TextBox:

108

Sub mnuFielSave_Click ( ) FileSave salva el contenido de Text1 boolDirty = False establece la variable de estado End Sub Descargando formularios MDI con QueryUnload La marca boolDirty es til cuando el usuario decide abandonar la aplicacin. Esto puede ocurrir cuando el usuario elige Close del men de control del formulario MDI, o a travs de un elemento de men que Usted proporciona, tal como Exit en el men File. Si el usuario cierra la aplicacin usando el men de control del formulario MDI, Visual Basic har el intento de descargar el formulario MDI. Cuando un formulario MDI es descargado, el evento QueryUnload es invocado primero para el formulario MDI y despus para cada formulario child que est abierto. Si ningn cdigo de este procedimiento de evento QueryUnload cancela el evento Unload, entonces cada child es descargado y finalmente el formulario MDI es descargado. En vista que el evento QueryUnload es invocado antes que el formulario es descargado, Usted puede brindar al usuario la oportunidad de salvar el formulario antes de descargarlo. El siguiente cdigo usa la marca boolDirty para determinar si el usuario deber de ser interpelado para salvar el child antes de ser descargado. Observe que Usted puede acceder el valor de una variable pblica a nivel de formulario de cualquier lado en el proyecto. El cdigo siguiente asume que existe un procedimiento, llamado FileSave, que salva el contenido de Text1 en un archivo. Private Sub mnuFExit_Click ( ) cuando el usuario elige File Exit en un aplicacin MDI, descarga el formulario MDI, invoca el evento QueryUnload por cada child abierto. Unload frmMDI End End Sub Private Sub Form_QueryUnload (Cancel As Integer, UnloadMode As Integer) If boolDirty Then llama la rutina para preguntar al usuario y salvar el archivo si es necesario. FileSave End If End Sub Ms acerca de formularios Adicionalmente a lo bsico en el diseo de formularios, debe de pensar acerca del comienzo y el final de su aplicacin. Existen varias tcnicas disponibles para determinar qu ver el usuario cuando se inicia la aplicacin. Es tambin importante estar atento de los procesos que ocurren cuando una aplicacin es descargada. Estableciendo el formulario startup Por defecto, el primer formulario en su aplicacin es designado como el formulario startup. Cuando su aplicacin comienza a ejecutarse, este formulario es desplegado (de forma que el primer cdigo que se ejecuta es el cdigo en el evento Form_Initialize de ese formulario). Si desea que un formulario diferente se despliegue cuando da inicio su aplicacin, debe de cambiar el formulario startup. Para cambiar el formulario startup: 1. A partir del men Project, elija Project Properties. 2. Elija la pestaa General. 3. En la caja de lista Startup Object, seleccione el formulario que desea como formulario startup. 4. Elija OK.

109

Comenzando sin un formulario startup Alguna vez puede desear que su aplicacin se inicie sin ningn formulario cargado inicialmente. Por ejemplo, puede desear ejecutar cdigo que carga y archivo de datos y despus despliega uno de los diferentes formularios dependiendo sobre lo que contenga el archivo de datos. Puede hacer esto creando un procedimiento llamado Main en un mdulo estndar, tal como en el ejemplo siguiente: Sub Main ( ) Dim intStatus As Integer llama un procedimiento de funcin para verificar el estatus del usuario intStatus = GetUserStatus muestre el formulario startup dependiendo del estatus If intStatus = 1 Then frmMain.Show Else frmPassword.Show End If Este procedimiento debe ser un procedimiento Sub, y no puede estar en un mdulo de formulario. Para establecer el procedimiento Sub Main como el objeto startup, a partir del men Project, elija Project Properties, seleccione la pestaa General, y seleccione Sub Main de la caja Startup Object. Desplegar una Splash Screen como startup Si necesita ejecutar un procedimiento lento como startup, tal como cargar una gran cantidad de datos de una base de datos o cargar diversos y extensos mapas de bits, tal vez desee desplegar una splash screen como startup. Una splash screen es un formulario, usualmente en donde se despliega informacin como el nombre de la aplicacin, informacin de derechos de autor, y simples mapas de bits. La pantalla que se despliega cuando inicia Visual Basic es una splash screen. Para desplegar una splash screen, use el procedimiento Sub Main como su objeto startup y use el mtodo Show para desplegar el formulario: frmSplash.Show agregar aqu su procedimiento startup desplegar el formulario principal y descargar la splash screen frmMain.Show Unload frmSplash End Sub La splash screen ocupa la atencin del usuario mientras las rutinas de inicio se estn ejecutando, dando la ilusin que la aplicacin se est cargando rpido. Cuando las rutinas de inicio se han completado, puede cargar su primer formulario y descargar la splash screen. Al disear una splash screen es una buena idea mantenerla simple. Si usa mapas de bits extensos o muchos controles, la propia splash screen tendr una lenta carga. Finalizando una aplicacin Una aplicacin conducida por eventos detiene su funcionamiento cuando todos sus formularios han sido descargados y no existe ningn cdigo ejecutndose. Si un formulario escondido todava existe cuando el ltimo formulario ha sido descargado, su aplicacin aparentar haber concluido (dado que ningn formulario est visible), pero de hecho continuar su funcionamiento hasta que todos los formularios escondidos hayan sido cerrados. Esta situacin puede ocurrir en vista de que cualquier acceso a las propiedades o controles de un formulario descargado implcitamente carga ese formulario sin necesidad de desplegarlo. El mejor medio para evitar este problema cuando finaliza su aplicacin es asegurarse que todos sus formularios han sido descargados. Si tiene ms de un formulario, puede usar la coleccin Forms y la declaracin Unload. Por ejemplo, en su formulario principal puede tener un botn de comando llamado cdmFin que permite al usuario finalizar la aplicacin. Si su aplicacin tiene solo un formulario, el procedimiento de evento click podr ser tan simple como ste:

110

Private Sub cmdFin_Click ( ) Unload Me End Sub Si su aplicacin usa mltiples formularios, puede descargar los formularios estableciendo cdigo en el procedimiento de evento Unload de su formulario principal. Puede usar la coleccin Forms para asegurarse de encontrar y cerrar todos sus formularios. El siguiente cdigo usa la coleccin Forms para descargar todos los formularios: Private Sub Form_Unload Dim i As Integer circular a travs de la coleccin de formularios y descargar cada uno For i = 0 To Forms.Count 1 Unload Forms(i) Next End Sub Pueden haber casos en que necesite finalizar su aplicacin sin preocuparse por el estado de cualquier formulario u objeto. Visual Basic proporciona la declaracin End para este propsito. La declaracin End finaliza la aplicacin inmediatamente; ningn cdigo despus de la declaracin End es ejecutado, y no ocurren eventos subsiguientes. En particular, Visual Basic no ejecutar los procedimientos de eventos QueryUnload, Unload, o Terminate, para ningn formulario. Las referencias a objetos sern liberadas, pero si Usted ha definido sus propias clases, Visual Basic no ejecutar los eventos Terminate de los objetos creados con sus clases. Adems de la declaracin End, la declaracin Stop detiene la aplicacin. Sin embargo, debe usar la declaracin Stop solo para efectos de rastreo, en vista que este no libera las referencias a los objetos. Traduccin: Derechos de Autor: RBsoftware (2001) Mircoles, 18 de abril 2001. 00:52am. Archivo: Traduccin VB12.

Usando mens en su aplicacin Muchas aplicaciones simples consisten en un formulario y algunos controles, pero puede mejorar sus aplicaciones Visual Basic agregndoles mens. Esta seccin muestra cmo crear mens y usarlos en una aplicacin. Creando mens con el Menu Editor Puede usar el Menu Editor para crear nuevos mens y barras de mens, agregar nuevos comandos a menes existentes, sustituir comandos de men existentes por sus propios comandos, y cambiar y borrar mens existentes y barras de men. Para desplegar el Menu Editor: A partir del men Tools, elija Menu Editor. o De click al botn Menu Editor en la barra de herramientas.

111

Aunque la mayora de las propiedades de control de men pueden ser establecidas usando el Menu Editor, todas las propiedades de men estn disponibles en la ventana propiedades. Las propiedades ms importantes de los controles de men son: Name: Este es el nombre que usa para hacer referencia al control de men a travs de cdigo. Caption: Este es el texto que aparece en el control. Otras propiedades en el Menu Editor, incluyendo Index, Checked, y NegotiatePosition, son descritas ms adelante en este capitulo. Usando el ListBox en el Menu Editor El control de menu ListBox (la porcin inferior del Menu Editor) lista todos los controles de men para el formulario en corriente. Cuando escribe un elemento de men en la caja de texto Caption, ese elemento tambin aparece en el ListBox del men. Seleccionando un control de men existente en el ListBox le permite editar las propiedades de ese control. La posicin del control de men en la caja de lista determina si el control es un ttulo de men, un elemento de men, un subttulo de men, o un elemento de submen: Un control de men que aparece alineado a la izquierda en la caja de lista es desplegado sobre la barra de men como un ttulo de men. Un control de men que aparece con una sangra en la caja de lista es desplegado sobre el men cuando el usuario da clic al ttulo de men precedente. Un control de men con sangra seguido por controles de mens que tambin tienen sangra se convierte en un subttulo de men. Los controles que tambin tienen sangra y que estn debajo del ttulo del sub men se convierten en elementos de ese sub men. Un control de men cuya propiedad Caption es un guin (-) aparece como una barra separadora. Una barra separadora divide los elementos de men dentro de grupos lgicos. Nota: Un control de men no puede ser una barra separadora si es un ttulo de men, tiene elementos de sub men, est chequeado o deshabilitado, o tiene tecla de acceso (shortcut). Para crear controles de men en el Menu Editor 1. Seleccione el formulario. 2. A partir del men Tools, elija Menu Editor, o, de click al botn Menu Editor en la caja de herramientas. 3. En la caja de texto Caption, escriba el texto para el primer ttulo de men que desea que se muestre sobre la barra de men. Tambin site un ampersand (&) antes de la letra que desea que sea la tecla de acceso para ese elemento de men. Esta letra ser automticamente subrayada en el men. El texto del ttulo del men ser desplegado en la caja de lista del control del men. 4. En la caja de texto Name, teclee el nombre que Usted usar en cdigo para referirse a este control de men. 5. De click a los botones de flecha que sealan a la izquierda o la derecha para cambiar los niveles de sangra del control. 6. Establezca otras propiedades para el control, si lo desea. Puede hacer esto en el Menu Editor o despus, en la ventana de propiedades. 7. Elija Next para crear otro control de men, o, de click en Insert para agregar un control de men entre controles existentes. Tambin puede dar clicks a los botones que tienen flechas que sealan arriba y abajo para moverse dentro de los controles de men existentes. 8. Teclee click en OK para cerrar el Menu Editor cuando haya creado todos los controles de men para ese formulario. Los ttulos de men que haya creado sern desplegados sobre el formulario. En tiempo de diseo puede dar click a un ttulo de men para ver sus correspondientes elementos de men. Separacin de elementos de men Una barra separadora es desplegada como una lnea horizontal entre los elementos de un men. En un men con muchos elementos, puede usar la barra separadora para dividir los elementos entre grupos lgicos.

112

Para crear una barra separadora en el Menu Editor 1. Si est agregando una barra separadora a un men existente, elija Insert para insertar un control de men entre los elementos de men que Usted desee separar. 2. Si es necesario, de click al botn que tiene una flecha que seala a la derecha para dar sangra al nuevo elemento de men y dejarlo al mismo nivel que tienen los elementos de men que desea separar. 3. Teclee un guin (-) en la caja de texto Caption. 4. Establezca la propiedad Name. 5. Elija OK para cerrar el Menu Editor. Nota: Aunque las barras separadoras son creadas como controles de men, ellas no responden a los eventos click, y los usuarios no pueden seleccionarlas. Asignando Teclas de Acceso y Teclas Corta Camino (shortcut) Puede mejorar el acceso del teclado a los comandos de men definiendo teclas de acceso y teclas corta camino. Teclas de Acceso Las teclas de acceso permiten al usuario abrir un men si mantiene presionando la tecla Alt y pulsa una tecla que tiene una letra designada, que la identifica el sistema subrayando esta letra y que est incluida en el ttulo del control del men. Para asignar una Tecla de Acceso a un control de menu en el Menu Editor 1. Seleccione el elemento de men al cual desea asignar una tecla de acceso. 2. En la caja Caption, teclee un ampersand (&) inmediatamente antes de la letra que desea convertirla en tecla de acceso. Por ejemplo, un men tradicional tendra el siguiente aspecto y propiedades: Caption del men de control Cut Copy Paste Delete Select All Time/Date Propiedad Caption Cu&t C&opy &Paste De&lete Select &All Time/&Date Tecla de Acceso t o p l a d

Nota: No use teclas de acceso duplicadas en los mens. Si usa la misma tecla de acceso para ms de un elemento de men, la tecla no trabajar. Por ejemplo, si C es la tecla de acceso para Cut y Copy, cuando seleccione C, el comando Copy ser seleccionado, pero la aplicacin no lo ejecutar a no ser que pulse Enter. El comando Cut nunca ser seleccionado. Teclas acorta camino (shortcut) Las teclas acorta camino (shortcut) inmediatamente ejecutan un elemento de men en cuanto son presionadas. Elementos de men usados frecuentemente pueden ser asignados a teclas acorta camino, las que proporcionan el mtodo de un-solo-paso de acceso al teclado, en vez del mtodo de tres pasos de presionar Alt, un carcter de acceso de un ttulo de men, y despus un carcter de acceso a un elemento de men. Las asignaciones shortcut incluyen teclas de funcin y combinaciones de teclas de control, tales como CTRL+F1, CTRL+A, etc. Ellas se muestran en el men, a la derecha de los correspondientes elementos del men. Para asignar un shortcut a un elemento de men 1. Abrir el Menu Editor. 2. Seleccionar el elemento del men. 3. Seleccionar una tecla de funcin o una combinacin de teclas en la caja combo Shortcut. Para borrar una tecla shortcut asignada con anterioridad, elija (none), ubicada como primera de la lista.

113

Nota: Las teclas shortcut aparecen automticamente en el men; en consecuencia, no necesita teclear CTRL+key en la caja Caption del Menu Editor. Gua para ttulos de men y para creacin de nombres Para mantener la consistencia con otras aplicaciones, es buena idea seguir las guas establecidas cuando se crean los mens. Estableciendo la propiedad Caption Cuando se asignan Captions a los elementos de men, debe de tratar de seguir las siguientes recomendaciones: Los nombres de los elementos deben ser nicos dentro de un men, pero deben repetirse en diferentes mens para representar similares acciones. Los nombres de los elementos deben ser sencillos, compuestos, o de palabras mltiples. Cada nombre de elemento debe tener un carcter de acceso mnemnico nico para los usuarios que eligen los comandos con el teclado. El carcter de acceso debe ser la primera letra de un ttulo de men, a no ser que otra letra ofrezca un enlace mnemnico ms fuerte; dos ttulos de men no pueden tener el mismo carcter para su acceso. Los puntos suspensivos () deben seguir a los nombres de comando que requieran ms informacin antes que ellos puedan ser completados, tales como los comandos que despliegan dilogos (Save As, Preferences). Mantenga cortos los nombres de elementos. Si exportar su aplicacin, la longitud de las palabras tienden a crecer aproximadamente el treinta por ciento en versiones extranjeras, podra no llegar a tener suficiente espacio para listar adecuadamente todos los elementos de su men. Convenio para nombramiento de men Para hacer que su cdigo sea ms leble y fcil de entender, se sugiere observar los convenios de establecimiento de nombres cuando establezca la propiedad Name en el Menu Editor. La mayora de los convenios sugieren un prefijo para identificar un objeto (esto es, mnu para un control de men) seguido por el nombre del men en el ms alto lugar (por ejemplo, File). Para sub mens, esto debe ser seguido por el caption del sub men (por ejemplo, mnuFileOpen). Creacin de Sub Mens Cada men que crea puede incluir hasta un mximo de cinco niveles de men. Un sub men se ramifica de otro men para desplegar sus propios elementos de men. Usted debe usar un sub men cuando: La barra de men est llena. Un control de men en particular es raramente usado. Desea hacer nfasis en la relacin de un control de men con otro. Sin embargo, si existe espacio en la barra de mens, es mejor crear un ttulo adicional de men en vez de un sub men. De esta manera todos los controles sern visibles al usuario cuando el men sea desplegado. Es tambin una buena prctica de programacin restringir el uso de sub mens de tal manera que los usuarios no se pierdan navegando a travs de la interfase de men de su aplicacin. (La mayora de las aplicaciones usan solamente un nivel de sub mens). En el Menu Editor, cualquier control de men sangrado, debajo de un control de men, que no es un men de ttulo, es un control sub men. En general, los controles sub mens pueden incluir elementos de sub mens, barras separadoras y ttulos de sub mens. Para crear un Sub Men 1. Crear el elemento de men que desea que sirva de ttulo del sub men. 2. Crear los elementos que aparecern en el nuevo sub men, y sangrarlos dando clic en el botn que tiene una flecha que seala hacia la derecha. Cada nivel de sangrado es precedido por cuatro puntos (.) en el Menu Editor. Para eliminar un nivel de sangrado, de click al botn que tiene una flecha que seala a la izquierda.

114

Nota: Si est considerando usar ms de un simple nivel de sub men, piense mejor en el uso de cajas de dilogo. Las cajas de dilogo permiten al usuario especificar varias opciones en un sitio. Para informacin sobre cajas de dilogo, vea Cajas de Dilogo, ms adelante en este captulo. Creacin de Arreglo de Control de Men Un arreglo control de men es un juego de elementos de men en el mismo men que comparten el mismo nombre y procedimientos de eventos. Use un arreglo de control de men para: Crear un nuevo elemento de men en tiempo de ejecucin cuando este debe ser miembro del arreglo de control. El ejemplo NotePad MDI usa un arreglo control de men para almacenar una lista de archivos ms recientemente abiertos. Simplificar cdigo, en vista de que bloques comunes de cdigo pueden ser usados por todos los elementos de men. Cada elemento de arreglo de control de men es identificado por un valor de ndice nico, indicado en la caja de propiedad Index del Menu Editor. Cuando un miembro de un arreglo de control reconoce un evento, Visual Basic pasa su valor de propiedad Index al procedimiento de evento como un adicional argumento. Su procedimiento de evento debe incluir cdigo para verificar el valor de la propiedad Index, as podr Usted determinar cual control est Usted usando. Para crear un Arreglo Control de Men en el Menu Editor 1. Seleccione el formulario. 2. A partir del men Tools, elija Menu Editor. O, de click al botn Menu Editor sobre la barra de herramientas. 3. En la caja de texto Caption, teclee el texto para primer ttulo de men que desea aparezca en la barra de men. El texto del ttulo del men es desplegado en la caja de lista del control de men. 4. En la caja de texto Name, teclee el nombre que usar en cdigo para referirse al control de men. Deje la caja Index vaca. 5. Al siguiente nivel de sangrado, crear el elemento de men que se convertir en el primer elemento en el arreglo estableciendo sus propiedades Caption y Name. 6. Establezca en cero la propiedad Index para el primer elemento en el arreglo. 7. Crear el segundo elemento de men al mismo nivel de sangrado que el primero. 8. Establezca el nombre del segundo elemento al mismo nombre que tenga el primer elemento y establezca en uno la propiedad Index. 9. Repita los pasos 5-8 para los subsecuentes elementos en el arreglo. Importante: Los elementos en un arreglo de control de men deben estar contiguos en la caja de lista de control de men y deben estar al mismo nivel de sangrado. Cuando est creando arreglos de men de control, asegrese de incluir las barras separadoras que aparezcan sobre el men. Creacin y Modificacin de Mens en Tiempo de Ejecucin Los mens que crea en tiempo de diseo pueden tambin responder en forma dinmica bajo condiciones de tiempo de ejecucin. Por ejemplo, si alguna accin de elemento de men se torna inapropiada en determinado momento, puede prevenir a los usuarios seleccionando ese men y desactivarlo. Por ejemplo, en la aplicacin MDI NotePad si el clipboard no contiene texto, el elemento de men Paste es difuminado sobre el men Edit, y los usuarios no pueden seleccionarlo. Puede tambin agregar en forma dinmica los elementos de men, si tiene un arreglo de control de men. Esto es descrito en Agregando Controles de Men en Tiempo de Ejecucin, ms adelante en este tpico. Tambin puede programar la aplicacin para que ponga una marca para indicar cuales de una diversa cantidad de comandos han sido seleccionados ltimamente. Por ejemplo, las opciones (Options), del elemento de men Toolbar, de la aplicacin MDI NotePad, despliega una marca si la caja de herramientas es desplegada. Otras caractersticas de control de men descritas en esta seccin incluyen cdigo que hace invisible o visible el elemento de men y agrega o borra elementos de men.

115

Activando y Desactivando Comandos de Men Todos los controles de men tienen la propiedad Enabled, y cuando esta propiedad es establecida a falso, el men es desactivado y no responde a acciones del usuario. Las teclas de acceso shortcut son tambin desactivadas cuando Enabled est establecido en falso. Un control de men desactivado aparece difuminado. Por ejemplo, esta declaracin desactiva el elemento de men Paste del men Edit de la aplicacin MDI NotePad: mnuEditPaste.Enabled = Fase Si se desactiva un ttulo de men desactiva en efecto todo el men, en vista de que el usuario no puede acceder a ningn elemento de men sin dar primero click al ttulo del men. Por ejemplo, el siguiente cdigo desactiva el men Edit de la aplicacin MDI NotePad: mnuEdit.Enabled = False Desplegando una Marca sobre el Control de Men Usando la propiedad Checked puede situar una marca sobre un men para: Comunicar al usuario el estatus de una condicin de encendido / apagado. Eligiendo en forma alternativa este men agrega o borra la marca. Indicar cul de los diversos modos est en efecto. El men Options de la aplicacin MDI NotePad usa una marca para indicar el estado de la barra de herramientas. En Visual Basic puede crear marcas con la propiedad Checked. Puede establecer el valor inicial de la propiedad Checked en el Menu Editor seleccionando el check box titulado Checked. Para agregar o remover marcas de un control de men en tiempo de ejecucin, desde cdigo establezca la propiedad Checked. Por ejemplo: Private Sub mnuOptions_Click ( ) establezca el estado de la marca basado en la propiedad Visible. mnuOptionsToolbar.Checked = picToolbar.Visible End Sub

Haciendo invisibles los controles de men En el Menu Editor puede establecer el valor inicial de la propiedad Visible para un control de men seleccionando la marca titulada Visible. Para hacer que un control de men sea visible o invisible en tiempo de ejecucin, desde cdigo establezca la propiedad Visible. Por ejemplo: mnuFileArray(0).Visible = True vuelve visible al control. mnuFileArray(0).Visible = False vuelve invisible al control. Cuando un control de men es invisible, el resto de los controles del men se mueven hacia arriba para llevar el espacio vaco. Si el control est sobre la barra de men, el resto de los controles sobre la barra de men se mueven a la izquierda para llenar el espacio. Nota: Haciendo un control de men invisible efectivamente lo desactiva, en vista de que el control es inaccesible a travs del men, teclas de acceso, o shortcuts. Si el ttulo del men es invisible, todos los controles en ese men son inaccesibles. Agregando Controles de Men en Tiempo de Ejecucin En tiempo de ejecucin puede crecer un men. Por ejemplo, en la aplicacin SDI NotePad, a medida de que los archivos son abiertos, los elementos de men son creados en forma dinmica para desplegar los nombres de rutas de acceso de los archivos ms recientemente abiertos. Usted debe usar un arreglo de controles para crear un control en tiempo de ejecucin. En vista de que al control de men mnuRecentFile le es asignado un valor por la propiedad Index en tiempo de diseo, este

116

automticamente se convierte en un elemento del arreglo de control an cuando ningn otro elemento haya sido an creado. Cuando crea el mnuRecentFile(0), en realidad lo que crea es una barra separadora que es invisible en tiempo de ejecucin. La primera vez que el usuario salva el archivo en tiempo de ejecucin, la barra separadora se vuelve visible, y el primer nombre de archivo es agregado al men. Cada vez que salva el archivo en tiempo de ejecucin, controles adicionales de men son cargados dentro del arreglo, haciendo que el men crezca. Los controles creados en tiempo de ejecucin pueden ser escondidos usando el mtodo Hide o estableciendo a falsa la propiedad Visible del control. Si desea remover un control de un arreglo de controles de memoria, use la declaracin Unload. Escribiendo cdigo para Controles de Men Cuando un usuario elige un control de men, ocurre un evento click. Usted necesita escribir en cdigo un procedimiento de evento click para cada control de men. Todos los controles de mens, a excepcin de las barras separadoras (y los controles invisibles e inaccesibles) reconocen el evento click. El cdigo que Usted escribe en un procedimiento de evento de men no es diferente del que debe escribir en cualquier otro procedimiento de evento de control. Por ejemplo, el cdigo de evento click del men File y Close sera como el siguiente: Sub mnuFileClose_Click ( ) Unload Me End Sub Visual Basic despliega automticamente un men cuando es seleccionado el ttulo del men; en consecuencia, no es necesario escribir cdigo para el procedimiento de evento click del ttulo del men, a no ser que Usted desee ejecutar otra accin, tales como desactivar ciertos elementos de men cada vez que el men es desplegado. Nota: En Tiempo de Diseo, los mens que Usted crea son desplegados una vez que cierra el Menu Editor. Elegir un elemento de men sobre el formulario despliega el procedimiento de evento click para ese control de men. Desplegando Mens Pop-Up Un men pop-up es un men flotante que es desplegado sobre un formulario, independiente de la barra de mens. Los elementos desplegados en el pop-up men dependen sobre en qu lugar estaba el apuntador del ratn cuando el botn derecho del ratn fue presionado. Por esta causa los pop-up mens son tambin llamados mens contextuales. Los mens contextuales se activan dndole clic al botn derecho del ratn. Cualquier men que tenga al menos un elemento de men puede ser desplegado en tiempo de ejecucin como pop-up men. Para desplegar un pop-up men use el mtodo PopupMenu. Este mtodo usa la siguiente sintaxis: [object.] PopupMenu mnuName [ flags [ x [ ,y [ , boldCommand ]]]] Por ejemplo, despliega un men llamado mnuFile cuando el usuario da clic en un formulario con el botn derecho del ratn. Puede usar los eventos MouseUp o MouseDown para detectar cundo el usuario da clic al botn derecho del ratn, aunque el estndar es el uso del evento MouseUp: Private Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then ver si se ha dado clic al botn derecho del ratn PopupMenu mnuFile despliega el menu File como pop-up menu End If End Sub Cualquier cdigo que siga a una llamada de un mtodo PopupMenu no es ejecutado hasta que el usuario selecciona un elemento en el men o cancela el men.

117

Nota: Solamente un pop-up menu puede ser desplegado a la vez. Mientras es desplegado un pop-up menu, las llamadas al mtodo PopupMenu son ignoradas. Las llamadas al mtodo PopupMenu son tambin ignoradas siempre que un control de men est activo. A menudo desea un pop-up menu para acceder opciones que no estn usualmente disponibles en la barra de men. Para crear un men que no se desplegar en la barra de men, haga invisible, en tiempo de diseo, el elemento de men de ms alto nivel (asegrese que la marca titulada Visible no est marcada en el Menu Editor). Cuando Visual Basic despliega un pop-up menu, la propiedad Visible del especificado men de ms alto nivel es ignorada. El Argumento Flags Usa el argumento flags en el mtodo PopupMenu para definir con ms detalle la ubicacin y comportamiento de un pop-up menu. La siguiente tabla lista los flags disponibles para describir la ubicacin del menu pop-up: Constantes de Ubicacin vbPopupMenuLeftAlign vbPopupMenuCenterAlign vbPopupMenuRightAlign Descripcin Valor por defecto. La especificada ubicacin x define la orilla izquierda del popup menu. El pop-up menu es centrado alrededor de la ubicacin x especificada. La especificada ubicacin x define la orilla derecha del pop-up menu.

La siguiente tabla lista los flags disponibles para describir el comportamiento del menu pop-up: Constantes de Comportamiento vbPopupMenuLeftButton vbPopupMenuRightButton Descripcin Valor por defecto. El menu pop-up es desplegado cuando el usuario da clic al elemento del menu con el botn izquierdo del ratn solamente. El menu pop-up es desplegado cuando el usuario da clic a un elemento del men ya sea con el botn derecho o con el botn izquierdo.

Para especificar un flag, combina una constante de cada grupo usando el operador Or. El siguiente cdigo despliega un pop-up menu con su borde superior centrada en un formulario cuando el usuario da clic a un botn de comando. El menu pop-up dispara eventos clicks si a los elementos de menu se les da clic con el botn derecho del ratn o con el izquierdo. Private Sub Command1_Click ( ) Dim xloc, yloc dimensiones de las variables X, Y. xloc = ScaleWidth / 2 establecer las variables X, Y para centrar el yloc = ScaleHeight / 2 formulario. desplegar el pop-up menu: PopupMenu mnuEdit, vbPopupMenuCenterAlign Or _ vbPopupMenuRightButton, xloc, yloc End Sub El argumento Boldcommand Usa el argumento Boldcommand para especificar el nombre de un control de menu en el menu pop-up desplegado que Usted desea que aparezca en bold. Solamente un control de menu en el pop-up menu puede ser bold. Traduccin: Derechos de Autor: RBsoftware (2001) Jueves, 19 de abril 2001. 11:01am. Archivo: Traduccin VB13.

118

Mens en Aplicaciones MDI En una aplicacin MDI, los mens para cada child son desplegados sobre el formulario MDI, en vez de los propios formularios child. Cuando un formulario child recibe el enfoque, el men del child (si existe) sustituye el men del formulario MDI sobre la barra de men. Si no existen formularios child visibles, o si el child con en enfoque no tiene men, es desplegado el men del formulario MDI. Es comn para las aplicaciones MDI el uso de diversos juegos de mens. Cuando un usuario abre un documento, la aplicacin despliega el men asociado con ese tipo de documento. Usualmente, un men diferente es desplegado cuando no existen formularios child visibles. Por ejemplo, cuando no existen archivos abiertos, Excel de Microsoft despliega solamente los mens File y Help. Cuando el usuario abre un archivo, otros mens son desplegados (File, Edit, View, Insert, Format, Tools, Data, Window, y dems). Creacin de Mens para Aplicaciones MDI Puede crear mens para su aplicacin Visual Basic agregando controles de men al formulario MDI y al formulario child. Una forma para manejar los mens en su aplicacin MDI es situar los controles de men que piensa desplegar todo el tiempo, an cuando no existan formularios child visibles, sobre el formulario MDI. Cuando la aplicacin est en funcionamiento, el men del formulario MDI es automticamente desplegado cuando no existen formularios child visibles. Site los controles de men que se aplican al formulario child sobre el formulario child. En tiempo de ejecucin, mientras exista visible al menos un formulario child, estos ttulos de mens sern desplegados sobre la barra de mens del formulario MDI. Algunas aplicaciones aceptan ms de un tipo de documento, por ejemplo, Access de Microsoft puede abrir tablas, queries (consultas), formularios y otros tipos de documentos. Para crear una aplicacin como esta en Visual Basic, use dos formularios child. Disee un child con mens que ejecuten tareas de hojas electrnicas y el otro con mens que ejecuten tareas grficas. En tiempo de ejecucin, cuando una instancia de la hoja electrnica tenga el enfoque, el men de la hoja electrnica es desplegado, y cuando el usuario seleccione un grfico, el men de ese formulario es desplegado. Si todas las hojas electrnicas y grficos estn cerrados, el men del formulario MDI es desplegado. Creando un men de ventana (window menu) La mayora de las aplicaciones MDI (por ejemplo, Microsoft Word para Windows y Microsoft Excel) incorporan un men de ventana. Este es un men especial que despliegan los ttulos de todos los child abiertos. Adicionalmente, algunas aplicaciones sitan comandos en este men para manipular las ventanas child, tales como iconos de Cascade, Tile y Arrange. Cualquier control de men en un formulario MDI o en un formulario child puede ser usado para desplegar la lista de los formularios child abiertos estableciendo la propiedad WindowList a True para ese control de men. En tiempo de ejecucin, Visual Basic automticamente maneja y despliega la lista de los ttulos y hace visualizar una marca adjunto al que ha recibido el foco ms recientemente. Adems, una barra separadora es automticamente situada sobre la lista de ventanas. Para establecer la propiedad WindowList 1. Seleccione el formulario en el que desea que aparezca el men, y a partir del men Tools, seleccione Menu Editor. Nota: La propiedad WindowList se aplica solamente a formularios MDI y a formularios child. No tiene efecto sobre formularios estndares (no MDI). 2. En la caja de lista del Menu Editor, seleccione el men en donde ubicar la lista a desplegar de los formularios child abiertos. 3. Ponga una marca en la caja WindowList. En tiempo de ejecucin, este men despliega la lista de los formularios child abiertos. Adems, la propiedad WindowList para este control de men regresa valor verdadero.

119

Organizando formularios child Como se mencion al comienzo, algunas aplicaciones presentas acciones tales como Tile, Cascade y Arrange, en un men de iconos, adjunto con la lista de los formularios child abiertos. Use el mtodo Arrange para organizar los formularios child en el formulario MDI. Puede desplegar los formularios child en cascada, desplegarlos en forma de cuadros horizontales, o como iconos de formularios child organizados a lo largo de la porcin inferior del formulario MDI. Los siguientes ejemplos muestran los procedimientos de evento click para los controles de men compuestos por los iconos Cascade, Tile y Arrange: Private Sub mnuWCascade_Click ( ) FrmMDI.Arrange vbCascade formularios child en cascada End Sub Private Sub mnuWCascade_Click ( ) FrmMDI.Arrange vbTileHorizontal End Sub Private Sub mnuWCascade_Click ( ) FrmMDI.Arrange vbArrangeIcons End Sub formularios child en cuadros horizontales organizacin de todos los iconos de formularios child

Nota: Las constantes intrnsecas vbCascade, vbTileHorizontal y vbArrangeIcons son listadas en la librera objeto de Visual Basic del Object Browser. Cuando se presentan en cascada o en forma horizontal, los formularios child que tiene estilo de borde fijo, cada formulario child es ubicado como si tuviese borde ajustable. Esto puede causar que los formularios child puedan traslaparse. Barras de Herramientas (Toolbars) Puede mejorar mucho ms la interfase del men de la aplicacin con el uso de toolbars. Los toolbars contienen botones toolbar, que proporcionan acceso rpido a los comandos ms frecuentemente usados en una aplicacin. Por ejemplo, el toolbar de Visual Basic dispone de botones que permiten ejecutar el uso de comandos comunes, tales como abrir un proyecto existente o salvar el proyecto actual. Creacin de una Barra de Herramientas Las barras de herramientas (tambin llamadas cinta o barra de control) se han convertido en una caracterstica estndar en muchas aplicaciones basadas en ambiente Windows. Una barra de herramientas proporciona acceso rpido a los comandos de men ms frecuentemente usados en una aplicacin. El control toolbar permite en forma conveniente y fcil la creacin de la barra de herramientas. El ejemplo que sigue a continuacin demuestra la creacin de una barra de herramientas para una aplicacin MDI; el procedimiento para la creacin de barras de herramientas para formularios estndar (no MDI) es bsicamente el mismo. Para crear manualmente una Barra de Herramientas: 1. Deposite un PictureBox sobre un formulario MDI. El ancho del PictureBox automticamente se hace ms delgado y alargado hasta cubrir el ancho que tenga el espacio del formulario MDI. El espacio es el rea dentro de los bordes de un formulario, sin incluir la barra de ttulo, la barra de men, o cualquier barra de herramientas, barras de estados, o barras de navegacin que puedan haber en el formulario. Nota: Puede depositar sobre el formulario solamente aquellos controles que acepten la propiedad Align directamente sobre un formulario MDI (el PictureBox es el nico control estndar que soporta esta propiedad). 2. Dentro del PictureBox, deposite cualquier control que desee desplegar sobre la barra de herramientas. Tpicamente crea botones para la barra de herramientas usando botones de comandos o controles Images. Para agregar un control dentro de un PictureBox, de clic al control en la caja de herramientas y despus dibjelo dentro del PictureBox. Nota: Cuando un formulario MDI contiene un PictureBox, el rea interna del formulario MDI no incluye el rea del PictureBox. Por ejemplo, la propiedad ScaleHeight del formulario MDI retorna la altura interna del formulario MDI, la que no incluye la altura del PictureBox.

120

3. Establecer las propiedades en Tiempo de Diseo. Una ventaja del uso de las barras de herramientas es
que puede presentar al usuario un comando representado grficamente. El control Image es una buena eleccin para que haga las veces de botn ubicado en la barra de herramientas ya que sobre l puede desplegar mapas de bits. Establezca su propiedad Picture en tiempo de diseo para desplegar mapas de bits; esto proporciona al usuario una pista visual sobre lo que hace el comando cuando le da clic a este botn. Tambin puede usar ToolTips, o sugerencias, estableciendo la propiedad ToolTipText para este botn, para que despliegue el nombre del botn en la barra de herramientas cuando el usuario haga descansar el apuntador del ratn sobre este botn. Escriba cdigo. Ya que los botones de la barra de herramientas son frecuentemente usados para proporcionar fcil acceso a otros comandos, la mayora del tiempo que llama a otros procedimientos, tales como los que corresponden a comandos de men, lo efecta a travs de cdigo desde dentro del evento click de cada botn.

4.

Tip: Puede usar controles que son invisibles en tiempo de ejecucin (tales como el control Timer) con un formulario MDI sin desplegar una barra de herramientas. Para hacer esto, ubique el PictureBox sobre el formulario MDI, site el control en el PictureBox, y establezca la propiedad Visible del PictureBox a falso. Escribiendo Cdigo para las Barras de Herramientas Las barras de herramientas son usadas para proporcionar al usuario un medio de acceso rpido a los comandos de la aplicacin. Por ejemplo, en la aplicacin MDI NotePad, el primer botn sobre la barra de herramientas es un shortcut para el comando New. Ahora existen tres lugares en la aplicacin MDI NotePad donde el usuario puede requerir un nuevo archivo: Sobre el formulario MDI (opcin New en el men File del formulario MDI). Sobre el formulario child (opcin New en el menu File del formulario child). Sobre la Barra de Herramientas (botn File New). En vez de duplicar este cdigo tres veces, puede tomar el cdigo original del evento mnuFileNew_Click del formulario child y ubicarlo dentro de un procedimiento pblico en el formulario child. Usted podr llamar este procedimiento desde cualquier otro procedimiento de evento precedente. He aqu un ejemplo: esta rutina est dentro de un procedimiento pblico: Public Sub FileNew ( ) Dim frmNewPad As New frmNotePad frmNewPad.Show End Sub el usuario elige New sobre el formulario child, menu File: Private Sub mnuchildFileNew_Click ( ) FileNew End Sub el usuario elige New sobre el formulario MDI, menu File: Private Sub mnumdiFileNew_Click ( ) frmNotePad.FileNew End Sub el usuario da clic sobre el bon File New de la Barra de Herramientas: Private Sub btnFileNew_Click ( ) frmNotePad.FileNew End Sub Negociando el aspecto del Men y la Barra de Herramientas Cuando un objeto suministrado por otra aplicacin es activado sobre un formulario, existen diferentes formas en que los objetos de mens y barras de herramientas pueden aparecer en el formulario contenedor; en consecuencia, Usted necesita especificar cmo ellos debern de ser desplegados. Este proceso es llamado

121

negociacin interfase de usuario en vista de que Visual Basic y el objeto que Usted ha conectado o pegado deben negociar el espacio dentro del formulario contenedor. Controlando el aspecto del Men Usted puede determinar dnde un objeto de men conectado o pegado aparecer dentro del formulario contenedor estableciendo la propiedad NegotiateMenus del formulario. Si la propiedad NegotiateMenus del formulario child es establecida a True (valor por defecto) y el contenedor tiene definida una barra de men, los objetos de mens sobre la barra de men del contenedor cuando el objeto es activado. Si el contenedor no tiene barra de men, o la propiedad NegotiateMenus es establecida a False, los objetos de mens no aparecern cuando sean activados. Nota: La propiedad NegotiateMenus no se aplica a formularios MDI. Controlando el aspecto de la Barra de Herramientas La propiedad NegotiateToolbars del formulario MDI determina si el objeto barra de herramientas conectado o pegado ser una paleta flotante o si ser depositado en el formulario padre. Este comportamiento no requiere que las barras de herramientas estn presentes sobre el formulario padre MDI. Si la propiedad NegotiateToolbars del formulario MDI es True, el objeto barra de herramientas aparece sobre el formulario padre MDI. Si NegotiateToolbars es False, el objeto de la barra de herramientas ser una paleta flotante. Nota: La propiedad NegotiateToolbars se aplica solamente a formularios MDI. Si un formulario MDI incluye una barra de herramientas, usualmente est contenido en un control PictureBox sobre el formulario padre. La propiedad Negotiate del PictureBox determina si la barra de herramientas del contenedor ser desplegada o si ser sustituida por el objeto de la barra de herramientas cuando este sea activado. Si Negotiate es True, el objeto de la barra de herramientas ser desplegado adicionalmente a la barra de herramientas del contenedor. Si Negotiate es False, la barra de herramientas del objeto sustituye a la barra de herramientas del contenedor. Para efectuar una negociacin de men y barra de herramientas: 1. 2. 3. 4. Site una barra de herramientas en un formulario MDI. Esto es descrito en Creacin de una Barra de Herramientas. Site un objeto insertable sobre un formulario child. Establezca las propiedades NegotiateMenus, NegotiateToolbars, y Negotiate. Ejecute la aplicacin, y d doble clic sobre el objeto.

Cajas de Dilogo En las aplicaciones bajo ambiente Windows las cajas de dilogo son usadas para: Requerir del usuario de datos que se necesitan para que la aplicacin contine. Desplegar informacin al usuario. Por ejemplo, en Visual Basic la caja de dilogo File Open se usa para desplegar los proyectos existentes. La caja de dilogo About en Visual Basic es tambin un ejemplo de cmo usar las cajas de dilogo para desplegar informacin. Cuando el usuario le da clic a Help, el elemento del men About Visual Basic, sobre la barra de men, la caja de dilogo About es desplegada. Cajas de Dilogo Modales y No Modales Las cajas de dilogo son modales y no modales. Una caja de dilogo modal debe ser cerrada (escondida o descargada) antes de que Usted pueda continuar con el resto de la aplicacin. por ejemplo, una caja de dilogo es modal si requiere que Usted de clic al botn OK o Cancel antes de que pueda cambiarse a otra aplicacin o caja de dilogo. La caja de dilogo About de Visual Basic es modal. Las cajas de dilogo que despliegan mensajes importantes deben ser modales es decir, el usuario siempre debe ser requerido para cerrar la caja de dilogo o responder su mensaje antes de continuar el trabajo.

122

Las cajas de dilogo no modales le permiten cambiar el enfoque entre la caja de dilogo y otro formulario sin tener que cerrar la caja de dilogo. Puede continuar trabajando en cualquier lado en la aplicacin actual mientras la caja de dilogo permanece desplegada. Las cajas de dilogo no modales son raras. Un ejemplo de caja de dilogo no modal se encuentra en Visual Basic, en el men Edit, caja de dilogo Find. Use las cajas de dilogo para desplegar comandos usados con frecuencia o informacin. Para desplegar un formulario como caja de dilogo modal: Use el mtodo Show con un argumento style de vbModal (una constante con el valor de 1). Por ejemplo: desplegar el formulario frmAbout como dilogo modal: frmAbout.Show vbModal Para desplegar un formulario como caja de dilogo no modal: Use el mtodo Show sin el argumento style. Por ejemplo: desplegar el formulario frmAbout como dilogo no modal: frmAbout.Show Nota: Si un formulario es desplegado como modal, el cdigo que sigue al mtodo Show no es ejecutado hasta que la caja de dilogo sea cerrada. Sin embargo, cuando un formulario es mostrado como no modal, el cdigo que sigue al mtodo Show es ejecutado inmediatamente despus que el formulario es desplegado. El mtodo Show tiene otro argumento opcional, owner, que puede ser usado para especificar la relacin padre hijo para un formulario. Usted puede pasar el nombre de un formulario a este argumento para hacer de ese formulario el propietario del nuevo formulario. Para desplegar un formulario como child de otro formulario: Use el mtodo Show con los argumentos style y owner. Por ejemplo: desplegar el formulario frmAbout como child no modal de frmMain: frmAbout.Show vbModeless, frmMain Usando el argumento owner con el mtodo Show asegura que la caja de dilogo sea minimizada cuando su padre sea minimizado, o descargada cuando el formulario padre sea cerrado. Usando Cajas de Dilogo Predefinidas El ms fcil mtodo para agregar cajas de dilogo a su aplicacin es el uso de dilogos predefinidos, porque Usted no necesita preocuparse acerca del diseo, carga, o despliegue de la caja de dilogo. Sin embargo, su control sobre su apariencia es limitado. Las cajas de dilogo predefinidas son siempre modales. La tabla siguiente lista las funciones que Usted puede usar para agregar cajas de dilogo predefinidas a su aplicacin Visual Basic. Use esta funcin Para hacer esto Funcin InputBox Desplegar un comando de requerimiento en la caja de dilogo, y capturar lo que haya contestado el usuario. Funcin MsgBox Desplegar un mensaje en la caja de dilogo, y recuperar un valor indicado por el botn de comando que haya oprimido el usuario. Requerimiento de Entrada con InputBox Use la funcin InputBox para solicitar datos al usuario. Esta funcin despliega una caja de dilogo modal que solicita al usuario la entrada de datos. El ejemplo que sigue a continuacin muestra el cdigo que se necesita para solicitar al usuario un nombre de archivo a abrir, usando InputBox: FileName = InputBox(Teclee el Nombre del Archivo a Abrir: , Abrir Archivo)

123

Nota: Recuerde que cuando use la funcin InputBox tiene mnimo control sobre los componentes de la caja de dilogo. Puede solamente cambiar el texto de la barra de ttulo, el mensaje de comando desplegado al usuario, la posicin de la caja de dilogo en la pantalla, y si o no desplegar el botn Help. Desplegando informacin con MsgBox Use la funcin MsgBox para obtener una respuesta de si o no del usuario, y para desplegar breves mensajes, tales como errores, advertencias, o alertas, en una caja de dilogo. Despus de leer el mensaje, el usuario elige un botn para cerrar la caja de dilogo. El siguiente cdigo es un ejemplo de MsgBox: MsgBox Error encontrado al tratar de abrir el archivo, _ por favor intente de nuevo., vbExclamation, RBsoftware Nota: La modalidad puede ser limitada a la aplicacin o al sistema. Si la caja de modalidad del mensaje es limitada a la aplicacin (defecto), el usuario no puede cambiar hacia otra parte de la aplicacin hasta que la caja de dilogo sea respondida, pero puede cambiar a otra aplicacin. Si la caja es limitada al sistema, el usuario no puede cambiar a otra aplicacin hasta que el mensaje es respondido. Usando formularios como cajas de dilogo personalizadas Una caja de dilogo personalizada es un formulario que Usted crea conteniendo controles incluyendo botones de comando, botones de opcin y cajas de texto que permiten al usuario suministrar informacin a la aplicacin. Usted personaliza la apariencia del formulario estableciendo valores a las propiedades. Usted tambin escribe cdigo para desplegar la caja de dilogo en tiempo de ejecucin. Para crear una caja de dilogo, puede comenzar con un nuevo formulario o personalizar una caja de dilogo existente. Posteriormente, puede crear una coleccin de cajas de dilogo que puedan ser usadas en muchas aplicaciones. Para personalizar una caja de dilogo: 1. A partir del men Project, elija AddForm para agregar un formulario existente a su proyecto. 2. A partir del men File, elija Save filename As e introduzca un nuevo nombre de archivo (esto previene hacerle cambios a la versin existente del formulario). 3. Personalice la apariencia del formulario como lo necesite. 4. Personalice procedimientos de evento en la ventana de cdigo. Para crear una nueva caja de dilogo: 1. A partir del men Project, elija AddForm. O de clic al botn Form de la barra de tareas para crear un nuevo formulario. 2. Personalice la apariencia del nuevo formulario como lo necesite. 3. Personalice los procedimientos de evento en la ventana de cdigo. Usted tiene considerable libertad para definir la apariencia de una caja de dilogo personal. Puede ser fija o movible, modal o no modal. Puede contener diferentes tipos de controles; no obstante, las cajas de dilogo usualmente no incluyen barras de mens, ventanas de navegacin (window scroll bars), botones para maximizar y minimizar, barras de estado, o bordes ajustables. El resto de este tpico discute los medios para crear estilos de cajas de dilogo tpicas. Agregando un Ttulo Una caja de dilogo debe siempre tener un ttulo que la identifique. Para crear un ttulo, establezca la propiedad Caption del formulario a la cadena de texto que aparecer en la barra de ttulo. Usualmente esto es realizado en tiempo de diseo usando la ventana propiedades, pero puede tambin hacer esto desde cdigo. Por ejemplo:

124

frmAbout.Caption Aclaracin Tip: Si desea remover completamente la barra de ttulo, establezca las propiedades ControlBox, MinButton, y MaxButton del formulario a False; establezca el BorderStyle a la propiedad no ajustable (0, 1, o 3); y establezca Caption a una cadena vaca (). Estableciendo Propiedades de Cajas de Dilogo Estndar Generalmente, el usuario responde a una caja de dilogo proporcionando informacin y despus cerrando la caja de dilogo con un botn OK o Cancel. En vista que una caja de dilogo es temporal, el usuario usualmente no necesita moverla, cambiarle de tamao, maximizarla, o minimizarla. Como resultado, el estilo de borde ajustable, la caja de men de control, el botn maximizar, y el botn minimizar que vienen con un nuevo formulario son innecesarios en la mayora de las cajas de dilogo. Puede remover estos elementos estableciendo las propiedades BorderStyle, ControlBox, MaxBotton, y MinButton. Por ejemplo, una caja de dilogo Aclaracin puede usar las siguientes propiedades: Propiedad Argumento Efecto BorderStyle 1 Cambia el estilo de borde a sencillo fijo, previniendo que la caja de dilogo sea ajustada de tamao. ControlBox False Remueve la caja men de control. MaxButton False Remueve el botn maximizar, previniendo que la caja de dilogo sea maximizada en tiempo de ejecucin. MinButton False Remueve el botn minimizar, previniendo que la caja de dilogo sea minimizada en tiempo de ejecucin. Recuerde que si remueve la caja de men de control (ControlBox = False), Usted debe proporcionar al usuario otro medio para poder salir de la caja de dilogo. Comnmente esto es logrado un agregando un botn de comando Salir, Cancelar o Aceptar, y agregando cdigo al evento clic para el botn que esconde o descarga el dilogo. Agregando y situando botones de comando Las cajas de dilogo modales deben contener al menos un botn de comando para salir de la caja de dilogo. Usualmente se utilizan dos botones de comando: un botn que permite al usuario iniciar una accin, y otro botn para cerrar la caja de dilogo sin hacer ningn cambio. Tpicamente, la propiedad Caption de estos botones es Aceptar y Cancelar. En este escenario, el botn de comando Aceptar tiene su propiedad Default en True, y el botn Cancelar tiene la propiedad Cancel en True. Aunque los botones Aceptar y Cancelar los botones ms comnmente usados, otras combinaciones de ttulos tambin trabajan bien. Las cajas de dilogo que despliegan mensajes usualmente usan un control Label para desplegar el mensaje de error o el mensaje de comando, y uno o dos botones de comando para ejecutar la accin. Por ejemplo, puede asignar el mensaje de error o el mensaje de comando a la propiedad Caption del Label y a dos controles de botones de comando la propiedad Caption S y No. Cuando el usuario elige Si, una accin se ejecuta; si elige No otra accin toma lugar. Los botones de comando en este tipo de dilogo usualmente son situados en la parte inferior del cuadro o a la derecha de la caja de dilogo, siendo el botn por defecto el ms a la izquierda o el que est ms arriba. Estableciendo Default, Cancel y Focus Los controles de botones de comando proporcionan las siguientes propiedades: Default. Cancel. TabIndex. TabStop. El botn Default es seleccionado cuando el usuario presiona Enter. Solamente un botn de comando sobre un formulario puede tener su propiedad Default en True. Presionar la tecla Enter hace que se invoque el evento Click para el botn de comando por defecto. Esta caracterstica trabaja en conjunto con un control de edicin,

125

tal como un control TextBox. Por ejemplo, el usuario puede teclear datos en una caja de texto y presionar Enter para generar un evento Click en vez de elegir un botn Aceptar. El botn Cancelar es seleccionado (propiedad Cancel = True) cuando el usuario presiona ESC. Solamente un botn de comando sobre un formulario puede tener la propiedad Cancel en True. Presionar la tecla ESC invoca el evento click para el botn de comando Cancelar. El botn Cancelar tambin puede ser el botn de comando por defecto. Para especificar el botn Cancelar para una caja de dilogo, establezca la propiedad Cancel del botn de comando a True. Tip: En general, el botn que indique la accin ms deseada o la accin ms segura debe ser la accin por defecto. Por ejemplo, en una caja de dilogo Reemplazar Texto, Cancelar debe ser el botn por defecto, y no la opcin Reemplazar Todo. Usted tambin puede especificar el botn que tendr el enfoque cuando la caja de dilogo sea desplegada. El control con el menor valor de TabIndex recibe el enfoque cuando el formulario es desplegado. Presionar la tecla Enter invoca el evento click para el botn de comando por defecto o para el botn de comando que tiene el enfoque. Para dar el enfoque a un botn de comando cuando el formulario es desplegado establezca el valor cero de la propiedad TabIndex del botn de comando y su propiedad TabStop a True. Puede usar el mtodo SetFocus para dar a un control especfico el enfoque cuando el formulario es desplegado. Desactivando Controles en una Caja de Dilogo Algunas veces los controles necesitan ser desactivados en vista de que sus acciones podran ser inapropiadas en el contexto actual. Por ejemplo, cuando la caja de dilogo Find de Visual Basic es desplegada por primera vez, el botn Find Next est desactivado. Puede desactivar un control en un dilogo estableciendo su propiedad Enable a False. Para desactivar un control en una caja de dilogo: cmdFindNext.Enabled=False cmdReplace.Enabled=False Desplegando una Caja de Dilogo Personal Usted despliega una caja de dilogo de la misma manera que despliega cualquier formulario en una aplicacin. El formulario Startup se carga automticamente cuando la aplicacin es activada. Cuando desea que aparezca un segundo formulario o caja de dilogo en la aplicacin, escribe cdigo para cargarlo y desplgarlo. De manera similar, cuando desea que el formulario o la caja de dilogo desaparezca, escribe cdigo para descargarlo o esconderlo. El siguiente cdigo despliega la caja de dilogo About, cuando el usuario selecciona el men Help, elemento About: private Sub mnuHelpAbout_Click ( ) el mtodo Show con estilo vbModal es usado aqu para desplegar el dilogo como modal: frmAbout.Show vbModal End Sub Opciones de despliegue El cdigo que escribe determina cmo una caja de dilogo es cargada en memoria y desplegada. La siguiente tabla describe varias tareas de despliegue de formulario y las claves que son usadas para llevarlas a efecto: Tarea Claves Cargar un formulario en memoria pero no desplegarlo. Use la declaracin Load o haga una referencia a la propiedad o control sobre el formulario. Cargar y desplegar un formulario no modal. Use el mtodo Show. Cargar y desplegar un formulario modal. Use el mtodo Show con style=vbModal Desplegar un formulario cargado. Establezca la propiedad Visible a True o use el mtodo Show. Esconder un formulario. Establezca su propiedad Visible a False o use el mtodo Hide.

126

Esconda un formulario y descrguelo de memoria. Use la declaracin Unload. El mtodo Show carga el formulario y establece su propiedad Visible a True. El argumento pasado al mtodo Show indica el estilo de la caja de dilogo. Si el argumento style es omitido y establecido a vbModeless o 0 (defecto), la caja de dilogo es no modal; si es vbModal o 1, la caja de dilogo es modal. Para salir de una caja de dilogo cuando el usuario da clic en Continuar o Cancelar, use cualquiera, sea la declaracin Unload o el mtodo Hide. Por ejemplo: Unload frmAbout o frmAbout.Hide La declaracin Unload remueve la caja de dilogo de memoria, mientras que el mtodo Hide solamente remueve la caja de dilogo de la vista estableciendo su propiedad Visible a False. Cuando descarga un formulario, el propio formulario junto con sus controles son descargados de memoria (incluyendo cualquier control que haya sido cargado en tiempo de ejecucin). Cuando usted esconde un formulario, el formulario y sus controles permanecen en memoria. Cuando necesita salvar espacio en memoria, es conveniente descargar el formulario, ya que descargar un formulario libera espacio de memoria. Si usa a menudo la caja de dilogo, puede elegir esconder el formulario. Escondiendo un formulario retiene los datos adjuntos a l, incluyendo valores de propiedad, salidas de impresin, y controles creados en forma dinmica. Con un formulario escondido puede continuar haciendo referencia a sus controles y propiedades desde cdigo. Traduccin: Derechos de Autor: RBsoftware (2001) Lunes, 23 de abril 2001. 05:12pm. Archivo: Traduccin VB14.

Diseando para diferentes tipos de despliegue Microsoft Windows es independiente de dispositivo una aplicacin bajo ambiente Windows que puede funcionar en diferentes computadoras con diferentes resoluciones de despliegue y profundidades de color. Las aplicaciones que escribe en Visual Basic tambin pueden funcionar en diferentes tipos de despliegues; Usted necesita estar atento de esto cuando disee una aplicacin. Diseando Formularios de Resolucin Independiente Por defecto, Visual Basic de Microsoft no cambia el tamao de sus formularios y controles cuando cambia de resolucin de pantalla. Lo que esto significa es que un formulario que Usted disea con una resolucin 1024 X 768 podra extenderse ms all del borde cuando funcione bajo resoluciones 640 X 480. Si desea crear formularios y controles que tengan las mismas proporciones sin importar la resolucin de pantalla que use, Usted debe disear sus formularios a la ms baja resolucin, o agregar cdigo a su programa para que cambie los formularios. La forma ms fcil de evitar problemas de tamao es disear sus formularios con una resolucin 640 X 480. Si prefiere trabajar con una resolucin mayor, todava necesita estar atento para conocer cmo su formulario aparecera a una ms baja resolucin. Una forma de hacer esto es crear un mapa de bits de colores slidos de 640 por 480 pxeles y asignarlo a la propiedad Picture de su formulario. Despus podr situar sus controles dentro de las fronteras del mapa de bits en tiempo de diseo. No olvide remover el mapa de bits una vez que haya concluido con el diseo. Visual Basic tambin sita su formulario en tiempo de ejecucin basado en su localizacin en tiempo de diseo. Si Usted est trabajando bajo una resolucin de 1024 X 768 en tiempo de diseo y sita el formulario en la esquina inferior derecha de la pantalla, no ser visible cuando funcione a baja resolucin. Puede evitar esto posicionando su formulario con cdigo en el evento Form Load: Private Sub Form_Load ( )

127

Me.Move 0,0 End Sub Este mismo efecto se consigue estableciendo las propiedades Left y Top del formulario a cero, pero el mtodo Move lo lleva a efecto en un solo paso. Visual Basic utiliza una unidad de medida independiente de dispositivo llamada twip, para calcular el tamao y la posicin. Dos propiedades del objeto Screen, TwipsPerPixelX y TwipsPerPixelY, pueden ser usadas para determinar el tamao del despliegue en tiempo de ejecucin. Usando estas propiedades puede escribir cdigo para ajustar el tamao y posicin de sus formularios y controles: Private Sub SetControls ( ) Dim X As Integer Dim Y As Integer X = Screen.TwipsPerPixelX Y = Screen.TwipsPerPixelY Select Case X, Y Case 15,15 txtName.Height = 200 txtName.Width = 500 txtName.Move 200,200 agregar cdigo para otras resoluciones: End Sub Usted debe tambin estar enterado de las posiciones de las ventanas propias de Visual Basic en tiempo de diseo. Si Usted ubica la ventana Proyecto al lado derecho de la pantalla en alta resolucin, Usted encontrar que no es accesible cuando abre su proyecto a baja resolucin. Diseando para diferentes colores de profundidad Al disear una aplicacin, tambin necesita considerar las capacidades de despliegue de colores de los computadores en donde estar activa su aplicacin. Algunos computadores pueden desplegar 256 o ms colores, otros estn limitados a 16. Si disea un formulario usando una paleta de 256 colores, dithering (un proceso usado para simular colores que no estn disponibles) puede causar que algunos de los elementos en el formulario desaparezcan cuando se desplieguen en 16 colores. Para evitar esta situacin, es conveniente limitar los colores usados en su aplicacin a los 16 colores estndar de Windows. Estos son representados por las constantes de color de Visual Basic (vbBlack, vbBlue, vbCyan, y dems). Si es necesario usar ms de 16 colores en su aplicacin, debe mantenerse con los colores estndar para texto, botones y otros elementos de la interfase. Diseando con el usuario en mente A no ser que est creando las aplicaciones Visual Basic estrictamente para su uso personal, el valor de sus creaciones ser juzgada por otros. La interfase de usuario de su aplicacin tiene el ms grande impacto en la opinin del usuario no importa cuan tcnicamente brillante o bien optimizado su cdigo sea, si su usuario encuentra su aplicacin difcil de usar, esta no ser bien recibida. Como programador indudablemente a Usted le son familiares los aspectos tecnolgicos de los computadores. Es fcil olvidar que la mayora de los usuarios no entienden (y probablemente no les interesa) acerca de la tecnologa detrs de una aplicacin. Ellos miran una aplicacin como un medio para conseguir un fin: un medio para cumplir una tarea, idealmente ms fcil que si ellos lo hicieran sin la ayuda de un computador. Una interfase de usuario bien diseada asla al usuario de la tecnologa subyacente, facilitndole la ejecucin de las tareas propuestas. Al disear la interfase de usuario para su aplicacin, necesita mantener al usuario en su mente. Cun fcil podr el usuario descubrir las diversas caractersticas de su aplicacin sin que le instruya de su parte? Cmo responder su aplicacin cuando ocurran los errores? Qu le proporcionar al usuario en trminos de ayuda y

128

asistencia? Es el diseo estticamente satisfactorio para el usuario? Las respuestas a estas y otras preguntas relacionadas con diseo enfocado al usuario son cubiertas en esta seccin. Lo Bsico en Diseo de Interfases Usted no necesita ser un artista para crear una gran interfase de usuario la mayora de los principios de diseo de interfase de usuario son los mismos que los principios de diseo bsico aprendidos en cualquier clase de arte elemental. Los principios de diseo elemental de composicin, color, y dems se aplican tan bien a una pantalla de computador como lo hacen a una hoja de papel o a un pedazo de tela o lona. Aunque Visual Basic facilita la creacin de interfase de usuario simplemente arrastrando controles dentro de un formulario, una pequea planeacin previa puede convertirse en una gran diferencia en la facilidad de utilizacin de su aplicacin. Primero considere disear su formulario en papel, determinar que controles son necesitados, la importancia relativa a los diferentes elementos, y la relacin entre los controles. Significado: Cmo se mira y se siente una aplicacin El significado o esquema de su formulario no solamente influencia su atractivo esttico, tiene tambin un tremendo impacto sobre la facilidad de uso de su aplicacin. El significado incluye factores tales como la disposicin de los controles, consistencia de los elementos, productividad, uso del espacio en blanco y simplicidad en el diseo. Disposicin de los controles En la mayora de los diseos de la interfase, no todos los elementos son de igual importancia. El diseo cuidadoso es necesario para asegurar que los elementos ms importantes realmente lo aparenten al usuario. Los elementos importantes o frecuentemente accedidos se les debe dar una posicin de preeminencia; los elementos menos importantes deben ser relegados a ubicaciones menos preeminentes. En la mayora de los lenguajes, se nos ha enseado a leer de izquierda a derecha, de arriba hacia abajo, en una pgina. Lo mismo permanece cierto para una pantalla de computador los ojos de la mayora de los usuarios se ubicarn primero en la esquina superior izquierda de la pantalla, de manera que los elementos ms importantes debern ah ser ubicados. Por ejemplo, si la informacin de un formulario se relaciona con clientes, el campo nombre deber ser desplegado en donde vaya a ser visto primeramente. Los botones tales como Aceptar o Siguiente, debern ser situados en la porcin inferior derecha de la pantalla; el usuario normalmente no accede a ellos hasta que finaliza de trabajar con el formulario. El agrupamiento de los elementos y controles es tambin importante. Trate de agrupar la informacin en forma lgica de acuerdo a su funcin o relacin recproca. En vista de que sus funciones son relacionadas, los botones para navegar una base de datos deben ser agrupados visualmente en vez de esparcidos por todo el formulario. Lo mismo se aplica a la informacin; los campos nombre y direccin generalmente son agrupados como uno solo, dado que tienen relacin cercana. En muchos casos, puede usar controles Frames para ayudarle a reforzar la relacin intrnseca entre los controles. Consistencia de los elementos de la interfase La consistencia es una virtud en el diseo de la interfase para el usuario. Un sentimiento y aspecto consistente crea armona en una aplicacin todo parece calzar. Una falta de consistencia en su interfase puede crear confusin, y puede hacer aparecer la aplicacin catica, desorganizada y barata, posiblemente an causar que el usuario dude de la validez de su aplicacin. Para consistencia visual, establezca una estrategia de diseo y convenciones de estilo antes de dar inicio al desarrollo. Los elementos de diseo, tales como los tipos de controles, estndares de tamao y agrupamiento de controles, y elecciones de fuentes deben ser establecidas de antemano. Puede crear prototipos de diseos posibles para ayudarle a tomar decisiones de diseo. La amplia variedad de controles disponibles para ser usados en Visual Basic son una tentacin para usarlos todos. Evite esta tentacin; elija un juego de controles que mejor se ajusten a su aplicacin en particular. Ya que los controles ListBox, ComboBox, Grid, y controles de rboles pueden todos ser usados para presentar listas de informacin, es mejor permanecer con un mismo estilo siempre que sea posible.

129

Tambin, trate de usar los controles apropiadamente; aunque un control TextBox puede ser establecido como solo lectura y usado para desplegar texto, un control Label es usualmente ms apropiado para este propsito. Permanezca consistente en el establecimiento de propiedades de sus controles si usa en un lugar un color de fondo blanco para texto de edicin, no use caf en otro, a no ser que exista una buena razn. La consistencia entre los diferentes formularios en su aplicacin es importante para facilitar su uso. Si usa un fondo gris y efectos tridimensionales en un formulario y un fondo blanco en otro, los formularios aparentarn no estar relacionados. Escoja un estilo y mantngase con l a travs de toda la aplicacin, an cuando esto signifique tener que volver a disear algunas caractersticas. Significado: los Formularios siguen a una Funcin Significado es la pista visual de la funcin de un objeto. Aunque el trmino no le parezca familiar, ejemplos de significado estn alrededor de l. Las huellas de los dedos en el manubrio de una bicicleta tiene depresiones donde Usted sita sus dedos, un significado que lo hace obvio que facilita la sujecin. Botones que se presionan, manivelas, e interruptores de luces son todos significados simplemente vindolos puede Usted discernir su propsito. La interfase del usuario tambin hace uso del significado. Por ejemplo, los efectos tridimensionales usados en los botones de comando que dan la apariencia de ser empujados hacia abajo. Si usted fuera a disear un botn de comando con un borde plano, Usted perder este significado y no parecer al usuario ser este un botn de comando. Existen algunos casos en donde los botones planos pueden ser apropiados, por ejemplo en juegos o en aplicaciones multimedia; esto est bien, mientras se mantenga consistente a travs de toda su aplicacin. Las cajas de texto tambin proporcionan una clase de significado el usuario espera que una caja con un borde con fondo blanco contenga texto que pueda editarse. Aunque es posible desplegar una caja de texto sin borde (BorderStyle = 0), esto har que parezca un Label y no ser tan obvio al usuario que pueda editarse. Uso del Espacio en Blanco El uso del espacio en blanco en su interfase de usuario puede ayudarlo a dar nfasis a los elementos y mejorar la facilidad de uso. El espacio en blanco no necesariamente tiene que ser blanco se refiere al uso del espacio en blanco entre y alrededor de los controles en un formulario. Demasiados controles en un formulario pueden conducir a una interfase desordenada, haciendo difcil encontrar un campo individual o un control. Necesita incorporar espacio en blanco en su diseo con intenciones de enfatizar los elementos de su diseo. El consistente espaciado entre controles y la alineacin vertical y horizontal de los elementos tambin pueden hacer que su diseo tenga facilidad de uso. Igual a como el texto en las revistas es organizado en columnas con eventuales espacios entre lneas, una interfase ordenada hace una interfase fcil de leer. Visual Basic proporciona diversas herramientas que facilitan ajustar el espaciado, la alineacin, y el tamao de los controles. Los comandos Align, Make Same Size, Horizontal Spacing, Vertical Spacing, y Center in Form, pueden ser encontrados bajo el men Format. Mantngalo simple Quizs el principio ms importante en el diseo de la interfase es la simplicidad. Cuando se refiere a aplicaciones, si la interfase aparenta ser difcil, probablemente lo ser. Un poco de premeditacin podr ayudarle a crear una interfase que aparezca (y lo sea) simple de usar. Tambin, desde un punto de vista esttico, un limpio, y simple diseo, es siempre preferible. Una trampa comn en el diseo de interfases es tratar y modelar su interfase segn los objetos del mundo real. Imagine, por ejemplo, que se le ha solicitado crear una aplicacin para completar formularios de seguros. Una reaccin natural ser disear una interfase que exactamente duplique el formulario del papel en pantalla. Esto crea diversos problemas: el tamao y dimensiones del formulario del papel son diferentes de aquellos en pantalla, duplicando mucho los lmites del formulario para TextBox y CheckBox, y no existe real beneficio para el usuario.

130

Es mucho mejor disear su propia interfase, quizs proporcionando un duplicado impreso (con impresin previa) del formulario en papel original. A travs de la creacin de agrupamientos lgicos de campos a partir del formulario original, y el uso de interfases de pestaa (tabbed interface) o diversos formularios encadenados, puede presentar toda la informacin sin necesidad de requerir al usuario que navegue. Puede usar tambin controles adicionales tales como cajas de lista cargadas previamente con elecciones, que reduzcan el tiempo de tecleo requerido por el usuario. Puede tambin simplificar muchas aplicaciones tomando funciones usadas con poca frecuencia y movindolas a sus propios formularios. Proporcionar valores por defecto puede algunas veces simplificar una aplicacin; si nueve de diez usuarios seleccionan texto bold, haga que el texto bold sea por defecto en vez de forzar al usuario a hacer elecciones cada vez (no olvide proporcionar una opciones que anule el valor por defecto). Los Wizards pueden tambin ayudar a simplificar tareas complejas o no frecuentes. La mejor prueba de simplicidad es observar su aplicacin en uso. Si un usuario tpico no puede inmediatamente llevar a cabo una tarea deseada sin asistencia, volver a disear la aplicacin estar en curso. Uso del Color e Imgenes El uso del color en su interfase puede agregar atraccin visual, pero es fcil caer en el sobre uso. Con muchas tarjetas de vdeo capaces de desplegar millones de colores, es tentador usarlos todos. El color, igual que los otros principios bsicos de diseo, puede ser problemtico si no es considerado con mucho cuidado en su diseo inicial. Las preferencias por colores varan ampliamente; el gusto del usuario puede no ser igual al suyo. El color puede evocar fuertes emociones, y si est diseando para una audiencia internacional, ciertos colores tienen significados culturales. Es mejor ser conservador, usar colores suaves, colores ms neutrales. Desde luego, su eleccin por los colores puede ser influenciada por quienes va dirigida la aplicacin y por el tono y genio que Usted est tratando de convenir. Rojos brillantes, verdes y amarillos parecen ms apropiados para aplicaciones para nios, pero puede evocar fuerte impresin de poca responsabilidad en una aplicacin de banca. Pequeas cantidades de colores brillantes pueden utilizados con efectividad para dar nfasis o dirigir la atencin hacia un rea importante. A grosso modo, debe de tratar y limitar el nmero de colores en una aplicacin, de esta forma su esquema de color permanecer consistente. Es mejor permanecer con una paleta estndar de 16 colores si es posible; dithering puede causar que otros colores desaparezcan cuando sean visualizados en una tarjeta de vdeo de 16 colores. Otra consideracin en el uso del color es la ceguera del color. Mucha gente no puede diferenciar entre combinaciones de colores primarios, tales como rojo y verde. Para alguien con esta condicin, texto en rojo con fondo verde ser invisible. Imgenes e Iconos El uso de imgenes e iconos puede agregar inters visual a su aplicacin, pero de nuevo, tener cuidado en el diseo es esencial. Las imgenes pueden convenir informacin en forma compacta sin necesidad de texto, pero las imgenes son a menudo percibidas en forma diferente. Barras de herramientas con iconos que representan funciones varias son tiles dispositivos de interfase, pero si el usuario no puede claramente identificar la funcin representada por el icono, ello ser contraproducente. Al disear los iconos de las barras de herramientas, observe otras aplicaciones para comprobar qu estndares estn de hecho establecidos. Por ejemplo, muchas aplicaciones usan una hoja de papel con una esquina de flder para representar el icono New File. Puede existir una mejor metfora para esta funcin, pero representarla en forma diferente podra confundir al usuario.

131

Es tambin importante considerar la significacin cultural de las imgenes. Muchos programas usan la imagen de una caja de estilo rural con una bandera para representar un apartado de correo para representar funciones de correo. Este es una primordial figura reconocida en los EEUU; los usuarios de otros pases o culturas probablemente no lo reconocern como un apartado de correo. Al disear sus propios iconos e imgenes, trate de mantenerlo simple. Imgenes complejas con un montn de colores no se degradan bien cuando se despliegan en un icono de una barra de herramientas de 16 X 16 pxeles, o cuando es desplegados en tarjetas de vdeo de altas resoluciones. Eleccin de Fuentes Las fuentes son tambin una parte importante en su interfase de usuario, en vista de que ellas comunican importante informacin al usuario. Necesita seleccionar las fuentes que sean fcilmente lebles en diferentes resoluciones y en diferentes tipos de tarjetas de vdeo. Es mejor mantenerse con simples fondos sans serif o serif siempre que sea posible. Script y otras fuentes decorativas generalmente se miran mejor en la impresora que en la pantalla, y puede ser difcil leerlas en tamaos menores. A no ser que planea distribuir las fuentes junto con su aplicacin, Usted deber permanecer con los estndares conocidos en las fuentes de Windows, tales como Arial, New Times Roman, o System. Si el sistema del usuario no incluye una fuente especificada, el sistema har una sustitucin, dando por resultado en una apariencia completamente diferente que aquella que era su intencin. Si est diseando para una audiencia internacional, necesitar investigar cules fuentes estn disponibles en la lengua a que va dirigida la aplicacin. Tambin necesitar considerar la extensin del texto cuando est diseando para otros lenguajes las cadenas de texto pueden tomar ms del 50% en algunos lenguajes. De nuevo, la consistencia en el diseo es importante en la eleccin de las fuentes. En la mayora de los casos no deber usar ms de dos diferentes tipos de fuente en dos o tres diferentes tamaos en una aplicacin. Demasiadas fuentes pueden dejar su aplicacin parecindose a una nota de rescate. Diseando para facilidad de uso La facilidad de uso de cualquier aplicacin es ltimamente determinada por el usuario. El diseo de la interfase es un proceso interactivo; es muy raro que el diseo de la interfase quede perfecto desde el inicio. Permitiendo a los usuarios a que se involucren en el proceso de diseo desde muy temprano puede crear una interfase de mayor facilidad de uso con menos esfuerzo. Qu es una Buena Interfase? El mejor lugar para comenzar cuando disee la interfase del usuario es mirar algunas de las aplicaciones mejores vendidas de Microsoft u otras compaas; despus de todo, ellas probablemente no se convirtieron en xitos de venta por la pobreza de su interfase. Ver muchas cosas en comn, tales como barras de herramientas, barras de estado, ToolTips, mens sensitivos al contexto, y tabbed dialogs. No es una coincidencia que Visual Basic proporcione las capacidades para agregar todo esto a sus propias aplicaciones. Puede tambin prestar su propia experiencia como usuario de software. Piense acerca de las aplicaciones que Usted ha usado; qu es lo que ha trabajado y que no, y como podra repararse. Recuerde, sin embargo, que sus gustos y disgustos personales podran no ser iguales que los de sus usuarios; Usted necesitar validar sus ideas con las de ellos. Habr tenido noticias que muchas de las aplicaciones exitosas proporcionan opciones para acomodarse a variadas preferencias. Por ejemplo, el Explorador de Windows de Microsoft permite a los usuarios copiar los archivos con mens, comandos de teclado, o travs de arrastrar y soltar. Proporcionando opciones ampliar la atraccin hacia su aplicacin; como mnimo Usted debe hacer todas las funciones accesibles tanto a travs del ratn como del teclado. Lineamientos de Interfases Windows Una de las principales ventajas del sistema operativo Windows es que este presenta una interfase comn a travs de todas las aplicaciones. Un usuario que conoce como usar una aplicacin bajo Windows estar

132

disponible para aprender con facilidad cualquier otra. Desdichadamente, las aplicaciones que se apartan demasiado lejos de los lineamientos de interfase establecidos no son fciles de aprender. Los mens son un buen ejemplo de esto muchas aplicaciones bajo Windows siguen los estndares de un men File a la izquierda, a continuacin mens opcionales como Edit y Tools, seguidos de Help a la derecha. Podra argumentarse que Documento es un mejor nombre para File, o que el men Help debe de venir primero. No existe nada que le impida hacerlo as, pero si lo hace confundir a sus usuarios y aminorar la facilidad de uso de su aplicacin. Los usuarios se detendrn y pensarn cada vez que se cambien de su aplicacin a otras. La ubicacin de los sub mens es tambin importante. Los usuarios esperan encontrar Copy, Cut y Paste debajo del men Edit; movindolos ellos al men File en el mejor de los casos crear confusin. No se desve de los lineamientos establecidos a no ser que tenga una buena razn para ello. Probando la facilidad de uso La mejor forma de probar la facilidad de uso de su interfase es involucrar a los usuarios a travs de la fase de diseo. Ya sea que est diseando una aplicacin grande o una pequea, el proceso de diseo ser bastante parecido. Usando los lineamientos de diseo establecidos, comenzar diseando la interfase inicialmente sobre papel. El siguiente paso es crear uno o ms prototipos, diseando sus formularios en Visual Basic. Necesitar agregar cdigo suficiente para hacer funcional al prototipo: desplegar formularios, llenar ListBoxes con datos de ejemplo, y dems. Entonces estar lista para efectuar la prueba de facilidad de uso. Las pruebas de facilidad de uso pueden ser procesos informales, revisando su diseo con unos pocos usuarios, o un proceso formal en un laboratorio de facilidad de uso establecido. De cualquier forma, el propsito es el mismo leer de primera mano de los usuarios donde su diseo trabaja y donde necesita mejoras. En vez de cuestionar al usuario, es ms efectivo desencadenar al usuario con la aplicacin y observarlo. El usuario piensa en voz alta a travs del proceso a medida que intenta ejecutar una serie de tareas: Necesito abrir un nuevo documento, por tanto debo encontrarlo bajo el men File. Tome nota dnde el diseo de la interfase no responde a su proceso de pensamiento. Haga la prueba con mltiples usuarios; si mira que diversos usuarios han tenido dificultades con una misma tarea en particular, esa tarea probablemente necesita mayor atencin A continuacin, revisar sus notas y considerar cmo puede cambiar la interfase para hacerla de ms fcil uso. Haga los cambios a la interfase y prubela de nuevo. Una vez que ha quedado satisfecho de que su aplicacin es de fcil uso, estar listo para iniciar la codificacin. Probar la aplicacin durante el proceso de desarrollo para tener certeza de que lo asumido con el prototipo fue vlido. Descubrimiento de caractersticas Uno de los conceptos claves en las pruebas de facilidad de uso es el descubrimiento. Si un usuario no puede descubrir cmo usar una caracterstica (a peor an, que esa caracterstica exista), esa caracterstica es de poco uso. Por ejemplo, la mayora de los usuarios Windows 3.1 nunca supieron de que la combinacin de las teclas ALT,TAB podran ser usadas para cambiar entre aplicaciones abiertas. No exista por ningn lado pista alguna en la interfase que ayudara a los usuarios a descubrir esta caracterstica. Para probar el descubrimiento de una caracterstica requiera al usuario de que ejecute una tarea sin explicarle cmo hacerla (por ejemplo, Crear un nuevo documento usando Form Letter Template). Si l no puede cumplir esta tarea o si le toma varios intentos, el descubrimiento de esta tarea necesitar trabajarse ms. Traduccin: Derechos de Autor: RBsoftware (2001) Martes, 24 de abril 2001. 10:01am. Archivo: Traduccin VB15.

133

Cuando las cosas van mal: Interactuando con el usuario En un mundo ideal, el software y el hardware siempre trabajarn de forma intachable, y los usuarios nunca cometern errores. La realidad dicta que los errores pueden y podrn suceder. Una parte del diseo de la interfase del usuario involucra decidir cmo la aplicacin responder cuando las cosas vayan mal. Una respuesta comn es desplegar una caja de dilogo, solicitando al usuario que introduzca cmo la aplicacin tratar con el problema. Una menos comn (pero preferible) respuesta sera simplemente resolver el problema sin molestar al usuario. Despus de todo el usuario el usuario principalmente est relacionado con efectuar una tarea, no con detalles tcnicos. Al disear la interfase de usuario, piense acerca de los errores potenciales y determine cules requerirn intervencin del usuario y cules podrn ser resueltos a travs de programacin. Creacin de Cajas de Dilogo Inteligentes Ocasionalmente un error ocurre en su aplicacin y no es necesario tomar una decisin para resolver la situacin. Esto usualmente ocurre como una bifurcacin en su cdigo declaraciones IfThen o Case. Si la decisin requiere intervencin del usuario, la pregunta usualmente ser servida al usuario en una caja de dilogo. Las cajas de dilogo son parte de la interfase del usuario, e igual que las otras partes de la interfase, su diseo juega un papel en la facilidad de uso de su aplicacin. Algunas veces parece que las cajas de dilogo fueron diseadas por programadores que nunca han tenido una conversacin inteligente con otro ser humano. Un mensaje tal como Un sector del disco fijo C: est corrupto o inaccesible. Aborte, Intente de Nuevo, Ignore?; tiene muy poco significado para la mayora de los usuarios. Es como si un mesero le preguntara No tenemos sopa y el pollo est en el fuego. Aborte, Intente de Nuevo, Ignore? Cmo podr responder? Es importante construir los mensajes (y elecciones) en una manera que el usuario pueda entender. En el primer ejemplo, un mejor mensaje sera Existe un problema al intentar salvar su archivo en el dispositivo C. Salvarlo en dispositivo A, o No salvar el archivo? Cuando se crean cajas de dilogo para su aplicacin mantenga al usuario en su mente. Transmite el mensaje informacin til al usuario? Es fcilmente comprensible? Presentan los botones de comando elecciones claras? Son apropiadas las elecciones para la situacin dada? Tenga en mente que solamente un mensaje enojoso puede dar a su usuario una mala impresin de su aplicacin. Si est diseando sus propios formularios de dilogo, trate de mantenerse en un estilo estndar. Si vara demasiado el modelo de la caja mensaje estndar, los usuarios no lo reconocern como una caja de dilogo. Manejando errores sin Cajas de Dilogo No siempre es necesario interrumpir al usuario cuando ocurre un error. Algunas veces es preferible manejar el error en cdigo sin necesidad de notificar al usuario, o advertir al usuario de una forma que no detenga el flujo de su trabajo. Un buen ejemplo de esta tcnica es la caracterstica AutoCorrect de Word de Microsoft: si una palabra comn es mal escrita, Word la repara automticamente; si una palabra menos comn es mal escrita, esta es subrayada en rojo de forma que el usuario podr repararla despus. Existe cierto nmero de tcnicas que puede usar; a Usted le corresponde decidir qu tcnicas son apropiadas para su aplicacin. He aqu unas pocas sugerencias: Agregue una funcin Undo al men Edit. En vez de interrumpir al usuario con dilogo de confirmacin para borrar registros y dems, confe en que ellos hacen las decisiones correctas y proporcione la funcin Undo en caso de que cambie de idea ms tarde. Despliegue un mensaje en la barra de estado o icono. Si el error no afecta a la tarea actual del usuario, no detenga la aplicacin. Use las barras de estado o un icono de advertencia de color brillante para advertir al usuario ellos podrn manejar el problema cuando estn listos. Corrija el problema. Algunas veces la solucin de un error es obvia. Por ejemplo, si un disco est lleno cuando el usuario trata de salvar un archivo, verifique el sistema para ver si existe espacio en otros

134

dispositivos. Si existe espacio disponible salve el archivo; ponga un mensaje en la barra de estado para hacer saber al usuario sobre lo que hizo. Guarde el mensaje para despus. No todos los errores son crticos o demandan atencin inmediata; considere enviar estos a un archivo y desplegarlos al usuario cuando abandone la aplicacin o en otro conveniente momento. Si el usuario hace posibles entradas de error (por ejemplo escribe Mangua en vez de Managua) envelos a un archivo. Agregue un botn que se titule Revisar Grabacin y una funcin para desplegar los errores de manera que el usuario pueda corregirlos con facilidad. No haga nada. Algunas veces un error no es lo suficientemente importante para que garantice una advertencia. Por ejemplo, el hecho de que una impresora en LPT1 no tenga papel no significa mucho hasta que Usted intente imprimir. Espere hasta que el mensaje sea apropiado para la tarea actual.

Diseando un Modelo de Asistencia al Usuario No importa cuan magnfica sea su interfase de usuario, habr tiempos en que el usuario necesitar asistencia. El modelo de asistencia al usuario para su aplicacin incluye cosas tales como ayuda en lnea y documentacin impresa; puede tambin contener dispositivos de asistencia al usuario tales como ToolTips, Status Bars, Whats this Help, y Wizards. El modelo de asistencia al usuario debe ser diseado de forma parecida a cualquier otra parte de su aplicacin: antes de comenzar el desarrollo. El contenido de su modelo variar en dependencia de la complejidad de la aplicacin y hacia quien vaya dirigido. Ayuda y documentacin La ayuda en lnea es una parte importante en cualquier aplicacin usualmente es el primer lugar hacia donde el usuario dirige la mirada cuando tiene una pregunta. An una aplicacin simple debe proporcionar ayuda; si esta no se proporciona es como asumir que sus usuarios nunca tendrn preguntas. Al disear su sistema de ayuda, mantenga en mente de que su primer propsito es contestar preguntas. Trate de pensar en trminos del usuario al crear nombres de tpicos y entradas de ndice; por ejemplo: Cmo puedo dar formato a una pgina?, en vez de Men Formato de Pgina, Editar har su tpico fcil de localizar. No olvide la sensibilidad al contexto; la mayora de los usuarios sienten frustracin cuando presionan la tecla F1 por ayuda sobre un campo especfico y encuentran entonces todo el contenido de la ayuda. Documentacin conceptual, sea impresa o proporcionada en disco compacto, es de mucha ayuda incluyendo en las aplicaciones simples. Proporciona informacin que difcilmente puede transmitirse en un corto tpico de ayuda. Por lo menos, debe proporcionar documentacin en la forma de ReadMe que el usuario pueda imprimir si lo desea. Dispositivos de Asistencia al Usuario Dentro de la interfase de usuario existen diversas tcnicas para proporcionar asistencia al usuario. Visual Basic facilita agregar ToolTips, Whats This Help, despliegues de Status y Wizards para sus aplicaciones. A Usted corresponde decidir cuales de estos dispositivos son apropiados para su aplicacin. ToolTips Los ToolTips son un gran medio para desplegar informacin al usuario cuando navega en la interfase de usuario. Un ToolTip es una pequea etiqueta que se despliega cuando el apuntador del ratn es sostenido sobre un control por cierto espacio de tiempo, usualmente conteniendo una descripcin de la funcin del control. Normalmente usados en conjunto con barras de herramientas, los ToolTips tambin trabajan en casi cualquier parte de la interfase. La mayora de los controles contienen una sencilla propiedad para desplegar ToolTips: ToolTipText. El siguiente cdigo implementa un ToolTip para un botn de comando llamado cmdPrint: CmdPrint.ToolTipText = Imprime el Documento Actual.

135

Al igual que otras partes de la interfase, asegrese que el texto claramente conduzca el mensaje que se intenta al usuario. Whats This Help Whats This Help proporciona un enlace a un tpico Help pop-up cuando el usuario selecciona Whats This Help y da clic con el cursor Whats This sobre un control. Whats This Help puede ser iniciado a partir de un botn ToolBar, un elemento de men, o un botn en la barra de ttulo de una caja de dilogo. Para establecer Whats This Help a partir de un men o barra de herramientas: 1. Seleccione el control para el cual desea proporcionar ayuda. 2. En la ventana de propiedades, seleccione la propiedad WhatsThisHelpID. 3. Introduzca un nmero de identificacin de contexto (context ID number) para el tpico Help pop-up asociado. 4. Repita los pasos 1 a 3 para cualquier control adicional. 5. Seleccione el formulario. 6. En la ventana de propiedades, establezca la propiedad WhatsThisHelp del formulario a True. 7. En el evento clic del men o en el botn de la barra de herramientas, introduzca lo siguiente: formName.WhatsThisHelp Cuando el usuario de clic al botn o al men, el apuntador del ratn cambiar al apuntador Whats This. Para habilitar Whats This Help sobre la barra de ttulo de un formulario de dilogo personalizado establezca a True las propiedades WhatsThisButton y WhatsThisHelp del formulario. Despliegue de estados El despliegue de estado puede ser usado para proporcionar asistencia al usuario casi de la misma forma que un ToopTip. Los despliegues de estado son un buen medio para proporcionar instrucciones o mensajes que no pueden alcanzar con facilidad en un ToolTip. El control StatusBar funciona cabalmente para desplegar mensajes; un control Label tambin puede ser usado para desplegar estados. El texto desplegado en una barra de estado puede ser actualizado de una de dos formas: en el evento GotFocus de un control o formulario, o en el evento MouseMove. Si desea usar el despliegue como dispositivo de aprendizaje, agregue un elemento al men Help para que su propiedad Visible se apague y se encienda. Para agregar un despliegue de estado: 1. Agregue un control Label a su formulario. 2. Seleccione el control para el cual desea desplegar un mensaje. 3. Agregue el siguiente cdigo al evento MouseMove (o GotFocus) del control. LabelName.Caption = Teclee el Nmero del Cliente en Este Campo. Cuando el usuario mueve el ratn sobre el control, el mensaje ser desplegado en el control Label. 4. Repita los pasos 2 y 3 para cualquier control adicional. Wizards Un Wizard es un dispositivo de asistencia al usuario que lleva paso a paso al usuario a travs de un procedimiento, trabajando con los datos actuales del usuario. Los Wizard son comnmente usados para proporcionar asistencia a tareas especficas. Ellos ayudan a completar una tarea que podra de otra manera requerir considerable (y no deseable) curva de aprendizaje; ellos proporcionan informacin experta al usuario que an no se ha convertido en experto. Traduccin: Derechos de Autor: RBsoftware (2001) Martes, 24 de abril 2001. 02:31pm. Archivo: Traduccin VB16. Usando los Controles Estndar de Visual Basic Usa controles para que el usuario introduzca datos y para desplegar salida. Algunos de los controles que puede usar en su aplicacin incluyen cajas de texto, botones de comandos y ListBoxes. Otros controles le

136

permiten acceder a otras aplicaciones y procesar estos datos como si la aplicacin remota fuera parte de su cdigo. Cada control tiene su propio juego de propiedades, mtodos y eventos. Este captulo le introduce a los controles estndar en Visual Basic. Introduccin a los Controles de Visual Basic La caja de herramientas de Visual Basic contiene las herramientas que usa para dibujar controles en su formulario. Categoras de Controles Existen tres amplias categoras de controles en Visual Basic: Controles Intrnsecos, tales como el botn de comando y los controles Frames. Estos controles estn contenidos dentro del ejecutable de Visual Basic (.exe). Los controles intrnsecos son siempre incluidos en la caja de herramientas, al contrario de los controles ActiveX y objetos insertables, los cuales pueden ser removidos o agregados a la caja de herramientas. Controles ActiveX, que existen en forma de archivos separados, y que tienen .ocx como extensin a su nombre de archivo. Estos incluyen controles que estn disponibles en todas las ediciones de Visual Basic (DataBoundGrid, ComboBox, ListControl, y dems) y aquellos que estn disponibles solamente en la edicin Profesional y Empresarial de Visual Basic (tales como ListView, ToolBar, Animation, y TabbedDialog). Muchos controles ActiveX de terceras fuentes estn tambin disponibles. Objetos Insertables, tales como el objeto de la Hoja de Trabajo Excel de Microsoft conteniendo la lista de todos los empleados de su compaa, o el objeto Calendario de Proyecto de Microsoft conteniendo informacin de planificacin de un proyecto. Ya que estos pueden ser agregados a la caja de herramientas, ellos tambin pueden ser considerados controles. Algunos de estos objetos tambin soportan Automation, que le permiten programar objetos de otra aplicacin dentro de una aplicacin Visual Basic. Controles Intrnsecos La siguiente tabla detalla los controles intrnsecos encontrados en la caja de herramientas de Visual Basic. Nombre del Control Check Box Nombre de la Clase CheckBox Descripcin Despliega opciones True / False o Yes / No. Puede marcar cualquier nmero de CheckBoxes en un formulario a un mismo tiempo. Combina una caja de texto con un ListBox. Permite al usuario escribir la seleccin o seleccionar un elemento de una lista desplegable. Ejecuta un comando o una accin cuando lo selecciona el usuario. Le permite conectarse a una base de datos existente y desplegar desde ah la informacin en su formulario. Despliega y permite al usuario seleccionar directorios y rutas. Despliega y permite al usuario seleccionar dispositivos de disco vlidos. Despliega y permite al usuario seleccionar de una lista de archivos. Proporciona un contenedor funcional y visual para los controles. Permite al usuario agregar barras de navegacin a los controles que no las proporcionan en forma automtica (estas no

Combo Box

ComboBox

Command Button Data Directory List Box Drive List Box File List Box Frame Horizontal Scroll Bar y

CommandButton Data DirListBox DriveListBox FileListBox Frame Vertical HScrollBar y VScrollBar

137

Image Label Line List Box Contenedor OLE Option Button

Image Label Line ListBox OLE OptionButton

Picture Box

PictureBox

Shape Text Box Timer

Shape TextBox Timer

son las mismas barras de navegacin encontradas intrnsecas en algunos controles). Despliega mapas de bits, iconos o metafiles de Windows, JPEG, o archivos GIF; acta como botn de comando cuando se le da clic. Despliega texto que no interacta con el usuario ni este puede modificar. Agrega un segmento de lnea recta a un formulario. Despliega una lista de elementos, de los cuales el usuario puede elegir uno. Acopla datos dentro de una aplicacin Visual Basic. El control OptionButton, como parte de un grupo de opciones, presenta mltiples elecciones, de las cuales el usuario solo puede elegir una. Despliega mapas de bits, iconos, metafiles de Windows, JPEG, o archivos GIF. Tambin despliega texto o acta como un contenedor visual para otros controles. Agrega rectngulo, cuadrado, elipse, o crculo a un formulario, a un control Frame, o a un control PictureBox. Proporciona un rea para introducir texto o para desplegar texto. Ejecuta eventos de tiempo a un intervalo de tiempo especificado.

Nota: La herramienta Pointer (la primer herramienta en la caja de herramientas) proporciona un medio para mover y cambiar de tamao a formularios y controles. No es un control. Controles ActiveX Estndar Los controles ActiveX tienen .ocx como extensin de nombre de archivo y pueden ser usados en su proyecto agregndolos manualmente a la caja de herramientas. La siguiente tabla detalla los controles ActiveX: Nombre Control Common dialog Data-bound box Nombre Clase CommonDialog Descripcin Proporciona un juego estndar de cajas de dilogo para operaciones tales como abrir y salvar archivos, establecer opciones de impresin y seleccionar colores y fuentes. Proporciona la mayora de las caractersticas del control ComboBox estndar, adems de capacidades de acceso de datos incrementadas. Un control de sujecin que asemeja a una hoja de trabajo que despliega una serie de lneas y columnas representando registros y campos a partir de un objeto Recordset. Proporciona la mayora de las caractersticas de un control ListBox estndar, adems de capacidades de acceso de datos incrementadas. Similar al control DBGrid pero con caractersticas adicionales para dar formato, y sujecin, as como opciones para personalizar.

combo DBCombo

Apex data-bound grid DBGrid Data-bound list box Microsoft FlexGrid DBList MSFlexGrid

138

Agregar y remover Controles ActiveX Usted mueve los controles ActiveX dentro y fuera de la caja de herramientas con los siguientes procedimientos: Para agregar un control ActiveX a la caja de herramientas: 1. A partir del men Project, elija Components. 2. Ponga una marca al CheckBox contiguo al nombre de control .ocx, y despus de clic en OK. Una vez que el control es depositado en la caja de herramientas podr agregarlo a un formulario de la misma forma que lo hace con los controles intrnsecos. Para remover un control ActiveX 1. Remueva todas las instancias del control en todos los formularios de su proyecto. Borre cualquier referencia al control en el cdigo del proyecto. Si se dejan las referencias a un control borrado, se desplegar un mensaje de error cuando compile la aplicacin. 2. A partir del men Project, elija Components. Borre la marca del CheckBox contiguo al nombre del control .ocx y despus de clic en OK. Un mensaje de error ser desplegado si quedan remanentes instancias que hagan referencia a este control. Convenciones para nombramiento de controles Cuando por primera vez crea un objeto (formulario o control), Visual Basic establece su propiedad Name a un valor por defecto. Por ejemplo, todos los botones de comando tienen su propiedad Name inicialmente establecida a Commandn, en donde n es 1, 2, 3, etc. Visual Basic nombra el primer botn de comando dibujado sobre un formulario como Command1, el segundo como Command2, y el tercero como Commnad3. Puede elegir mantener el nombre por defecto; sin embargo, cuando tiene diversos controles del mismo tipo, es probable que tenga sentido cambiar sus nombres por algo ms sugestivo, ms descriptivo. En vista de que puede ser difcil distinguir el botn Command1 en MiForm del botn Command1 de TuForm, una convencin de nombramientos puede ayudar. Esto es especialmente cierto cuando una aplicacin consiste de diversos formularios, mdulos estndar, y mdulos de clase. Puede usar un prefijo para describir la clase, seguido por un nombre descriptivo para el control. Usando esta convencin de nombramientos hace que el cdigo sea ms auto descriptivo y agrupa alfabticamente objetos similares en la Object List Box. Por ejemplo, podra llamar un control CheckBox as: chkReadOnly Los nombres que Usted asigne a formularios y controles deben: Deben comenzar con una letra. Deben contener solamente letras, nmeros y el carcter de subrayado; no son permitidos caracteres de puntuacin ni espacios. No pueden ser mayores que 40 caracteres. Usando el Valor de un Control Todos los controles tienen propiedades que Usted puede usar para almacenar o recuperar valores simplemente haciendo referencia al control, sin tener necesidad de usar el nombre de la propiedad. Esto es llamado el valor del control y es usualmente la propiedad ms importante o la ms comnmente usada. La tabla siguiente detalla las propiedades que se consideran ser el valor de cada control: Control Check Box Combo Box Command Button Common Dialog Data Data-bound combo box Data-bound grid Propiedad Value Text Value Action Caption Text Text

139

Data-bound list box Directory list box Drive list box File list box Frame Horizontal scroll bar Image Label Line List box Option button Picture box Shape Text box Timer Vertical scroll bar

Text Path Drive FileName Caption Value Picture Caption Visible Text Value Picture Shape Text Enabled Value

Siempre que desee referirse a una propiedad de un control que sucede que es el valor de ese control, puede hacerlo sin necesidad de especificar el nombre de la propiedad en su cdigo. Por ejemplo, esta lnea establece el valor de la propiedad Text de un control TextBox: Text1 = Este texto es asignado a la propiedad Text de Text1. En este ejemplo, la propiedad Caption de Label1 es establecida a la propiedad FileName de File1 siempre que el usuario de clic a un archivo en el FileListBox: Private Sub File1_Click ( ) Label1=File1 End Sub Nota: En vista que usar el valor de un control hace que su cdigo sea menos leble, los ejemplos en esta gua no lo utilizan, es decir, hacen referencia explcita a las propiedades de todos los controles. Si desea escribir su cdigo de ambas maneras puede hacerlo, si no le causa problemas su lectura. Trabajando con arreglos de controles Un arreglo de controles es un grupo de controles que comparten el mismo nombre y tipo. Ellos tambin comparten los mismos procedimientos de evento. Un arreglo de controles tiene como mnimo un elemento y puede crecer a tantos elementos como lo permitan los recursos del sistema y la memoria; su tamao tambin depende de la cantidad de memoria y recursos de Windows que cada control requiere. Mxima cantidad de elementos que puede usar en un arreglo de controles es de 32,767. Los elementos del mismo arreglo de controles tienen sus propias propiedades. El uso comn de arreglos de controles incluyen controles de mens y agrupacin de OptionButton. Por qu usar arreglos de controles? Agregar controles con arreglo de controles usa menos recursos que simplemente agregar mltiples controles del mismo tipo a un formulario en tiempo de diseo. Los arreglos de controles son tambin tiles si desea que diversos controles compartan el mismo cdigo. Por ejemplo, si tres botones de opcin son creados como un arreglo de controles, el mismo cdigo es ejecutado sin importar a cul botn se le dio clic. Si desea crear un nuevo control en tiempo de ejecucin, ese control deber ser miembro de un arreglo de controles. Con un arreglo de controles, cada nuevo elemento hereda los procedimientos de evento comunes del arreglo. Sin el mecanismo del arreglo de controles, crear nuevos controles no sera posible, en vista de que un nuevo control completamente no tiene ningn procedimiento de evento. Los arreglos de controles solucionan este problema en vista de que cada control hereda el procedimiento de evento comn que ya ha sido escrito para el arreglo. Por ejemplo, si su formulario tiene diversos TextBox que cada uno recibe datos de fecha, un arreglo de control podr establecerse para que todos los TextBox compartan el mismo cdigo de validacin.

140

Aplicacin de ejemplo: Calc.vbp La aplicacin de ejemplo llamada Calculator contiene dos arreglos de controles los botones nmero y los botones operador. Si ha instalado las aplicaciones de ejemplo las encontrar en VB\Samples\Pguide subdirectorio \Calc. El nombre y los valores de la propiedad Index para los arreglos de controles del ejemplo Calculator se detallan en la siguiente tabla: Number(n) 0 = Number (0) 1 = Number (1) 2 = Number (2) 3 = Number (3) 4 = Number (4) 5 = Number (5) 6 = Number (6) 7 = Number (7) 8 = Number (8) 9 = Number (9) Operator(n) + = Operator (1) - = Operator (2) X = Operator (3) / = Operator (4) = = Operator (5)

Note cmo a cada control se hace referencia con la sintaxis object(index). Usted especifica el ndice de un control cuando lo crea. De hecho, especificar cualquier ndice para un control en tiempo de diseo hace que ese control se convierta en parte de un arreglo. La propiedad index distingue un elemento del arreglo de controles de otro elemento. Cuando uno de los controles en el arreglo reconoce un evento, Visual Basic llama a un procedimiento de evento comn y pasa un argumento (el valor de la propiedad Index) para identificar cual control actualmente reconoce el evento. Por ejemplo, la primer lnea del procedimiento de evento Number_Click es: Private Sub Number_Click (Index As Integer) Si Number (0) reconoce el evento, Visual Basic pasa 0 como argumento de ndice, y si Number (1) reconoce el evento, Visual Basic pasa 1 como argumento de ndice. A excepcin del valor de ndice, el resto del cdigo de Number_Click que es ejecutado es el mismo para todos, desde Number (0) hasta Number (9). Creacin de un arreglo de controles en tiempo de diseo Existen tres formas para crear un arreglo de controles en tiempo de diseo: Asignar el mismo nombre a ms de un control. Copiar un control existente y despus pegarlo en el formulario. Establecer la propiedad Index del control a un valor que no sea nulo. Nota: Debe crear los arreglos de controles de men en el Menu Editor. Para detalles sobre cmo hacer esto vea Creando y Modificando Mens en Tiempo de Ejecucin en Creacin de la interfase de usuario. Para agregar un elemento al arreglo de controles cambindole su nombre: 1. Dibuje los controles que desea que estn en el arreglo de controles (los controles deben ser del mismo tipo). Decida qu control se convertir en el primer elemento del arreglo. 2. Seleccione uno de los controles y cambie su nombre por el nombre del primer elemento en el arreglo. 3. Cuando escribe un nombre que ya exista en el arreglo de controles, Visual Basic despliega una caja de dilogo en donde le solicita confirme que desea crear un arreglo de controles. Elija Yes para confirmar la accin Por ejemplo, si el nombre del primer elemento en el arreglo de controles es cmdCtlArr, y agrega un botn de comando con el mismo nombre cmdCtlArr, Visual Basic despliega el mensaje You already have a control named cmdCtlArr. Do you want to create a control array?. Elija Yes para confirmar la operacin.

141

Los controles agregados de esta forma comparten solamente el nombre de la propiedad y el tipo de control; el resto de las propiedades permanecen iguales a como cuando estaban al ser originalmente dibujado en el formulario. Para agregar un elemento de arreglo de controles a travs del copiado de un control existente: 1. Dibuje un control en el arreglo de controles. 2. Mientras el control tiene el enfoque, elija Copy del men Edit. 3. Elija Paste del men Edit. Visual Basic despliega una caja de dilogo solicitando confirme la creacin del arreglo de controles. Elija Yes para confirmar la accin. A este control se le asigna el valor de ndice 1. Al primer control que dibuj se le asigna el valor de ndice cero. El valor del ndice de cada nuevo elemento de arreglo corresponde al orden en que el elemento fue agregado al arreglo de controles. Cuando los controles son agregados de esta manera, la mayora de las propiedades visuales, tales como alto, ancho y color, son copiadas del primer control en el arreglo de controles al resto de los controles. Agregando a un arreglo de controles en tiempo de ejecucin Puede agregar o remover controles en un arreglo de controles usando las declaraciones Load y Unload. Sin embargo, el control a ser agregado deber ser un elemento de un arreglo de controles existente. Usted deber haber creado un control en tiempo de diseo con la propiedad Index puesta, en muchos casos, en cero. Despus, en tiempo de ejecucin usa esta sintaxis: Load object (index%) Unload object (index%) Argumento Object Index% Descripcin Nombre del control a agregar o borrar del arreglo de controles. El valor de ndice del control en el arreglo de controles.

Cuando carga un nuevo elemento a un arreglo de controles, la mayora de las propiedades son copiadas del elemento de menor valor de ndice existente en el arreglo de controles en este ejemplo, el elemento con valor de ndice cero. Las propiedades Visible, Index, TabIndex no son copiadas automticamente a los nuevos elementos del arreglo de controles, de forma que para hacer visible al nuevo control debe establecer su propiedad Visible a True. Nota: Visual Basic genera un error si intenta usar la declaracin Load con un nmero de ndice que ya exista en el arreglo. Importante: Puede usar la declaracin Unload para remover cualquier control creado con Load. Sin embargo, no puede usar Unload para remover controles creados en tiempo de diseo, sin importar que sean o no parte del arreglo de controles. Escenario de controles: agregando y borrando controles en un arreglo de controles El ejemplo del arreglo de controles demuestra cmo los controles en este caso botones de opcin son agregados y borrados en tiempo de ejecucin. El ejemplo permite al usuario agregar botones de opcin que cambian el color de fondo de un PictureBox. Comience con un formulario, y despus dibuje un PictureBox, un Label, dos botones de opcin, y tres botones de comando. La siguiente tabla lista las propiedades de los objetos en la aplicacin:

142

Objeto Form PictureBox Label Option1 Option2 Command1 Command2 Command3

Propiedad Caption Name Caption Name Index Name Index Name Caption Name Caption Name Caption

Valor Ejemplo Arreglo de Controles. PicDisplay Seleccione un botn de opcin para desplegar un nuevo color. OptButton 0 OptButton 1 CdmAdd &Add CmdDelete &Delete CmdClose &Close

Eventos en la aplicacin del arreglo de controles A continuacin necesita agregar los procedimientos de evento para los botones de opcin y para los botones de comando. Comience agregando la declaracin del formulario: Dim MaxId As Integer El procedimiento de evento click es compartido por todos los botones de opcin: Private Sub optButton_Click (Index As Integer) PicDisplay.BackColor=QBColor(Index+1) End Sub Nuevos botones de opcin son agregados por el procedimiento de evento click segn lo demande el botn de comando Add. En este ejemplo, el cdigo verifica que no ms de diez botones de opcin sean cargado antes de que la declaracin Load sea ejecutada. Una vez que el control es cargado, su propiedad Visible debe ser establecida a True. Private Sub cmdAdd_Click ( ) If MaxId = 0 Then MaxId = 1 establece el total de botones de opcin. If MaxId > 8 Then Exit Sub solamente son permitidos diez botones. MaxId=MaxId + 1 incrementa contador de botones. Load optButton(MaxId) crea un nuevo botn. OptButton(0).SetFocus da enfoque al primer botn. ubica el nuevo botn bajo el botn previo. OptButton(MaxId).Top = optButton(MaxId-1).Top + 400 OptButton(MaxId).Visible=True despliega el nuevo botn. OptButton(MaxId).Caption=Option & MaxId+1 End Sub Los botones de opcin son removidos por el procedimiento de evento click si se da click al botn de comando Delete: Private Sub cmdDelete_Click ( ) If MaxId <=1 Then Exit Sub Unload optButton(MaxId) MaxId=MaxId 1 OptButton.SetFocus End Sub mantiene los dos primeros botones. borra el ltimo botn. disminuye el contador de total de botones. da enfoque al primer botn.

El evento click del botn Close finalizan la aplicacin: Private Sub cmdClose_Click ( ) Unload Me End Sub

143

Usando el control CheckBox El control CheckBox despliega una marca cuando est seleccionado. Es comnmente usado para presentar selecciones al usuario de Yes / No o True / False. Puede usar los controles CheckBox agrupados para desplegar opciones mltiples en donde el usuario puede seleccionar una o ms. El control CheckBox es similar al botn Option en cada uno de ellos son usados para indicar una seleccin que es hecha por el usuario. Lo que los diferencia es que solamente un botn de opcin podr ser seleccionado de un grupo al mismo tiempo. Con los CheckBox, sin embargo, cualquier nmero puede ser seleccionado. Para mayor informacin vea Seleccionando opciones individuales con CheckBoxes en Formularios, Controles y Mens. La Propiedad Valor La propiedad Valor del control CheckBox indica cundo el CheckBox est marcado, sin marca, o no disponible (difuminado). Cuando est seleccionado su valor es establecido a 1. La siguiente tabla lista los valores y las constantes equivalentes que son usadas para establecer la propiedad Valor: Condicin Unchecked Checked Unavailable Valor 0 1 2 Constantes vbUnchecked vbChecked vbGrayed

El usuario da clic al control CheckBox para indicar los estados marcado y sin marca. Puede despus comprobar el estado del control y programar su aplicacin para ejecutar algunas acciones basadas en esta informacin. Por defecto, el control CheckBox tiene la condicin vbUnchecked. Si desea que el programa ponga marcas en diversos CheckBox puede hacerlo estableciendo la propiedad Valor a vbChecked en los procedimientos Form_Load o Form_Initialize. Puede tambin establecer la propiedad Valor a vbGrayed para desactivar (un tercer estado) el CheckBox. Por ejemplo, puede desear desactivar el CheckBox hasta que cierta condicin es conocida. El evento click Cada vez que el usuario da clic al control CheckBox, el evento click es disparado. Usted puede entonces programar su aplicacin para ejecutar alguna accin en dependencia del estado del CheckBox. En el siguiente ejemplo, la propiedad Caption del control CheckBox cambia cada vez que al control se le da clic, indicando estados de marcado y no marcado. Private Sub Check1_Click ( ) If Check1.Value=vbChecked Then Check1.Caption = Marcado. ElseIf Check1.Value = vbUnchecked Then Check1.Caption = Sin Marca. End If End Sub Nota: Si el usuario da doble clic al control CheckBox, cada clic es procesado de forma separada; el control CheckBox no soporta el evento doble clic. Respondiendo al ratn y al teclado El evento click del control CheckBox tambin es disparado cuando recibe el enfoque usando la tecla Alt y despus presionando la barra espaciadora.

144

Puede crear un keyboard shortcut si en la propiedad Caption agrega un carcter ampersand (&) antes la letra en la cadena del Caption. Visualmente realzando el Control CheckBox El control CheckBox, igual que los controles CommandButton y OptionButton, pueden ser visualmente resaltados alterando la condicin de la propiedad Style y despus usando las propiedades Picture, DownPicture y DisablePicture. Por ejemplo, puede desear agregar un icono o mapa de bits al CheckBox o desplegar una imagen diferente cuando al control se le da clic o cuando est desactivado. Traduccin: Derechos de Autor: RBsoftware (2001) Mircoles, 25 de abril 2001. 08:51am. Archivo: Traduccin VB17. Usando el control ComboBox El control ComboBox combina las caractersticas de una caja de texto y un ListBox. Este control permite al usuario seleccionar un elemento ya sea escribiendo texto en el ComboBox, o seleccionndolo de una lista. Los ComboBox presentan una lista de opciones al usuario. Si el nmero de elementos exceden lo que tiene que ser desplegado en el ComboBox, aparecern automticamente sobre el control barras de navegacin. El usuario podr despus navegar dentro de la lista recorrindola de arriba abajo, y de derecha a izquierda. Cuando usar un ComboBox en vez de un ListBox Generalmente, un ComboBox es apropiado cuando existe una lista de elecciones sugeridas, y un ListBox es apropiado cuando desea limitar la entrada a lo que en la lista exista. Un ComboBox contiene un campo de edicin, de forma que las opciones que no estn en la lista pueden ser tecleadas en este campo. Adicionalmente, los ComboBox salvan espacio en un formulario. En vista de que lista completa no es desplegada hasta que el usuario le da clic a la flecha que apunta hacia abajo (exceptuando para el Style 1, el cual incondicionalmente tiene la lista desplegada), un ComboBox puede fcilmente caber en un pequeo espacio en donde el ListBox no calzara. Para mayor informacin vea Usando ListBox y ComboBox en Formularios, Controles y Mens para una simple demostracin de estos controles. Tambin vea Usando el control ListBox ms adelante en este captulo para mayor informacin sobre el control ListBox. Caractersticas de sujecin de datos Para mayor informacin vea Usando Data-Bound ListBox y ComboBox en Accediendo a datos para mayor informacin. Estilos ComboBox Existen tres estilos de ComboBox. Cada estilo puede establecerse en tiempo de diseo o en tiempo de ejecucin y usa valores o constantes Visual Basic equivalentes, para establecer el estilo en el ComboBox. Estilo Drop-down ComboBox Simple ComboBox Drop-down ListBox Valor 0 1 2 Constante VbComboBoxDropDown VbComboSimple VbComboBoxDropDownList

ComboBox Drop Down Esta es la opcin por defecto (Style = 0 DropDown Combo). El usuario puede teclear texto directamente (como en un TextBox) o dar clic a la flecha que se muestra en la parte derecha del ComboBox para desplegar una lista de opciones. La seleccin de una de las opciones hace que esta se inserte en el TextBox ubicado en

145

la parte superior del ComboBox. El usuario puede tambin desplegar la lista presionando ALT + DOWNARROW cuando el control tiene el enfoque. ComboBox Simple Estableciendo la propiedad Style a 1 Simple Combo, la lista es desplegada todo el tiempo. Para desplegar todas las entradas en la lista, debe dibujar la caja de lista lo suficientemente grande como para que quepan todas las entradas. Una barra de navegacin vertical es automticamente insertada cuando existen ms entradas de las que puedan ser desplegadas. El usuario puede entrar texto directamente o seleccionar de la lista. El ComboBox Simple permite al usuario entrar opciones que no se encuentran en la lista. Drop-down ListBox Un Drop-down ListBox (Style = 2) es parecido a un ListBox regular despliega una lista de elementos de los cuales el usuario podr elegir. Sin embargo, al contrario de las cajas de lista, la lista no es desplegada hasta que da clic en la flecha ubicada en la parte derecha superior del ComboBox. La diferencia clave de este estilo es que el usuario no puede teclear en el TextBox, l puede solamente seleccionar un elemento de la lista. Use este tipo de ListBox cuando el espacio sea reducido. Agregando elementos Para agregar elementos a un ComboBox use el mtodo AddItem el cual tiene la sintaxis siguiente: Box.AddItem Item [Index] Argumento Box Item Index Descripcin Nombre de la lista o ComboBox. Expresin de cadena a agregar a la lista. Si Item es una constante literal, entonces encirrelas dentro de comillas. Especifica en qu lugar el nuevo elemento ser insertado en la lista. Un ndice de valor cero representa la primera posicin. Si es omitido el ndice, el elemento es insertado al final (o en el apropiado orden de clasificacin).

Aunque la lista de los elementos son comnmente agregados en el procedimiento de evento Form_Load, puede usar el mtodo AddItem en cualquier momento. Esto le permite a Usted agregar elementos a la lista en forma dinmica (en respuesta a acciones del usuario). El siguiente cdigo sita FlorDeCaa, Victoria, Toa y Belmont en un ComboBox llamado Combo1 con su propiedad Style puesta en cero (vbComboDropDownList): Private Sub Form_Load ( ) Combo1.AddItem Flor de Caa Combo1.AddItem Victoria Combo1.AddItem Toa Combo1.AddItem Belmont End Sub Siempre que el formulario est cargado en tiempo de ejecucin y el usuario de clic a la flecha har aparecer la lista de los elementos. Agregando elementos en tiempo de diseo Puede tambin agregar elementos a la lista en tiempo de diseo estableciendo la propiedad List en la ventana de propiedades del control ComboBox. Cuando selecciona la propiedad List y despus da clic en la flecha, puede comenzar a teclear la lista de los elementos e ir presionando la combinacin de teclas CTRL-ENTER para dar inicio a una nueva lnea.

146

Solamente puede agregar elementos al final de la lista. De forma que, si desea que la lista quede ordenada en orden alfabtico, establezca la propiedad Sorted a True. Vea Clasificando una lista ms adelante para mayor informacin. Agregando un elemento a una posicin especfica Para agregar un elemento a una posicin especfica, especifique un valor de ndice despus de un nuevo elemento. Por ejemplo, la siguiente lnea de cdigo inserta Corona en la primera posicin, moviendo hacia abajo al resto de los elementos: Combo1.AddItem Corona, 0 Observe que cero, no uno, especifica el primer elemento en la lista. Clasificando una lista Puede especificar que los elementos sean agregados a la lista en orden alfabtico estableciendo la propiedad Sorted a True y omitiendo el ndice. Esta opcin de clasificacin no diferencia maysculas de minsculas, de forma que Flor de Caa y flor de caa son tratadas igual. Cuando la propiedad Sorted es establecida a True, usar un mtodo AddItem con un argumento de ndice puede conducir a resultados impredecibles en el orden en que queden los elementos en la lista. Removiendo elementos Puede usar el mtodo RemoveItem para borrar los elementos de un ComboBox. RemoveItem tiene un solo argumento, index, el cual especifica el nmero de elemento a remover: Box.RemoveItem index Los argumentos Box e Index son los mismos que se explicaron en AddItem. Por ejemplo, para remover el primer elemento de la lista, necesita agregar la siguiente lnea de cdigo: Combo1.RemoveItem 0 Para remover todas las entradas en la lista, usa el mtodo Clear: Combo1.Clear Obteniendo el contenido de la lista con la propiedad Text Usualmente, el mtodo ms fcil para obtener el valor del elemento seleccionado actualmente es usar la propiedad Text. La propiedad Text corresponde a lo que se haya enterado en la porcin de la caja de texto en tiempo de ejecucin. Este puede ser, un elemento seleccionado de la lista o una cadena que el usuario teclea en la caja de texto. Por ejemplo, el siguiente cdigo despliega informacin acerca de Victoria si el usuario selecciona Victoria de la caja de lista: Private Sub Combo1_Click ( ) If Combo1.Text Victoria Then Text1.Text = Victoria es el nombre de una cerveza bautizada por Somoza _ para celebrar el fin de la segunda guerra mundial. End If End Sub La propiedad Text contiene el elemento seleccionado actualmente de la caja de lista Combo1. El cdigo comprueba si Victoria ha sido seleccionado, y si lo ha sido, despliega la informacin en la caja de texto. Accediendo a los elementos de la lista con la propiedad List

147

La propiedad List proporciona acceso a todos los elementos en la lista. Esta propiedad contiene un arreglo en el cual cada elemento en la lista es un elemento en el arreglo. Cada elemento es representado en forma de cadena. Para referirse a un elemento en la lista use esta sintaxis: Box.List (Index) El argumento Box es una referencia al ComboBox e Index es la posicin del elemento. El elemento ms arriba tiene valor de ndice cero, el siguiente 1, y as, sucesivamente. Por ejemplo, la siguiente declaracin despliega el tercer elemento (index = 2) de la lista en la caja de texto: Text1.Text = Combo1.List(2) Determinando la posicin con la propiedad ListIndex Si desea conocer la posicin de un elemento seleccionado de un ComboBox, use la propiedad ListIndex. Esta propiedad establece o retorna el ndice del elemento seleccionado en la actualidad en el control ComboBox y est disponible en tiempo de ejecucin. Estableciendo la propiedad ListIndex de un ComboBox tambin genera un evento clic para el control. El valor de esta propiedad es cero si el primer elemento (el de ms arriba) ha sido seleccionado, 1 si es el siguiente hacia abajo, y as, sucesivamente. ListIndex es 1 si no existen elementos seleccionados o cuando un usuario teclea una opcin (Style 0 o 1) en vez de seleccionar un elemento existente en la lista. Nota: La propiedad NewIndex le permite mantener la pista del ltimo elemento agregado a la lista. Esto puede ser til cuando se inserta un elemento dentro de una lista clasificada. Retornando el nmero de elementos con la propiedad ListCount Para conocer el nmero de elementos en un ComboBox use la propiedad ListCount. Por ejemplo, la siguiente declaracin usa la propiedad ListCount para determinar el nmero de entradas en un ComboBox: Text1.Text = Existen & Combo1.ListCount & elementos en la lista. Traduccin: Derechos de Autor: RBsoftware (2001) Mircoles, 25 de abril 2001. 11:25am. Archivo: Traduccin VB18. Usando el control CommandButton El control CommandButton es usado para iniciar, interrumpir o finalizar procesos. Cuando se le da clic invoca a los comandos que hayan sido escritos dentro de su procedimiento de evento Click. La mayora de las aplicaciones Visual Basic tienen botones de comando que permiten al usuario con simplemente darles clic ejecutar acciones. Cuando el usuario elige un botn no solamente lleva a efecto las acciones apropiadas, l da la apariencia de haber sido presionado y soltado y por esta causa tambin se lo conoce como push button. Para mayor informacin vea Dndole clic a los botones para que ejecuten acciones en Formularios, Controles y Mens para una simple demostracin del CommandButton. Agregando un botn de comando a un formulario A Usted le dar placer usar uno o ms botones de comando en su aplicacin. Para agregar botones de comando a un formulario, dibjelos como lo hara con cualquier otro tipo de control. Los botones pueden ser modificados de tamao con el ratn o a travs del establecimiento de las propiedades Height y Width. Estableciendo el ttulo (Caption) Para cambiar el texto desplegado sobre un botn de comando usa la propiedad Caption. En tiempo de diseo puede establecer esta propiedad seleccionndola de la ventana de propiedades del control. Cuando Usted establece la propiedad Caption en tiempo de diseo el texto del botn ser actualizado de manera dinmica.

148

Puede establecer la propiedad Caption hasta un total mximo de 255 caracteres. Si su ttulo excede el ancho del botn de comando, continuar en la lnea siguiente. Sin embargo, se ver recortado si el ttulo no alcanza en el espacio disponible. Puede cambiar la fuente desplegada en el botn de comando seleccionando la propiedad Font. Creacin de Keyboard Shortcuts Puede utilizar la propiedad Caption para crear en el teclado, a travs de combinaciones de letras, acceso a la activacin de comandos, si escribe el carcter ampersand (&) antes de la letra que desea usar como llave de acceso. Por ejemplo, para crear una llave de acceso en el ttulo Imprimir agrega un ampersand antes de la letra I: &Imprimir. En tiempo de ejecucin la letra I ser subrayada y el usuario podr seleccionar el botn de comando si mantiene presionada la tecla Alt y pulsa la tecla I. Nota: Para agregar un ampersand en el Caption y evitar que cree un shortcut, incluya dos ampersands seguidos. Un ampersand sencillo ser desplegado y no existirn caracteres subrayados. Especificando las propiedades Default y Cancel De cada formulario puede seleccionar el botn de comando que ser por Default es decir, siempre que el usuario presione Enter el botn de comando actuar como si se le hubiese dado clic sin importar qu otro control tenga el enfoque. Para especificar un botn de comando como Default establece la propiedad Default a True. Puede tambin especificar que el botn tenga la propiedad Cancel como Default. Cuando la propiedad Cancel de un botn de comando es establecida a True, cada vez que el usuario pulse la tecla ESC ser como darle clic al botn Cancel an cuando otro control tuviera el enfoque. Seleccionando el botn de comando Un botn de comando puede ser seleccionado en tiempo de ejecucin con el ratn o el teclado si hace lo siguiente: Usa el ratn y da clic al botn. Mueve el enfoque hacia el botn teniendo presionada la tecla TAB, y despus, para elegir el botn presionando las teclas barra espaciadora o Enter. Presionar la tecla de acceso (ALT + la letra subrayada) de un botn de comando. Si el botn de comando es el Default para el formulario, presionando Enter se selecciona este control an cuando otro control hubiese estado recibiendo el enfoque. Si el botn de comando tiene Cancel en True, presionando la tecla ESC selecciona el comando, an cuando otro control estuviera recibiendo el enfoque. La Propiedad Valor Cada vez que el botn de comando es seleccionado, su propiedad Value es puesta a True y el evento Click es disparado. Su propiedad Value es puesta a False cuando el botn no ha sido seleccionado. Puede usar la propiedad Value en cdigo para disparar el evento Click del botn de comando. Por ejemplo: CmdClose.Value = True El Evento Click Cuando se da clic al botn de comando es disparado el evento Click y el cdigo que Usted haya escrito en el procedimiento de evento Click es invocado. Dar clic a un botn de comando tambin genera los eventos MouseDown y MouseUp. Si tiene intenciones de agregar procedimientos a estos eventos relacionados asegrese de que las acciones no entren en conflicto. El orden en que estos tres eventos ocurren vara de control a control. En el control botn de comando estos eventos ocurren en este orden: MouseDown, Click, MouseUp. Para mayor informacin vea Respondiendo a los eventos del ratn y del teclado.

149

Nota: Si el usuario da doble clic al botn de comando, cada clic es procesado separadamente; es decir, el botn de comando no soporta el evento doble clic. Visualmente realzando al botn de comando El control botn de comando, igual que los controles CheckBox y OptionButton, pueden ser realzados visualmente alterando la condicin de la propiedad Style y despus usando las propiedades Picture, DownPicture, y DisablePicture. Por ejemplo, puede desear agregar un icono, o un mapa de bits al botn de comando o desplegar una imagen diferente cuando se le da clic al botn o cuando est deshabilitado. Usando el control CommonDialog El control CommonDialog proporciona un juego estndar de cajas de dilogo para operaciones tales como abrir y salvar archivos, establecer opciones de impresin, y seleccionar colores y fuentes. El control tiene tambin la habilidad para desplegar Help haciendo funcionar el motor Windows Help. El control CommonDialog proporciona una interfase entre Visual Basic y las rutinas de la librera de encadenamiento dinmico de Windows de Microsoft, Commdlg.dll. Para crear una caja de dilogo usando este control, Commdlg.dll debe estar en el directorio MicrosoftWindows\System. Usted usa el control CommonDialog en su aplicacin agregndolo a un formulario y estableciendo sus propiedades. El dilogo desplegado por el control est determinado por los mtodos del control. En tiempo de ejecucin, una caja de dilogo es desplegada o el motor Help es ejecutado cuando el mtodo apropiado es invocado; en tiempo de diseo, el control CommonDialog es desplegado como un icono en el formulario. Este icono no puede ser ajustado de tamao. El control CommonDialog permite que despliegue estas comnmente usadas cajas de dilogo: Open Save As Color Font Print Para usar el control CommonDialog: 1. Si an no lo ha hecho, agregue el control CommonDialog a la caja de herramientas seleccionndolo de los Componentes, a travs del men Project. Localice el control en la pestaa Controls y seleccinelo, despus de click al botn OK. 2. Dibuje el control CommonDialog en el formulario. Cuando dibuja un control CommonDialog sobre un formulario, l automticamente cambia de tamao. Al igual que el control Timer, el control CommonDialog es invisible en tiempo de ejecucin. 3. En tiempo de ejecucin use el mtodo apropiado acorde con lo que se lista en la siguiente tabla, para desplegar la caja de dilogo deseada. Mtodo ShowOpen ShowSave ShowColor ShowFont ShowPrinter ShowHelp Dilogo desplegado Open Save Color Font Print Invoca ayuda de Windows

La caja de dilogo Open permite al usuario especificar un dispositivo o particin, un directorio, una extensin de nombre de archivo y un nombre de archivo.

150

La caja de dilogo Save As es en apariencia idntica a la caja de dilogo Open, excepto por su ttulo y los nombres de archivos aparecen difuminados. En tiempo de ejecucin, cuando el usuario elige un archivo y cierra la caja de dilogo, la propiedad FileName es usada para obtener el nombre de archivo seleccionado. Para desplegar la caja de dilogo Open: 1. Especifique la lista de los filtros de archivo que sern desplegados en la caja de lista Files of Type. Puede hacerlo estableciendo la propiedad Filter usando el siguiente formato: description1 | filter1 | description2 | filter2 Description es la cadena desplegada en la caja de lista por ejemplo, Text Files (*.txt). Filter es el filtro de archivo actual por ejemplo *.txt. Cada Description | Filter debe ir separada con el carcter Pipe ( | ) 2. Use el mtodo ShowOpen para desplegar la caja de dilogo.

Despus que el usuario elige un archivo, usa la propiedad FileName para obtener el nombre del archivo seleccionado. Con todas las cajas de dilogo del control CommonDialog, cuando la propiedad CancelError es True, un error es generado cuando el usuario da clic al botn Cancel de la caja de dilogo. Usted detecta que el botn Cancel ha sido presionado atrapando el error cuando la caja de dilogo es desplegada. El siguiente cdigo despliega la caja de dilogo Open y usa el nombre de archivo seleccionado como un argumento de un procedimiento que abre el archivo: Private Sub mnuFileOpen_Click ( ) ver si CancelError es verdadero: On Error Goto ErrHandler establecer los filtros: CommonDialog.Filter = All Files (*.*) | *.* | Text _ Files (*.txt) | .txt |BatchFiles (.bat) | *.bat especificar el filtro por defecto: CommonDialog1.FilterIndex=2 desplegar la caja de dilogo Open: CommonDialog1.ShowOpen llamar al procedimiento de apertura de archivo: OpenFile (CommonDialog1.FileName) Exit Sub ErrHandler: el usuario presion el botn Cancel: Exit Sub End Sub La caja de dilogo Color permite al usuario seleccionar un color de una paleta, o para crear y seleccionar colores personalizados. En tiempo de ejecucin, cuando el usuario elige un color y cierra la caja de dilogo, usa la propiedad Color para obtener el color seleccionado. Para desplegar la caja de dilogo Color: 1. Establezca la propiedad Flags del control CommonDialog a la constante Visual Basic cdlCCRGBInit 2. Use el mtodo ShowColor para desplegar la caja de dilogo. Use la propiedad Color para obtener el valor RGB del color que el usuario seleccione. El siguiente cdigo despliega la caja de dilogo Color cuando el usuario da clic al botn Command1: Private Sub Command1.Click ( ) establecer Cancel a True: CommonDialog1.CancelError=True On Error Goto ErrHandler

151

establezca la propiedad Flags: CommonDialog1.Flags = cdlCCRGBInit despliegue la caja de dilogo Color: CommonDialog1.ShowColor establecer el color del fondo del formulario al color seleccionado: Form1.BackColor = CommonDialog1.Color Exit Sub ErrHandler: el usuario presion el botn Cancel: Exit Sub End Sub Para mayor informacin vea CommonDialog Control Constants en Language Reference en Books Online para ver la lista completa de las constantes y de sus propiedades Flag. La caja de dilogo Font permite al usuario seleccionar una fuente por su tamao, color y estilo. Una vez que el usuario hace las selecciones en la caja de dilogo Font, las siguientes propiedades contienen informacin acerca de la seleccin del usuario: Propiedad Color FontBold FontItalic FontStrikethru FontUnderline FontName FontSize Determina El color seleccionado. Para usar esta propiedad debe primero establecer la propiedad Flags a cdlCFEffects. Cuando bold es seleccionado. Cuando italic es seleccionado. Cuando strikethru es seleccionado. Cuando underline es seleccionado. El nombre de fuente seleccionado. El tamao de fuente seleccionado.

Para desplegar la caja de dilogo Font: 1. Establezca la propiedad Flags a uno de los valores y constantes Visual Basic siguientes: cdlCFScreenFonts (fuentes de pantalla). cdlCFPrinterFonts (fuentes de impresora). cdlCFBoth (fuentes de pantalla y de impresora). Advertencia: Debe establecer la propiedad Flags a uno de estos valores desplegando la caja de dilogo Font. De otra forma aparece el mensaje de error que dice No fonts exists. 2. Use el mtodo ShowFont para desplegar la caja de dilogo. El siguiente cdigo establece las propiedades Font para un TextBox basado en la seleccin del usuario en la caja de dilogo Font: Private Sub Command1_Click ( ) establecer Cancel a True: CommonDialog1.CancelError=True On Error Goto ErrHandler establecer la propiedad Flags: CommonDialog1.Flags=cdlCFBoth Or cdlCFEffects despliega la caja de dilogo Font: CommonDialog1.ShowFont establezca las propiedades de acuerdo a las selecciones del usuario: Text1.Font.Name = CommonDialog1.FontName Text1.Font.Size = CommonDialog1.FontSize Text1.Font.Bold = CommonDialog1.FontBold Text1.Font.Italic = CommonDialog1.FontItalic Text1.Font.Underline = CommonDialog1.FontUnderline Text1.Font.Striketru = CommonDialog1.FontStriketru Text1.ForeColor = CommonDialog1.Color

152

Exit Sub ErrHandler: el usuario presion Cancel: Exit Sub End Sub Para mayor informacin vea CommonDialog Control Constants en Language Reference en Books Online para que vea la lista completa de las constantes y de las propiedades Flags. La caja de dilogo Print permite especificar al usuario cmo ser impresa la salida. El usuario puede especificar un rango de pginas que deben ser impresas, la calidad de la impresin, el nmero de copias, y dems. Esta caja de dilogo tambin despliega informacin acerca de la impresora instalada actualmente y permite al usuario configurar o reinstalar una nueva impresora por defecto. Nota: Esta caja de dilogo en realidad no enva datos a la impresora. Permite al usuario especificar como desea que su dato sea impreso. Usted debe escribir cdigo para imprimir el dato en el formato seleccionado por el usuario. Para mayor informacin vea Trabajando con texto y grficos para informacin sobre impresin de datos. En tiempo de ejecucin, cuando el usuario hace selecciones en la caja de dilogo Print, las siguientes propiedades contienen informacin acerca de la seleccin del usuario: Propiedad Copies FromPage ToPage hDC Determina El nmero de copias a imprimir. El nmero de pgina de donde se iniciar la impresin. El nmero de pgina en donde se detendr la impresin. El contexto del dispositivo para la impresora seleccionada.

Para desplegar la caja de dilogo Print: 1. Establezca apropiadamente las propiedades de la caja de dilogo Print. Por ejemplo, para desplegar 2 en la caja de Copias, establece la propiedad Copies a 2: CommonDialog1.Copies=2 2. Usa el mtodo ShowPrinter para desplegar la caja de dilogo Print. El cdigo siguiente despliega la caja de dilogo Print cuando el usuario le da clic a Command1: Private Sub Command1_Click ( ) Dim BeginPage, EndPage, NumCopies, i establecer Cancel a True: CommonDialog1.CancelError=True On Error Goto ErrHandler despliega la caja de dilogo Print: CommonDialog1.ShowPrinter obtener los valores seleccionados por el usuario de la caja de dilogo: BeginPage = CommonDialog1.FromPage EndPage = CommonDialog1.ToPage NumCopies = CommonDialog1.Copies For i = 1 to NumCopies escriba aqu el cdigo que enva los datos a la impresora: Next Exit Sub ErrHandler: el usuario presion Cancel: Exit Sub End Sub

153

Nota: Si la propiedad PrinterDefault es establecida a True puede imprimir al objeto Printer de Visual Basic. Adicionalmente, cuando la propiedad PrinterDefault es establecida a True cualquier cambio que el usuario haga a la porcin Setup de la caja de dilogo Print son usados para cambiar los establecidos en el setup de la impresora. El mtodo ShowHelp del control CommonDialog le permite desplegar el archivo Help. Para desplegar el archivo Help usando el mtodo ShowHelp: 1. Establezca las propiedades HelpCommand y HelpFile. 2. Use el mtodo ShowHelp para desplegar el especificado archivo Help. El siguiente cdigo despliega el especificado archivo Help cuando el usuario da clic al botn Command1: Private Sub Command1_Click ( ) establecer el botn Cancel a True: CommonDialog1.CancelError=True On Error Goto ErrHandler establezca la propiedad HelpCommand: CommonDialog1.HelpCommand=cdlHelpForceFile especificar el archivo Help: CommonDialog1.HelpFile = c:\windows\Cardfile.hlp desplegar el motor Help de Windows: CommonDialog1.ShowHelp Exit Sub ErrHandler: el usuario dio clic a Cancel: Exit Sub End Sub Para mayor informacin vea HelpCommand Property, HelpFile Property y ShowHelpMethod en Language Reference en Books Online para ms informacin sobre despliegue de archivos Help con el control CommonDialog. Traduccin: Derechos de Autor: RBsoftware (2001) Mircoles, 25 de abril 2001. 06:39pm. Archivo: Traduccin VB19. Usando el Data Control El Data Control es usado para crear aplicaciones de bases de datos simples sin necesidad de escribir ningn cdigo. Puede ser usado para crear aplicaciones con ms caractersticas que le brindan a Usted un alto grado de control sobre sus datos. Los controles Data-BoundList, Data-BoundCombo, Data-BoundGrid y el FlexGrid de Microsoft, son todos capaces de manejar juegos de registros cuando se atan a un Data Control. Todos estos controles permiten que diversos registros puedan ser desplegados y manipulados a la vez. Los controles intrnsecos Picture, Label, TextBox, CheckBox, Image, contenedor OLE, ListBox y ComboBox, tienen tambin cualidades para atender datos y pueden ser atados a un campo sencillo de un Recordset manejado por el DataControl. Controles adicionales con cualidades para atender datos son el MaskedEdit y el RichTextBox disponibles en las ediciones Profesional y Empresarial y en vendedores de terceras fuentes. Para mayor informacin vea Accediendo Bases de Datos con el Data Control en Accediendo datos para una explicacin detallada del data control y cmo es usado con otros controles atentos de datos en Visual Basic.

154

Usando los controles Data Bound DBCombo, DBList, y DBGrid Los controles Data-BoundListBox, ComboBox, y Grid, son usados con el Data Control para desplegar informacin de una base de datos. Los controles Data-Bound ListBox y ComboBox Los controles Data-BoundListBox y ComboBox son diferentes de los controles estndares ListBox y ComboBox en que ellos son automticamente llenados por un Recordset en vez de a travs del uso del mtodo AddItem. Adicionalmente, ambos controles soportan un modo de bsqueda automtica que con rapidez puede localizar elementos en la lista sin cdigo adicional. Para mayor informacin vea Usando el Data-BoundListBox y el ComboBox en Accediendo datos para una detallada explicacin del uso de estos controles. El control Data-BoundGrid El control Data-BoundGrid es parecido a una hoja de trabajo que despliega una serie de filas y columnas representando registros y campos, provenientes de un objeto Recordset. El control Data-BoundGrid es funcionalmente similar al control FlexGrid de Microsoft. Sin embargo, el FlexGrid tiene caractersticas de solo lectura en la sujecin de datos, formatos adicionales, agrupamientos, y caractersticas de sujecin de datos, as como personalizacin de opciones. Para mayor informacin vea Usando el DBGrid en Accediendo Datos para una explicacin detallada del control Data-BoundGrid. Vea Usando el Control FlexGrid de Microsoft ms adelante en este captulo para mayor informacin sobre el control FlexGrid. Usando los controles File-System DirectoryListBox, DriveListBox, y FileListBox Muchas aplicaciones deben presentar la informacin acerca de dispositivos de discos, directorios y archivos. Para permitir al usuario de su aplicacin explorar el sistema de archivos, Visual Basic proporciona dos alternativas: Puede usar las cajas de dilogo estndar proporcionadas por el control CommonDialog, o puede Usted construir dilogos personalizados usando sus propias combinaciones de tres controles especializados: el DriveListBox, el DirectoryListBox y el FileListBox. Puede usar los controles del File-System para permitir al usuario investigar y elegir acerca de los archivos de disco disponibles en su aplicacin. Considere usar el control CommonDialog si solamente necesita una caja de dilogo estndar para abrir o cerrar archivos. Para mayor informacin vea Usando el control CommonDialog. Aplicacin de ejemplo: Winseek.vbp Muchos de los ejemplos de cdigo son tomados de la aplicacin ejemplo WinSeek (Winseek.vbp). Si instal las aplicaciones de ejemplo Usted encontrar esta aplicacin en el subdirectorio \Filectls del directorio principal de Visual Basic (\vb\samples\Misc). Examinando el Sistema de Archivos Cada uno de los controles del sistema de archivos ha sido diseado cuidadosamente para combinar flexibilidad y capacidades de inspeccin sofisticadas al sistema de archivos con fcil programacin. Cada control ejecuta su tarea de recuperacin de datos de archivo automticamente, pero puede escribir cdigo para personalizar su apariencia y para especificar qu informacin ellos deben desplegar. Puede usar los controles del sistema de archivos en forma sencilla o combinada. Con combinaciones puede escribir cdigo en cada procedimiento de evento del control para determinar cmo interactan ellos. O puede dejar que ellos acten de forma independiente.

155

Los controles del sistema de archivos obtienen toda su informacin automticamente del sistema operativo, puede acceder a esta informacin o determinar qu ser desplegado por cada control a travs de sus propiedades. Por ejemplo, el contenido del directorio en que se est trabajando actualmente es desplegado por defecto (es decir, el directorio desde el cual se lanz la aplicacin, o que se ha convertido en el directorio actual como resultado de una declaracin ChDir. Su aplicacin tambin puede desplegar una lista de los archivos con nombres que equivalgan a un modelo, tal como *.frm. Simplemente dibuje un FileListBox en el formulario y establezca su propiedad Pattern a *.frm. Puede tambin especificar la propiedad Pattern en cdigo en tiempo de ejecucin as: File1.Pattern = *.frm Los controles del sistema de archivos le brindan a Usted la flexibilidad que no est disponible en el control CommonDialog. Usted puede mezclarlos de variadas formas, y Usted controla su apariencia y cmo ellos interactan. Si su objetivo es simplemente permitir a los usuarios abrir y salvar archivos, el control CommonDialog proporciona un juego de cajas de dilogo listas para funcionar de inmediato para estas y otras operaciones. Estas son las mismas cajas de dilogo utilizadas por muchas otras aplicaciones basadas en Windows de Microsoft, de forma que ellas proporcionan aspectos y sentimientos estndares. Ellos incluso reconocen dispositivos de redes cuando ellos estn disponibles. Para mayor informacin vea Usando el control CommonDialog ya visto anteriormente. La caja de lista de dispositivos (DriveListBox) La caja de lista de dispositivos es una ListBox con Style drop-down. Por defecto, el dispositivo actual es desplegado en el sistema del usuario. Cuando este control tiene el enfoque, el usuario puede escribir cualquier designacin de dispositivo vlida o dar clic a la flecha ubicada a la derecha del DriveListBox. Cuando el usuario le da clic a la flecha, el ListBox deja caer la lista de todos los dispositivos vlidos. Si el usuario selecciona de la lista un nuevo dispositivo, ese dispositivo se muestra al inicio del ListBox. Puede usar cdigo para examinar la propiedad Drive del DriveListBox para determinar qu dispositivo est seleccionado en la actualidad. Su aplicacin tambin puede especificar qu dispositivo aparece al inicio del ListBox con esta simple asignacin: Drive1.Drive= c:\ El DriveListBox despliega dispositivos disponibles vlidos. Elegir un dispositivo del ListBox no cambia automticamente el dispositivo en que se est trabajando actualmente; sin embargo, puede usar la propiedad Drive para cambiar dispositivos a nivel de sistema operativo especificndola como un argumento de la declaracin ChDrive: ChDrive Drive1.Drive La caja de lista de directorios (DirectoryListBox) El DirectoryListBox despliega la estructura del directorio del dispositivo actual, comenzando con el primer directorio de la lista. Inicialmente el nombre del directorio actual aparece resaltado y con margen con respecto a los directorios que estn ms arriba acorde con la jerarqua, de regreso a la raz. Los sub directorios tienen margen y se ubican debajo del directorio actual en el DirectoryListBox. A medida que el usuario se mueve de arriba abajo en la lista, cada elemento es resaltado. Identificando directorios individuales Cada directorio en la lista tiene una integral que sirve para identificarlo, est asociada a cada directorio y permite a Usted la identificacin de directorios individuales. Esta capacidad no es proporcionada por el control CommonDialog. El directorio especificado por la propiedad Path (Dir1.Path) siempre por valor tiene 1 en el ListIndex. El directorio inmediatamente encima tiene el ListIndex en 2, el que sigue encima 3, y as, sucesivamente, hasta llegar a la raz. El primer sub directorio de Dir1.Path tiene ListIndex 0. Si existen directorios mltiples al nivel del primer sub directorio, el siguiente tiene valor ListIndex de 1, despus 2, y as, sucesivamente.

156

Estableciendo el directorio actual Use la propiedad Path del DirectoryListBox para establecer o retornar el directorio actual en la caja (ListIndex = -1). Por ejemplo, si asigna c:\payroll a Drive1.Path, el directorio \Payroll se convierte en el directorio seleccionado y en funcin actualmente. De forma similar, puede asignar la propiedad Drive del DriveListBox a la propiedad Path del DirectoryListBox: Dir1.Path = Drive1.Drive Cuando esta asignacin es ejecutada el DirectoryListBox despliega todos los directorios disponibles y sub directorios en ese dispositivo o particin. Por defecto, el DirectoryListBox tambin despliega todos los directorios encima y cualquier sub directorio inmediatamente debajo, y el directorio actual de un dispositivo asignado a la propiedad Dir1.Path. El DirectoryListBox no establece el directorio actual a nivel de sistema operativo; solamente resalta el directorio y le da como 1 de valor de IndexValue. Para establecer el directorio actual use la declaracin ChDir. Por ejemplo, la siguiente declaracin cambia el directorio corriente a uno que se despliega en el DirectoryListBox: ChDir Dir1.Path En una aplicacin que use controles de archivos, puede establecer el directorio actual al directorio en donde el archivo (.exe) ejecutable de la aplicacin reside, con el objeto Application: ChDrive App.Path establece el dispositivo ChDir App.Path establece el directorio. Nota: La propiedad Path est disponible solamente en tiempo de ejecucin, no en tiempo de diseo. Para mayor informacin vea App Object en Language Reference en Books Online. Dndole clic a un elemento de directorio Cuando el usuario le da clic a un elemento en el DirectoryListBox, ese elemento es resaltado. Cuando a un elemento se le da doble clic, es asignado a la propiedad Path, su propiedad ListIndex toma 1 por valor y el DirectoryListBox es vuelto a dibujar para mostrar sus sub directorios inmediatos. Encontrando la posicin relativa de un directorio La propiedad ListCount regresa el nmero de directorios debajo del directorio expandido en la actualidad, no el nmero total de elementos en el DirectoryListBox. En vista de que el valor ListIndex del directorio expandido en la actualidad es siempre 1, puede escribir cdigo para determinar cun lejos de la raz del directorio expandido actualmente se encuentra en jerarqua. Por ejemplo: inicializa el directorio expandido actualmente: GoHigher = 0 Dir1.List(x) regresa una cadena vaca si el directorio no existe: Do Until Dir1.List(GoHigher = GoHigher = GoHigher 1 Loop convertir a nmero positivo, si se desea: LevelsAbove = Abs(GoHigher) La caja de lista de archivos (FileListBox) El FileListBox despliega los archivos contenidos en el directorio especificado por la propiedad Path en tiempo de ejecucin. Puede desplegar todos los archivos del directorio actual del dispositivo actual con la siguiente declaracin: File1.Path = Dir1.Path Despus Usted puede desplegar un juego de estos archivos estableciendo la propiedad Pattern por ejemplo *.frm despliega solamente los archivos con esa extensin. La propiedad Pattern puede tambin aceptar una

157

lista delimitada por el smbolo de puntuacin puntos y comas. Por ejemplo, el siguiente cdigo despliega todos los archivos con extensin .frm y .bas. File1.Pattern = *.frm; *.bas Visual Basic soporta el carcter ?. Por ejemplo, ???.txt despliega los archivos que tenga por base solamente tres caracteres con extensin txt. Trabajando con atributos de archivos Los atributos del archivo seleccionado en la actualidad (Archive, Normal, System, Hidden, y ReadOnly) estn tambin disponibles a travs de las propiedades del FileListBox. Usa estas propiedades para especificar qu tipos de archivos desplegar en el FileListBox. El valor por defecto de los atributos System y Hidden es False. El valor por defecto para los atributos Normal, Archive, y ReadOnly es True. Para desplegar solamente archivos ReadOnly en el ListBox simplemente establezca la propiedad ReadOnly a True y los otros atributos a False: File1.ReadOnly = True File1.Archive = False File1.Normal = False File1.System = False File1.Hidden = False Cuando Normal = True, todos aquellos archivos sin atributos System o Hidden son desplegados. Cuando Normal = False, puede desplegar los archivos ReadOnly o Archive estableciendo estos atributos a True. Nota: No puede usar los atributos para establecer atributos de archivo. Para establecer atributos de archivos use la declaracin SetAttr. Por defecto, puede resaltar solamente una seleccin en el FileListBox. Para seleccionar archivos mltiples use la propiedad MultiSelect. Para mayor informacin sobre SetAttr, vea SetAttr Statement en Language Reference en Books Online. Vea tambin MultiSelect Property. Traduccin: Derechos de Autor: RBsoftware (2001) Jueves, 26 de abril 2001. 09:25am. Archivo: Traduccin VB20. Usando juntos los controles del sistema de archivos (FileSystem) Si usa una combinacin de controles del sistema de archivos, Usted puede sincronizar la informacin que ellos despliegan. Por ejemplo, si tiene un DriveListBox, un DirListBox, y un FileListBox, con los nombres por defecto Drive1, Dir1, y File1, la secuencia de eventos sera: 1. El usuario selecciona un dispositivo o particin con el Drive1. 2. Un evento Drive1_Change es generado, y el despliegue Drive1 es actualizado para indicar el nuevo dispositivo. 3. El cdigo en el procedimiento de evento Drive1_Change asigna la nueva seleccin (la propiedad Drive1.Drive) a la propiedad Path del Dir1 con las siguientes declaraciones: Private Sub Drive1_Change ( ) Dir1.Path = Drive1.Drive End Sub 4. La asignacin anterior a la propiedad Path genera el evento Dir1_Change y actualiza el despliegue en Dir1 para reflejar el directorio actual del nuevo dispositivo. 5. El cdigo en el procedimiento de evento Dir1_Change asigna el nuevo Path (la propiedad Dir1.Path) a la propiedad File1.Path del FileListBox.

158

6.

Private Sub Dir1_Change ( ) File1.Path = Dir1.Path End Sub La asignacin a la propiedad File1.Path ocasiona que el despliegue del File1 refleje la especificacin de ruta de Dir1.

Los procedimientos de evento que Usted usa y las propiedades que cambia dependen de la forma en que su aplicacin usa la combinacin de los controles del sistema de archivos. El cdigo en El Escenario de los controles del Sistema de Archivos: Una Aplicacin Buscadora de Archivos ilustra la sincronizacin de los controles aqu descritos. Escenario de controles del sistema de archivos En vista de que los usuarios a menudo desean encontrar rpido un archivo o a un grupo de archivos disponibles en una aplicacin, muchas aplicaciones proporcionan capacidades para investigar el sistema de archivos. La aplicacin de ejemplo, Winseek.vbp le ayuda al usuario a desplegar dispositivos y directorios, y a desplegar cualquier categora de archivos. La siguiente tabla resume los controles en Seek.frm de la aplicacin Winseek: Control DriveListBox DirListBox FileListBox Command1 Command2 ListBox Propiedad Name Name Name Pattern Name Default Name Name Valor DrvList DirList FilList *.* CmdSearch True CmdExit LstFoundFiles

Nota: Los controles del sistema de archivos no tienen propiedades Caption. Aunque Usted puede etiquetarlas y otorgarle acceso al teclado. Para mayor informacin en el uso de Label de esta forma, vea Usando el control Label ms adelante en este captulo. Escribiendo cdigo para la aplicacin Winseek En el DriveListBox, el evento Change es disparado a travs de un simple clic del ratn sobre un elemento. Un evento Change tambin ocurre cuando el usuario selecciona un elemento y despus cambia el enfoque en el formulario. En el DirListBox es necesario un evento doble clic para generar el evento Change. Cuando los usuarios desean cambiar de directorio sin usar el ratn, tpicamente utilizan las teclas de flechas para seleccionar el deseado directorio y despus presionan la tecla Enter. En vista de que Enter es comnmente asociado con el control del botn de comando por defecto, Winseek debe reconocer cundo el usuario simplemente desea cambiar de directorios en vez de conducir la bsqueda de archivos. La aplicacin Winseek soluciona esta ambigedad determinando si la ruta del DirListBox difiere del directorio que est siendo resaltado. Esta situacin puede ocurrir cuando el usuario le da un clic a un elemento en el DirListBox o navega por el DirListBox usando las teclas de flechas. El siguiente cdigo determina cundo dirList.Path es diferente de la ruta del directorio resaltado. Si la ruta es diferente, el DirListPath es actualizado. Si las rutas son las mismas, la bsqueda es ejecutada. Private Sub cmdSearch_Click ( ) . . si el DirList.Path es diferente del directorio actual, actualcelo; si no, ejecuta la bsqueda.

159

If dirList.Path <> dirList.List(dirList.ListIndex) Then DirList.Path = disList.List(dirList.ListIndex) Exit Sub End If ejecute la bsqueda: . . End Sub La aplicacin Winseek usa los siguientes procedimientos para manejar significativos eventos: El procedimiento drvList_Change. El procedimiento dirList_Change. El procedimiento cmdSearch_Click El evento Change del DriveListBox Cuando un usuario le da clic a un elemento en el DriveListBox, su evento Change es generado. El procedimiento de evento drvList_Change es invocado, y el cdigo siguiente es ejecutado: Private Sub drvList_Change ( ) On Error Goto DriveHandler si el nuevo dispositivo fue seleccionado, el Dir1 actualiza su despliegue. DirList.Path = drvList.Drive Exit Sub si hay error, borre drvList.Drive y cpiele el dispositivo que tenga dirList.Path. DriveHandler: DrvList.Drive = dirList.Path Exit Sub End Sub Observe que el evento Change ocurre en un DriveListBox cuando un nuevo dispositivo es seleccionado, ya sea con un simple clic del ratn o cuando el usuario mueve la seleccin (por ejemplo, con una flecha de direccin) el manipulador de errores es disparado por acciones tales como intentar acceder a un dispositivo de disquete mientras la compuerta se encuentra abierta o seleccionar un dispositivo de red que inadvertidamente est desconectado. En vista de que el error previene la asignacin original, dirList.Path todava contiene el previo y vlido dispositivo. Volviendo a asignar dirList.Path a drvList.Drive se corrige este error. Para mayor informacin vea Rastreando su cdigo y manejo de errores. El evento Change del DirListBox Si el usuario le da doble clic a un elemento en el DirListBox, o si la propiedad Path del dirList es cambiada en cdigo (como en el procedimiento drvList_Change), el evento dirList_Change es iniciado. El siguiente cdigo responde a ese evento: Private Sub dirList_Change ( ) actualizar FileListBox para sincronizar con DirListBox: filList.Path = dirList.Path End Sub Este procedimiento de evento asigna la propiedad Path del DirListBox a la propiedad Path del filListBox. Esto provoca un evento Path_Change en el filList, el cual es vuelto a dibujar; no necesita agregar cdigo al procedimiento filList_PathChange, en vista de que en esta aplicacin, la cadena de eventos finaliza en filList. El evento click del botn de comando Este procedimiento de evento determina si el elemento resaltado en el DirListBox es el mismo que dirList.Path. Si los elementos son diferentes, entonces DirListPath es actualizado. Si los elementos son iguales, entonces la bsqueda es iniciada. Private Sub cmdSearch_Click ( ) .

160

. si el DirList.Path es diferente del directorio actual, actualcelo. Si no, ejecute bsqueda: If dirList.Path <> dirList.List (dirList.ListIndex) Then DirList.Path = dirList.List(dirList.ListIndex) Exit Sub End If contine la bsqueda . . End Sub Nota: Puede resaltar su aplicacin Winseek con caractersticas adicionales. Por ejemplo, podra desear usar las propiedades de atributos de controles de archivos. Puede agregar CheckBox para permitir al usuario establecer diferentes combinaciones de atributos de archivos, de tal manera que el FileListBox despliegue archivos escondidos, de sistema, y dems. Usando el control FlexGrid de Microsoft El control FlexGrid de Microsoft proporciona caractersticas avanzadas para desplegar datos en un cuadro. Es similar al control Data-BoundGrid, sin embargo, este no permite al usuario editar los datos, ya sean en la aplicacin externa, o los que estn sujetados y contenidos en el control. Esto le permite desplegar datos al usuario mientras se asegura que los datos permanecen originales y no sufren cambios. Puede agregar caractersticas de edicin de celdas al control FlexGrid de Microsoft combinndolo con una caja de texto. (Vea, para mayor informacin Control FlexGrid de Microsoft Escenario 2: Hoja de Trabajo con Edicin de Celdas.) El control FlexGrid de Microsoft soporta las siguientes caractersticas: Sujecin de datos solo lectura. Habilidad para girar los datos entre columnas y filas. Reagrupacin de datos automtica durante el ajuste de columnas. Adaptacin a cdigo Visual Basic existente para el DBGrid. Habilidad de cada celda para contener texto, una imagen, o ambas. Cambiar el texto actual de la celda en cdigo o en tiempo de ejecucin. Habilidad para leer datos automticamente cuando es asignado a un DataControl. Capacidad de avance de lnea (WordWrap) para el texto dentro de las celdas. Encontrar y sustituir funciones para cadenas complejas. Posibles usos El control FlexGrid de Microsoft puede ser usado en los siguientes escenarios: Para implementar acciones de clasificacin e intercalacin que permitan agrupar la informacin por categora permitiendo al usuario modificar el orden en que la informacin es presentada. Para crear una hoja de trabajo con edicin de celdas, usando los controles Visual Basic estndar. Para implementar un despliegue de datos con realce, con elementos de encabezado que pueden ser colapsados o expandidos con el ratn. Aplicacin de ejemplo: Flex.vbp La aplicacin ejemplo del FlexGrid de Microsoft (Flex.vbp) demuestra muchas caractersticas de este control. Si instal la aplicacin ejemplo, encontrar esta aplicacin en el sub directorio \MSFlexGd, del directorio principal de Visual Basic (\vb\Samples\Pguide). Control FlexGrid de Microsoft Escenario 1: Clasificacin e Intercalacin de Datos Este escenario demuestra cmo Usted puede clasificar e intercalar datos con el control FlexGrid de Microsoft.

161

En la mayora de los casos cargar de datos el control tomndolos de una base de datos. Sin embargo, en este ejemplo se crearn instrucciones para sembrar datos en columnas y filas del control. Los pasos para crear estos datos son los siguientes: 1. Establecer propiedades en el control FlexGrid de Microsoft. 2. Crear datos. 3. Definir rutinas para calcular un ndice y hacer una clasificacin. 4. Definir rutinas para entrada de datos (tomados del paso 2) al control. 5. Permitir al control cambiar escenarios en trminos de organizacin de datos. Establecer propiedades del control FlexGrid Propiedad Valor Name Fg1 Cols 4 Rows 20 MergeCells 2- Restrict Rows FormatString <Region |<Producto FontName Arial

|<Employee |<Sales

Creacin de datos Use esta rutina en el evento Form_Load para crear un arreglo que almacene los datos de ejemplo: Sub Form_Load( ) Dim I As Integer crear el arreglo: For I = Fg1.FixedRows to Fg1.Rows 1 region: Fg1.TextArray(fgi(i,0))=RandomString(0) producto: Fg1.TextArray(fgi(i,1))=RandomString(1) employee: Fg1.TextArray(fgi(i,2))=RandonString(2) Fg1.TextArray(fgi(i,3) = _ Format(Rnd * 10000, #.00) Next establecer los mrgenes Fg1.MergeCol(0)=True Fg1.MergeCol(1)=True Fg1.MergeCol(2)=True ejecutar sort para ver los efectos: DoSort End Sub Definir rutinas para calcular un ndice y hacer una clasificacin Las siguientes dos rutinas son necesarias para calcular un ndice que ser usado con la propiedad TextArray y para clasificar los datos: Function Fgi(r As Integer,c As Integer) As Integer Fgi=c+Fg1.Cols * r End Function Sub DoSort ( ) Fg1.Col = 0 Fg1.ColSel=Fg1.Cols-1 Fg1.Sort = 1 ascendente genrico. End Sub Definir rutina para entrar los datos en FlexGrid

162

A continuacin, defina una sub rutina que introduzca datos ejemplo al control FlexGrid: Function RandomString(kind As Integer) Dim s As String Select Case kind Case 0 region: Select Case (Rnd * 1000) Mod 5 Case 0:s= 1. Northwest Case 1:s= 2. Southwest Case 2:s= 3. Midwest Case 3:s= 4. East Case Else: s= 5. Overseas End Select Case 1 products Select Case (Rnd * 1000) Mod 5 Case 0: s= 1. Wahoos Case 1:s= 2. Trinkets Case 2:s= 3. Foobars Case Else:s= 4: Applets End Select Case 2 employee Select Case (Rnd * 1000) Mod 4 Case 0: s = Mary Case 1: s= Sarah Case 2:s = Donna Case 3:s = Paula End Select RandomString = s End Funcion Permitir que FlexGrid cambie de escenarios en trminos de organizacin de datos Para permitir al usuario que organice sus datos a travs del arrastre de columnas hacia una nueva posicin, agregue las dos rutinas siguientes: Estas rutinas usan la propiedad Tag para salvar el nmero de columna cuando el usuario presiona el botn del ratn, disparndose el evento MouseDown: Sub Fg1_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Fg1.Tag= If Fg1.MouseRow <> 0 Then Exit Sub Fg1.Tag = Str (Fg1.MouseCol) MousePointer = vbSizeWE End Sub Esta rutina reajusta las columnas y clasifica los datos cuando el usuario suelta el botn del ratn, disparndose el evento MouseUp: Sub Fg1_MouseUp (Button As Integer, Shift As _ Integer, X As Single, Y As Single) MousePointer=vbDefault If Fg1.Tag = Then Exit Sub Fg1.Redraw = False Fg1.ColPosition(Val(Fg1.Tag))=Fg1.MouseCol DoSort Fg1.Redraw=True End Sub En tiempo de ejecucin, los datos son automticamente organizados cuando el usuario arrastra una columna a una nueva posicin.

163

Control FlexGrid de Microsoft Escenario 2: Hoja de Trabajo con Edicin de Celdas Este ejemplo ilustra algunos eventos del control FlexGrid de Microsoft y sus capacidades como contenedor. Muestra cmo este control puede ser usado para implementar hojas de trabajo con edicin de celdas utilizando los controles estndar de Visual Basic. Los pasos para la creacin de estos ejemplos son los siguientes: 1. Crear controles. 2. Establecer propiedades. 3. Agregar encabezados a filas y columnas. 4. Agregar edicin de celda. 5. Agregar al TextBox cualidades para actualizacin de datos. 6. Copiar los datos del TextBox al FlexGrid. Setup Los siguientes controles son usados en este escenario: FlexGrid. TextBox Crear controles Para este ejemplo, agregue un control FlexGrid y despus un control TextBox dentro del FlexGrid para crear una relacin padre hijo. Establezca las siguientes propiedades: Objeto Propiedad FlexGrid Name Cols Rows FillStyle FocusRect FontName FontSize TextBox Name FontName FontSize BorderStyle Visible Valor Fg2 6 20 1 Repeat 2 Heavy Arial 9 TxtEdit Arial 9 0 None False

Agregar encabezados a filas y columnas Para modificar el control FlexGrid de forma que se parezca a una hoja de trabajo, agregue el siguiente cdigo al procedimiento Form_Load del formulario: Sub Form_Load ( ) Dim i As Integer haga angosta la primer columna: Fg2.ColWidth(0)=Fg2.ColWidth(0)/2 Fg2.ColAlignment(0)=1 centrar. titule filas y columnas: For i = Fg2.FixedRows To Fg2.Rows 1 Fg2.TextArray(fgi(i,0))=i Next For i = Fg2.FixedCols To Fg2.Cols 1 Fg2.TextArray(fgi(0,i))=i Next inicializa la caja de edicin (entonces ahora la carga): txtEdit =

164

End Sub Despus, crear una funcin para calcular un ndice para la propiedad TextArray: Function Fgi(r As Integer, c As Integer) As Integer Fgi = c + Fg2.Cols * i End Function Agregar edicin de celdas La aplicacin de ejemplo Flex.vbp muestra las funciones necesarias para navegacin y seleccin de rangos de celdas. Para agregar edicin de celdas, el siguiente cdigo necesita ser agregado el evento KeyPress y al evento DoubleClick del control FlexGrid. Sub Fg2_KeyPress (KeyAscii As Integer) MSFlexGridEdit Fg2, txtEdit, KeyAscii End Sub Sub Fg2_DblClick ( ) MSFlexGrid Fg2, txtEdit, 32 simula un espacio. End Sub Para inicializar el TextBox y para pasar el enfoque del control FlexGrid al TextBox agregue la siguiente rutina: SubMSFlexGridEdit (MSFlexGrid As Control, _ Edt As Control, KeyAscii As Integer) use el carcter que fue copiado: Select Case KeyAscii un espacio significa editar texto actual: Case 0 To 32 Edt=MSFlexGrid Edt.SelStart = 1000 cualquier otra cosa significa reemplazar el texto actual: Case Else Edt = Chr(KeyAscii) Edt.SelStart = 1 End Select mostrar Edt en el lugar correcto: Edt.Move MSFlexGrid.CellLeft, MSFlexGrid.CellTop, _ MSFlexGrid.CellWidth, MSFlexGrid.CellHeight Edt.Visible = True dejar que trabaje: Edt.SetFocus End Sub Agregar funcin al TextBox para actualizacin de datos Agregue las siguientes rutinas a los eventos KeyPress y DblClick del TextBox para permitir que los datos sean actualizados: Sub txtEdit_KeyPress (KeyAscii As Integer) borrar returns If KeyAscii = vbCr Then KeyAscii = 0 End Sub Sub txtEdit_KeyDown (KeyCode As Integer, _ Shift As Integer) EditKeyCode Fg2, txtEdit, KeyCode, Shift End Sub Sub EditKeyCode (MSFlexGrid As Control, Edt As _ Control, KeyCode As Integer, Shift As Integer) procesamiento del control de edicin estndar: Select Case KeyCode Case 27 ESC: esconder, retornar enfoque a MSFlexGrid:

165

Edt.Visible = False MSFlexGrid.SetFocus Case 13 ENTER: enfocar MSFlexGrid. MSFlexGrid.SetFocus Case 38 Up. MSFlexGrid.SetFocus DoEvents If MSFlexGrid.Row > MSFlexGrid.FixedRows Then MSFlexGrid.Row = MSFlexGrid.Row 1 End If Case 40 Down. MSFlexGrid.SetFocus DoEvents If MSFlexGrid.Row < MSFlexGrid.Rows 1 Then MSFlexGrid.Row = MSFlexGrid.Row + 1 End If End Select End Sub Copiar datos de un TextBox hacia un FlexGrid de Microsoft Finalmente, Usted necesita decirle al control FlexGrid de Microsoft qu hacer con los datos introducidos a travs del TextBox. El enfoque es regresado al control cuando el usuario introduce los datos y presiona la tecla Enter o si da clic con el ratn en cualquier otra celda del control FlexGrid. El texto del TextBox es copiado dentro de la celda activa. Agregue el siguiente cdigo a los procedimientos de evento GotFocus y LeaveCell. Sub Fg2_GotFocus ( ) If txtEdit.Visible = False Then Exit Sub Fg2=txtEdit TxtEdti.Visible = False End Sub Sub Fg2_LeaveCell ( ) If txtEdit.Visible = False Then Exit Sub Fg2 = txtEdit TxtEdit.Visible = False End Sub En tiempo de ejecucin, el dato podr ser entrado en las diferentes celdas. Control FlexGrid de Microsoft Escenario 3: Despliegue resaltado con encabezados Este proyecto de ejemplo muestra cmo el control FlexGrid puede ser usado para implementar un reporte con ttulos resaltados y con encabezados que pueden ser expandidos o colapsados con el ratn. Los pasos para crear este tipo de reporte: 1. Establezca las propiedades del control FlexGrid. 2. Crear Datos. 3. Agregar funciones para colapsar y expandir. Establezca las propiedades del control FlexGrid Para esta aplicacin, establezca cuatro columnas de encabezado con la propiedad FormatString con la primer columna angosta y vaca (igual que una hoja electrnica) y las otras tres por los datos (incluir el espacio entre cada encabezado). Establezca las siguientes propiedades en control FlexGrid: Propiedad Name Cols Rows Valor Fg3 4 2

166

SelectionMode FillStyle FocusRect GridLines FormatString FontName

1 By Row 1 Repeat 0 None 0 None ^ |Descripcin Arial

|>Date

|>Amount

Crear Datos El procedimiento de evento Form_Load es usado para crear datos de prueba, establecer y calcular los encabezados en la cabecera del control, y para establecer las propiedades Col y Row para seleccionar la primera celda en tiempo de ejecucin. Sub Form_Load ( ) Dim i As Integer, tot As Integer Dim t As String, s As String crear datos ejemplo: t=Chr(9) Fg3.Rows=1 Fg3.AddItem * + t + Air Fare s= +t+ SFO-JFK +t+ 9-Apr-95 + t + 750.00 For i=0 To 5 Fg3.AddItem s Next Fg3.AddItem * + t + Meals s= + t + Flints BBQ + t + 25-Apr-95 _ + t + 35.00 For i=0 To 5 Fg3.AddItem s Next Fg3.AddItem * + t + Hotel s= + t + Center Plaza + t + 25-Apr-95 _ + t + 817.00 For i=0 To 5 Fg3.AddItem = s Next totalizar y dar formato entradas de encabezado: For i=Fg3.Rows 1 To 0 Step 1 If Fg3.TextArray(i*Fg3.Cols)= Then tot=tot+Val(Fg3.TextArray _ (i*Fg3.Cols+3)) Else Fg3.Row=1 Fg3.Col=0 Fg3.ColSel=Fg3.Cols-1 Fg3.CellBackColor=&HC0C0C0 Fg3.CellFontBold=True Fg3.CellFontWidth=8 Fg3.TextArray(i*Fg3.Cols+3)= _ Format(tot,0) tot=0 End If Next select the first row: Fg3.Col=1 Fg3.Row=1 Fg3.ColSel=Fg3.Cols 1 End Sub

167

En tiempo de ejecucin las filas son clasificadas en tres divisiones bajo sus respectivos encabezados: Air Fare, Meals y Hotels. Agregar funcin colapso y expansin Para agregar funciones que permitan que la fila de los encabezados pueda ser expandida o colapsada, agregue el siguiente cdigo al procedimiento de evento DblClick del control: Sub Fg3_DblClick ( ) Dim i As Integer, r As Integer ignore top row: r=Fg3.MouseRow if r<1 Then Exit Sub encontrar campo a colapsar o expandir: While r > 0 And Fg3.TextArray(r*Fg3.Cols)= r=r-1 Wend mostrar smbolo para colapsar y expandir en la primera columna: If Fg3.TextArray(r*Fg3.Cols)= * Then Fg3.TextArray(r*Fg3.Cols)= + Else Fg3.TextArray(r*Fg3.Cols)= * End If expandir los elementos debajo del encabezado actual: r=r-1 If Fg3.RowHeight(r) = 0 Then Do While Fg3.TextArray(r*Fg3.Cols)= Fg3.RowHeight(r)= -1 default row height r=r+1 If r >= Fg3.Rows Then Exit Do Loop colapsar elementos bajo encabezado actual: Else Do While Fg3.TextArray(t * Fg3.Cols) = Fg3.RowHeight( r ) = 0 r=r+1 if r >= Fg3.Rows Then Exit Do Loop End If End Sub En tiempo de ejecucin el usuario puede expandir y colapsar la fila de encabezados dndole doble click en los smbolos + o *, ubicados en la primer columna. Nota: Usted puede fcilmente modificar este ejemplo para que muestre imgenes en vez de los caracteres + o *, o agregar adicionales niveles de resalte. Traduccin: Derechos de Autor: RBsoftware (2001) Viernes, 27 de abril 2001. 00:24am. Archivo: Traduccin VB21. Usando el control Frame Los controles Frame son usados para proporcionar un agrupamiento identificable de otros controles. Por ejemplo, puede usar el control Frame para sub dividir un formulario en forma funcional o para separar grupos de controles de botones de opcin. En la mayora de los casos, usar el control Frame de forma pasiva para agrupar otros controles y no necesitar responder a sus eventos. Sin embargo, desear cambiar sus propiedades Name, Caption o Font.

168

Para mayor informacin vea Agrupando Opciones con Botones de Opcin en Formularios, Controles y Mens para una demostracin simple del uso del control Frame para agrupar botones de opcin. Agregando un control Frame a un formulario Cuando usa el control Frame para agrupar a otros controles, primero dibuja el control Frame, y despus dibuja los controles dentro del control Frame. Esto permite que pueda mover juntos el control Frame y los controles que contenga. Dibujando controles dentro del Frame Para agregar otros controles al Frame, dibjelos dentro del Frame. Si dibuja un control fuera del Frame o usa el mtodo del doble clic para agregar un control al formulario, y despus lo arrastra dentro del control Frame, tendr que mover el Frame y el control de forma separada. Nota: Si tiene controles existentes que desea agruparlos en un Frame, puede seleccionar todos los controles, copiarlos en el clipboard, seleccionar el control Frame, y finalmente pegarlos en el control Frame. Seleccionando mltiples controles en un Frame Para seleccionar mltiples controles en un Frame, mantenga presionada la tecla CTRL y usa el ratn para dibujar un cuadro alrededor de los controles. Cuando suelte el botn, los controles dentro del Frame sern seleccionados. Usando los controles Barras de Navegacin Vertical y Horizontal Las barras de navegacin proporcionan la facilidad de recorrer una lista de elementos de arriba hacia abajo, y de derecha a izquierda. Los controles barra de navegacin vertical y horizontal no son los mismos que las barras de navegacin encontradas en Windows o aquellas que sujetas a TextBox, ListBox, ComboBox o formularios MDI dentro de Visual Basic. Aquellas barras de navegacin aparecen automticamente y lo hacen cuando la aplicacin o el control contiene mayor informacin que la que puede ser desplegada en el tamao de ventana actual (o, en el caso de TextBox y formularios MDI, cuando la propiedad ScrollBars es puesta en True). Los controles de barras de navegacin son valiosos para Visual Basic porque ellos proporcionan la navegacin de aplicaciones o controles que no los proveen ellos en forma automtica. Vea Control Barras de Navegacin Escenario: Creacin de una Ventana Grfica Navegable para informacin sobre el uso de barras de navegacin de esta manera. Cmo trabaja el control Barras de Navegacin Los controles de Barras de Navegacin usan los eventos Scroll y Change para auscultar el movimiento de la caja de navegacin (algunas veces referidas como el thumb) a lo largo de las barras: Evento Descripcin Change Ocurre despus que la caja de navegacin (thumb) es movida. Scroll Ocurre en el momento en que la caja de navegacin es movida. No ocurre si se le da click a las flechas de navegacin o a la barra de navegacin. El uso del evento Scroll proporciona acceso al valor ScrollBar mientras est siendo arrastrado. El evento Change ocurre despus que el thumb ha sido soltado, o cuando se la da clic a las barras de navegacin o a las flechas de navegacin. La propiedad Value La propiedad Value (cuyo valor por defecto es cero) es un valor entero correspondiente a la posicin del thumb en la barra de navegacin. Cuando la posicin del thumb est en valor mnimo se sita en la posicin ms hacia la izquierda si se trata de barras de navegacin horizontales, y ms hacia arriba si se trata de barras de navegacin verticales. Cuando las barras de navegacin estn a su mximo valor, el thumb se mueve a la posicin ms hacia la derecha y abajo. De forma similar, un valor a la mitad del camino ubicar el thumb a la mitad de ambas barras.

169

Adems de usar el ratn para dar clics y cambiar el valor de la barra de navegacin, el usuario tambin puede arrastrar el thumb hacia cualquier punto en la barra de navegacin. El valor resultante depende de la posicin del thumb, pero siempre se encuentra entre el rango de las propiedades Min y Max activadas por el usuario. Nota: Min puede ser mayor que Max si desea que las barras de navegacin recorran informacin en orden descendente (de mayor a menor). Las propiedades LargeChange y SmallChange Para especificar la cantidad de cambios a reportar en una barra de navegacin, use la propiedad LargeChange si da clic en las barras de navegacin, y la propiedad SmallChange cuando da clics en las flechas que estn a los extremos de la barra de navegacin. La propiedad Value de la barra de navegacin se incrementa o disminuye por los valores establecidos por las propiedades LargeChange y SmallChange. Usted puede ubicar el thumb en tiempo de ejecucin estableciendo Value entre cero y 32,767, inclusive. Control Barras de Navegacin Escenario: Creacin de una ventana grfica navegable Las barras de navegacin verticales y horizontales pueden ser usadas, adems del control PictureBox, para crear aplicacin de ventana grfica navegable. Solo el control PictureBox no lo permitir a Usted navegar por un grfico si este excede sus fronteras el control PictureBox no permite que se agreguen barras de navegacin de forma automtica Esta aplicacin usa dos PictureBox. El primero se refiere al estacionario control PictureBox padre (parent). El segundo, que est contenido dentro del padre, es referido como el control PictureBox hijo (child). El PictureBox child contiene la imagen grfica y es movida alrededor y adentro del control PictureBox padre cuando los controles de navegacin son usados. Inicie la creacin de un nuevo proyecto y despus dibuje dos PictureBox, una barra de navegacin vertical y una barra de navegacin horizontal sobre un formulario. El evento Form_Load es usado para establecer el modo de escala, ajustar el PictureBox child dentro del PictureBox padre, la posicin y el tamao de las barras de navegacin vertical y horizontal y despus cargar un grfico de mapa de bits. Agregue el siguiente cdigo en el procedimiento de evento Form_Load: Private Sub Form_Load ( ) Form1.ScaleMode=vbPixels poner escala a pixeles. Picture1.ScaleMode=vbPixels Picture2.AutoSize=True las fronteras del Picture2 iguales al Picture1. Picture1.BorderStyle=0 establecer el BorderStyle a ninguno. Picture2.BorderStyle=0 cargar el mapa de bits: Picture2.Picture= LoadPicture (c:\Windows\Winlogo.bmp) iniciar ubicando ambos Pictures: Picture1.Move 0,0, ScaleWidth VScroll1.Width, _ ScaleHeight HScroll.Height Picture2.Move 0,0 ubicar barra de navegacin horizontal: HScroll1.Top=Picture.Height HScroll1.Left=0 HScroll1.Width=Picture1.Width ubicar barra de navegacin vertical: VScroll1.Top=0 VScroll1.Left=Picture1.Width VScroll1.Height=Picture1.Height establecer la propiedad Max para las barras de navegacin: HScroll1.Max=Picture2.Width Picture1.Width VScroll1.Max=Picture2.Height Picture1.Height determinar si el child picture cubrir la pantalla;

170

si es as no habr necesidad de usar barras de navegacin. VScroll1.Visible=(Picture1.Height < Picture2.Height) Hscroll1.Visible=(Picture1.Width < Picture2.Width) End Sub El evento Change de las barras de navegacin vertical y horizontal es usado para mover el Picture2 child hacia arriba o hacia abajo, hacia derecha e izquierda dentro del PictureBox padre. Agregue el siguiente cdigo al evento Change de ambas barras de navegacin: Private Sub HScroll_Change ( ) Picture2.Left=HScroll1.Value End Sub Private Sub VScroll1_Change ( ) Picture2.Top= - VScroll1.Value End Sub Las propiedades Left y Top del PictureBox child estn puestas a valores negativos de las barras de navegacin vertical y horizontal de tal manera que la navegacin hacia arriba o hacia abajo, o de derecha a izquierda se mueven apropiadamente. Ajustando el formulario en tiempo de ejecucin En el ejemplo antes descrito el tamao visible del grfico est limitado por el tamao original del formulario. Ajustar la ventana grfica cuando el usuario ajusta el formulario en tiempo de ejecucin, agregue el siguiente cdigo al procedimiento de evento Form_Resize. Private Sub Form_Resize ( ) cuando el formulario sea ajustado, cambiar dimensiones de Picture1: Picture1.Height=Form1.Height Picture1.Width=Form1.Width iniciar ubicacin de imagen y barras: Picture1.Move 0,0, ScaleWidth VScroll1.Width, ScaleHeight HScroll1.Height Picture2.Move 0,0 HScroll1.Top = Picture1.Height HScroll1.Left =0 HScroll1.Width=Picture1.Width VScroll1.Top=0 VScroll1.Left=Picture1.Width VScroll1.Height=Picture1.Height HScroll1.Max=Picture2.Width Picture1.Width VScroll1.Max=Picture2.Height Picture1.Width ver si se necesitan barras de navegacin: VScroll1.Visible=(Picture1.Height < Picture2.Height) HScroll1.Visible=(Picture1.Width < Picture2.Width) End Sub Usando el control Image El control Image es usado para desplegar grficos. El control Image puede desplegar grficos en los siguientes formatos: mapa de bits, iconos, metafiles mejorados, o archivos JPEG, y GIF. Adicionalmente, los controles Image responden a eventos click y pueden ser usados como sustitutos de botones de comando, elementos de barras de herramientas, o para crear animaciones simples. Para mayor informacin vea Controles grficos peso pluma en Formularios, controles y mens para una demostracin simple del uso del control Image como un botn de comando. Vea Creacin de una barra de herramientas en Creacin de la interfase del usuario para informacin en el uso de los controles Image para crear barras de herramientas. Vea Creacin de animacin simple en Trabajando con texto y grficos para informacin en el uso de los controles Image para crear animacin simple. Cuando usar un control Image en vez de un control PictureBox

171

El control Image usa menos recursos del sistema y se dibuja y re dibuja ms rpido que un control PictureBox, pero este soporta solamente un grupo de las propiedades, eventos y mtodos del PictureBox. Ambos controles soportan los mismos formatos de grficos. Sin embargo, puede estrechar una imagen en un control Image para que se ajuste al tamao del control. Usted no puede hacer esto con el control PictureBox. Para mayor informacin vea Reduccin sobre grficos en Diseando para funcionamiento y compatibilidad para informacin sobre el uso de los controles Image para conservar recursos del sistema. Formatos grficos soportados El control Image puede desplegar archivos de imagen en cualquiera de los siguientes formatos estndar: Formato Bitmat Descripcin Un Bitmat (mapa de bits) define una imagen como un modelo de puntos (pixeles). Un Bitmap tiene por extensin de nombre de archivo las letras .bmp o .dib. Los Bitmaps son tambin llamados grficos tipo Paint. Puede usar Bitmaps a varios colores de profundidad, incluyendo 2, 4, 8, 16, 24 y 32 bits, pero el Bitmap se despliega correctamente solamente que el dispositivo grfico soporte la profundidad de color usada por el Bitmap. Por ejemplo, un Bitmap de 8 bits por pixel (256 colores) se despliega solamente en 16 colores cuando es mostrado en un dispositivo de 4 bits por pixel (16 colores). El icon es un tipo especial de bitmap. Los iconos tienen un tamao mximo de 32 X 32 pixeles pero existen de 16 X 16 antiguos. Un icon tiene las letras .ico como extensin de nombre de archivo. Un metafile define una imagen como lneas y figuras codificadas. Los metafiles convencionales tienen la extensin de nombre de archivo .wmf. Metafiles mejorados tiene la extensin .emf. Solamente los archivos que sean compatibles con Windows de Microsoft pueden ser cargados. Los metafiles tambin son llamados grficos draw-type. JPEG (Joint Photographics Experts Gruop) es un formato de mapa de bits comprimido que soporta colores de 8 y 24 bits. Este es un popular formato de archivo en Internet. GIF (Graphics Interchange Format) es un formato de mapa de bits comprimido desarrollado originalmente por CompuServe. Soporta un mximo de 256 colores y es un formato de archivo popular en Internet.

Icon Metafile

JPEG GIF

Cargando un grfico dentro de un control Image Los grficos pueden ser cargados dentro del control Image en tiempo de diseo seleccionando la propiedad Picture de la ventana de propiedades del control, o en tiempo de ejecucin usando la propiedad Picture y el mtodo LoadPicture: Image1.Picture=LoadPicture (c:\Windows\Winlogo.bmp) Cuando un grfico es cargado dentro del control Image, el control automticamente se ajusta de tamao para ajustar la imagen sin importar cun pequeo o grande ha sido dibujado el control Image en el formulario. Para borrar el grfico del control Image, usa el mtodo LoadPicture sin especificar un nombre de archivo. Por ejemplo: Image1.Picture=LoadPicture Esto borrar la imagen del control Image an cuando esta hubiese sido creada en tiempo de diseo, cargando el grfico con la propiedad Picture. Usando el clipboard Usted tambin puede agregar un grfico a un control Image en tiempo de diseo pegndolo desde otra aplicacin. Por ejemplo, desea agregar un mapa de bits creado en Windows con Paint. Simplemente, copia la imagen al clipboard, selecciona el control Image y ah pega la imagen, ya sea usando CTRL+V, o el comando Paste, del men Edit.

172

La propiedad Stretch La propiedad Stretch determina si el grfico ser estrechado cuando el control Image sea ajustado de tamao en tiempo de diseo. Si se establece a True, el grfico cargado dentro del control Image va propiedad Picture es estrechado. Estrechar un grfico (especialmente uno con formato de mapa de bits), puede producir una prdida de calidad en la imagen. Traduccin: Derechos de Autor: RBsoftware (2001) Viernes, 27 de abril 2001. 11:39am. Archivo: Traduccin VB22. Usando el control Label Los controles Label son usados para desplegar texto y no pueden ser editados por el usuario. Son usados para identificar objetos en un formulario proporcionan una descripcin de lo que har cierto control si se le da clic, por ejemplo o en tiempo de ejecucin, ellos pueden desplegar informacin en respuesta a eventos o procesos dentro de su aplicacin. En muchos casos son usados los Label, por muchos y diferentes propsitos. Ms comnmente, ellos son usados para dar ttulo a controles que no tienen su propia propiedad Caption. Puede usar el control Label para agregar etiquetas descriptivas a TextBox, ListBox, ComboBox, y dems. Tambin pueden ser usados para agregar texto descriptivo en un formulario, por ejemplo, para proporcionar instrucciones de ayuda al usuario. Usted tambin puede escribir cdigo que cambie el texto desplegado en un control Label en respuesta a eventos en tiempo de ejecucin. Por ejemplo, si su aplicacin toma unos pocos minutos para procesar un cambio, puede desplegar un mensaje de estado de procesamiento en un control Label. En vista de que el control Label no puede recibir enfoque, puede ser usado para crear teclas de acceso para otros controles. Estableciendo la propiedad Caption del control Label Para cambiar el texto desplegado en el control Label, usa la propiedad Caption. En tiempo de diseo, puede establecer esta propiedad seleccionndola de la ventana de propiedades del control. Puede establecer la longitud de la propiedad Caption hasta un mximo de 1024 bytes. Alineacin de texto La propiedad Alignment le permite establecer la alineacin del texto en el control Label, ya sea justificado a la izquierda (0, por defecto), al centro (1), justificado a la derecha (2). Las propiedades AutoSize y WordWrap Por defecto, cuando el texto que es introducido en la propiedad Caption excede el ancho del control, el texto se quiebra y contina en la siguiente lnea, y es cortado si excede la altura del control. Para permitir al control que automticamente se ajuste al tamao de su contenido, se establece la propiedad AutoSize a True. El control se expandir horizontalmente para calzar en el entero contenido de la propiedad Caption. Para permitir que el contenido se quiebre hacia abajo y se expanda verticalmente, establezca la propiedad WordWrap a True. Para mayor informacin vea Usando Label para desplegar texto en Formularios, controles y mens para una simple demostracin de las propiedades AutoSize y WordWrap. Usando Label para crear teclas de acceso Establecer la propiedad UseMnemonic a True si desea definir un carcter en la propiedad Caption del Label como una tecla de acceso. Cuando define una tecla de acceso en el control Label el usuario puede, manteniendo presionada la tecla Alt y despus presionando el carcter por Usted designado para mover el enfoque al siguiente control en el orden tab.

173

Puede crear teclas de acceso para cualquier otro control que tenga propiedad Caption si agrega un ampersand (&) antes de la letra que Usted desee sea la tecla de acceso. Para asignar una tecla de acceso a controles que no tienen Caption, agrguele un control Label. En vista de los Label no pueden recibir el enfoque, el enfoque se mueve inmediatamente al otro control en el orden tab. Use esta tcnica para asignar teclas de acceso a TextBox, PictureBox, ComboBox, ListBox, DriveListBox, DirListBox, cuadros e imgenes. Para asignar una tecla de acceso a un control con una etiqueta: 1. Dibuje primero el Label, y despus dibuje el control. O, dibuje los controles en cualquier orden y establezca la propiedad Index del Label a uno menos que el control 2. Use un ampersand (&) en la propiedad Caption del Label para asignar la llave de acceso. Nota: Puede desear desplegar ampersands (&) en el control Label, no usarlos para crear teclas de acceso. Esto puede ocurrir si Usted sujeta un control Label a un campo en un Recordset cuando el dato incluye ampersands. Para desplegar ampersands en el control Label, establezca la propiedad UseMnemonic a False. Usando el control Line El control Line es usado para crear segmentos de lnea simple sobre un formulario, o dentro de un PictureBox. Puede controlar la posicin, longitud, color y estilo del control Line para personalizarlo. El control Line tiene una funcin limitada y es dirigido para usos simples despliegue e impresin. Los controles Line no pueden unirse para formar otras figuras, por ejemplo. Para uso ms avanzados Usted necesitar el mtodo Line. Para mayor informacin vea Usando mtodos grficos en Trabajando con texto y grficos para ms informacin acerca del dibujo de lneas, rectngulos, y cajas rellenas en tiempo de ejecucin usando el mtodo Line o para mayor informacin sobre el dibujo de crculos, elipsis, y arcos en tiempo de ejecucin usando el mtodo Circle. Estableciendo estilo de borde y color Establece el color y estilo de una lnea utilizando las propiedades BorderStyle y BorderColor. La propiedad BorderStyle proporciona seis tipos de estilos de lnea: Transparent. Solid. Dash. Dot. Dash-Dot. Dash-Dot-Dot Inside Solid Puede especificar estilo de lnea en tiempo de diseo eligiendo la propiedad BorderStyle de la ventana de propiedades del control Line, o en tiempo de ejecucin, especificando en cdigo el estilo usando sus equivalentes constantes Visual Basic. La propiedad BackColor es usada para especificar el color de la lnea. En tiempo de diseo puede establecer el color de la lnea a travs de la propiedad BorderColor de la ventana de propiedades del control Line y despus seleccionar el color de una paleta o de colores del sistema. Para establecer los colores en tiempo de ejecucin, use las constantes de color Visual Basic (vbGreen, por ejemplo) o las constates de color del sistema (vbWindowBackground, por ejemplo, o la funcin RBG para especificar colores del borde.

174

Nota: Cuando BorderStyle es puesta a cero (transparente), la propiedad BorderColor es ignorada. Para mayor informacin vea Constantes de color en Language Reference en Books Online para obtener una lista de las constantes de color Visual Basic. Vea Funcin RGB en Language Reference en Books Online para informacin acerca de la especificacin colores RGB. Tambin, refirase a Trabajando con texto y grficos para una informacin detallada sobre la creacin de grficos con Visual Basic. Moviendo y ajustando la lnea Puede mover o ajustar el control Line en tiempo de ejecucin alterando sus propiedades X1, X2, Y1 y Y2. Las propiedades X1, Y1, establecen la posicin horizontal y vertical del final izquierdo de la lnea. Las propiedades X2, Y2, establecen la posicin horizontal y vertical del final derecho de la lnea. Usted no puede mover una lnea usando el mtodo Move. Dibujando lneas en un formulario Puede usar el control Line para dibujar lneas simples sobre el formulario. Para dibujar una lnea sobre un formulario: 1. De la caja de herramientas, seleccione el control Line. Cuando el apuntador se mueve sobre el formulario, el apuntador cambia su imagen a una fina cruz. 2. De clic sobre el formulario, en el lugar en donde desee se inicie la lnea, no suelte el botn del ratn. 3. Arrastre la fina cruz hasta donde lo desee, y ah suelte el botn del ratn. 4. A partir de la ventana de propiedades, seleccione la propiedad BorderStyle si desea cambiar la apariencia de la lnea. 5. En la caja de valores (Settings) establezca el estilo que desea. Usando el control ListBox El control ListBox despliega una lista de elementos de la cual el usuario podr seleccionar una o ms. Los ListBox presentan una lista de opciones al usuario. Por defecto, las opciones son desplegadas verticalmente en una sencilla columna, aunque puede establecer tambin columnas mltiples. Si el nmero de elementos excede lo que pueda ser desplegado en el ListBox, aparecen automticamente barras de navegacin sobre el control. El usuario puede entonces recorrer la lista de arriba abajo y de derecha a izquierda Caractersticas de sujecin (Data-Bound) de datos Visual Basic incluye las versiones estndar y data-bound del control ListBox. Aunque ambas versiones permiten desplegar, editar y actualizar informacin de la mayora de bases de datos estndar, el data-bound proporciona ms avanzadas caractersticas de acceso de datos. El control Data-Bound ListBox tambin soporta diferente juego de propiedades y mtodos que el control ListBox estndar. Para mayor informacin vea Usando el Data-Bound List Box y ComboBox en Accediendo datos. Eventos click y doble click Una prctica recomendada para los eventos ListBox, especialmente cuando el ListBox aparece como parte de una caja de dilogo, es agregar un botn de comando a usar con el ListBox. El procedimiento de evento click para este botn debe hacer uso de la seleccin del ListBox, arrastrando cualquier accin que sea apropiada para su aplicacin. Dar doble clic a un elemento en la lista debe tener el mismo efecto como si se seleccionara el elemento de la lista y se diera click al botn de comando. Para hacer esto, agregue el procedimiento DblClick del control ListBox, que incluya una llamada al procedimiento Click del botn de comando: Private Sub List1_DblClick ( ) Command1_Click End Sub O, establezca a True la propiedad Value del control botn de comando, lo cual har que automticamente se invoque el procedimiento de evento: Private Sub List1_DblClick ( )

175

Command1.Value=True End Sub Esto proporciona a los usuarios de ratn de un acorta paso, pero no lo permite a los usuarios del teclado. Note que en el teclado no existe equivalente para el doble clic. Agregando elementos a la lista Para agregar elementos a la lista, use el mtodo AddItem, el cual tiene la siguiente sintaxis: Box.AddItem Item [index] Argumento Descripcin Box Nombre del ListBox Item Expresin de cadena a agregar a la lista. Si Item es una constante literal, encirrelas con comillas. Index Especifica dnde el nuevo elemento ser insertado en la lista. Un ndice cero representa la primera posicin. Si Index es omitido, el elemento es insertado al final (o en su propio orden de clasificacin). Aunque los elementos de lista son comnmente agregados en el procedimiento de evento Form_Load, puede usar el mtodo AddItem en cualquier tiempo. Esto le da habilidad para agregar elementos a la lista en tiempo de ejecucin (como respuestas a acciones del usuario). El siguiente cdigo sita Germany, India, France, y USA dentro del ListBox llamado List1: Private Sub Form_Load ( ) List1.AddItem Germany List1.AddItem India List1.AddItem France List1.AddItem USA End Sub Agregando un elemento a una posicin especificada Para agregar un elemento a la lista en la posicin especificada, especifique un valor de ndice para el nuevo elemento. Por ejemplo, la siguiente lnea de cdigo inserta Japan en la primer posicin, ajustando la posicin de los otros elementos hacia abajo: List1.AddItem Japan, 0 Advierta que es CERO no uno el valor de ndice que especifica al primer elemento en el ListBox. Agregando elementos en tiempo de diseo Puede dar entrada a los elementos en la lista en tiempo de diseo estableciendo la propiedad List de la ventana propiedades del control ListBox. Cuando selecciona la propiedad List y da clic a la flecha que seala hacia abajo, manualmente puede introducir elementos a la lista y presionar la combinacin de teclas CTRL+ENTER para comenzar una nueva lnea. Solamente puede agregar elementos al final de la lista. As que, si desea una lista alfabtica, establezca la propiedad Sorted a True. Vea Clasificando una lista ms adelante para mayor informacin. Clasificando una lista Puede especificar que los elementos sern agregados a la lista en orden alfabtico estableciendo la propiedad Sorted a True y omitiendo el ndice. La clasificacin no es sensitiva, o sea que no distingue maysculas ni minsculas, as Japan y japan son tratadas por igual. Cuando la propiedad Sorted es establecida a True, el uso del mtodo AddItem con el argumento Index puede conducir a resultados impredecibles, o a rdenes de clasificacin sin orden alguno.

176

Removiendo elementos de la lista Puede usar el mtodo RemoveItem para borrar elementos de un ListBox. RemoveItem tiene un solo argumento, Index, el que especifica el elemento a eliminar: Box.RemoveItem index Los argumentos Box e index son los mismos explicados en AddItem. Por ejemplo, para remover el primer elemento de la lista, debe agregar el siguiente cdigo: List1.RemoveItem 0 Para remover todas las entradas en las versiones bound y estndar de ListBox y ComboBox, usa el mtodoClear: List1.Clear Obteniendo contenido de la lista con la propiedad Text Usualmente, la forma ms fcil de obtener el valor de un elemento actualmente seleccionado es usar la propiedad Text. La propiedad Text siempre corresponde a un elemento de lista que el usuario selecciona en tiempo de ejecucin. Por ejemplo, el siguiente cdigo despliega informacin acerca de la poblacin del Canad si un usuario selecciona Canad de un ListBox: Private Sub List1.Click ( ) If List1.Text = Canad Then Text1.Text = Canad, tiene 24 millones de personas. End If End Sub La propiedad Text contiene el elemento seleccionado actualmente en el ListBox List1. El cdigo chequea si Canad ha sido seleccionado, y, si lo ha sido, desplegar la informacin en el TextBox. Accediendo a elementos de la lista con la propiedad List La propiedad List proporciona acceso a todos los elementos en la lista. Esta propiedad contiene un arreglo en el cual cada elemento en la lista es un elemento del arreglo. Cada elemento es representado en forma de cadena. Para referirse a un elemento en la lista use esta sintaxis: Box.List(Index) El argumento Box es una referencia al ListBox, e ndex es la posicin del elemento. El primer elemento tiene un ndice de cero, el segundo 1, y as, sucesivamente. Por ejemplo, la siguiente declaracin despliega el tercer elemento (index=2) en una lista en un TextBox: Text1.Text =List1.List(2) Determinando la posicin con la propiedad ListIndex Si desea conocer la posicin del elemento seleccionado en la lista, use la propiedad ListIndex. Esta propiedad establece o retorna el ndice del elemento seleccionado actualmente en el control y est disponible nicamente en tiempo de ejecucin. Estableciendo la propiedad ListIndex para un ListBox tambin genera el evento click para el control. El valor de esta propiedad es cero si est seleccionado el primer elemento, 1 para el siguiente hacia abajo, y as, sucesivamente. ListIndex es 1 si no existen elementos seleccionados. Nota: La propiedad NewIndex le permite mantener la pista del ndice del ltimo elemento agregado a la lista. Esto puede ser til cuando inserte en elemento a una lista clasificada. Retornar el nmero de elementos con la propiedad ListCount Para retornar el nmero de elementos en un ListBox, use la propiedad ListCount. Por ejemplo, la siguiente declaracin usa la propiedad ListCount para determinar el nmero de entradas en un ListBox: Text1.Text= You have & List1.ListCount & Entries listed

177

Creacin de ListBox con columnas mltiples y selecciones mltiples La propiedad Columns le permite especificar el nmero de columnas en un ListBox. Esta propiedad puede tener los siguientes valores: Valor Propiedad 0 ListBox de columna sencilla con barra de navegacin vertical. 1 ListBox de columna sencilla con barra de navegacin horizontal. >1 ListBox de columnas mltiples con navegacin horizontal. Visual Basic tiene el cuidado quebrar las lneas y continuarlas en la siguiente y agregar barras de navegacin horizontales para la lista si es necesario; si la lista llena una columna sencilla, no se agregan barras de navegacin. Rupturas de columnas tambin existen y son manejadas automticamente como se necesite. Note que si una entrada a un ListBox es ms ancha que lo ancho de la columna, el texto es truncado. Puede permitir a los usuarios seleccionar mltiples elementos de una lista. Las selecciones mltiples en ListBox estndar son manejadas por la propiedad MultiSelect, la cual solamente puede tener los valores siguientes: Valor Tipo de Seleccin Descripcin 0 None ListBox estndar 1 Seleccin Mltiple Un click o la barra espaciadora selecciona y retira la seleccin a Simple adicionales elementos en la lista. 2 Seleccin Mltiple La tecla Shift+click o Shift+flecha extiende la seleccin para Extendida incluir a todos los elementos entre el actual la seleccin previa. CTRL+Click selecciona y retira la seleccin a los elementos en la lista. Para mayor informacin vea Control ListBox Escenario 2: Creacin de ListBox de columnas mltiples ms adelante en este captulo. Control ListBox Escenario 1: Agregando y Borrando Elementos Este ejemplo muestra cmo puede usar los mtodos AddItem, RemoveItem, y Clear, con las propiedades ListIndex y ListCount para agregar y remover entradas a la lista en tiempo de ejecucin. Este ejemplo, permite al usuario teclear el nombre del cliente en el TextBox, que puede ser agregado al ListBox si al botn Add se le da click. Un usuarios puede remover un elemento existente en la lista seleccionando el elemento y dndole click al botn Remove, o dar click al botn Clear para borrar todas las entradas en la lista. El nmero de clientes en el ListBox es desplegado en un Label que parece un TextBox (BorderStyle es 1, Fixed Single). Este Label es actualizado cada vez que un nombre de cliente es agregado o removido. En vista de que la propiedad Sorted para el ListBox es puesta en True, los elementos son agregados a la lista en orden alfabtico. Crear un formulario con un TextBox, un ListBox, tres Label, y cuatro botones de comando. La siguiente tabla lista las propiedades de los objetos en la aplicacin: Objeto Propiedad Valor Top TextBox Name TxtName Text (Vaco) Top Label Name LblName Caption &Name to Add ListBox Name LstClient Sorted True Botton Label Name LblClients Caption #Clients Label nmero de clientes Name LblDisplay Caption (Vaco) (parece TextBox) BorderStyle 1- FixedSingle Primer Comando Name CmdAdd Caption &Add

178

Segundo Comando Tercer Comando Cuarto Comando

Name Caption Name Caption Name Caption

CmdRemove &Remove CmdClear C&lear CmdClose &Close

Eventos en la aplicacin ListBox Agregue este cdigo al procedimiento de evento cmdAdd_Click: Private Sub cmdAdd_Click ( ) LstClient.AddItem txtName.Text agregar a la lista. TxtName.Text = limpiar TextBox. TxtName.SetFocus desplegar nmero: lblDisplay.Caption = lstClient.ListCount End Sub Agregar este cdigo al procedimiento de evento cmdRemove_Click: Private Sub cmdRemove_Click ( ) Dim Ind As Integer Ind=lstClient.ListIndex obtener indice. asegurarse que el elemento est seleccionado: If Ind>=0 Then removerlo de la lista: lstClient.RemoveItem Ind desplegar nmero: lblDisplay.Caption = lstClient.ListCount Else Beep End If difuminar botn si no hay entradas en la lista: cmdRemove.Enabled = (lstClient.ListIndex <> -1) End Sub Agregar este cdigo al procedimiento de evento cmdClear_Click: Private Sub cmdClear_Click ( ) vaciar lista: lstClient.Clear desactivar botn Remove: cmdRemove.Enabled = False desplegar nmero: lblDisplay.Caption = lstClient.ListCount End Sub Agregar este cdigo al procedimiento de evento cmdClose_Click: Private Sub cmdClose_Click ( ) Unload Me End Sub Agregar este cdigo al procedimiento de evento lstClient_Click: Private Sub lstClient_Click ( ) CmdRemove.Enabled = lstClient.ListIndex <> -1 End Sub Agregar este cdigo al procedimiento de evento txtName_Change: Private Sub txtName_Change ( ) activar botn Add si al menos existe un carcter en el nombre: cmdAdd.Enabled = (Len(txtName.Text) > 0) End Sub Control ListBox Escenario 2:

179

Creacin de ListBox de columnas mltiples Para crear columnas mltiples, selecciones mltiples en el ListBox, necesita establecer las propiedades Columns y MultiSelect del ListBox. En el siguiente ejemplo estas propiedades son usadas para crear tal lista. Si dibuja el ListBox lo suficientemente grande como para almacenar todos los elementos en una columna, la segunda columna quedar vaca; los otros elementos se quebrarn hacia abajo (wrap), y aparecern las barras de navegacin horizontal solamente si el ListBox no tiene lo suficiente de altura. Este ejemplo usa la propiedad Selected un arreglo booleano que contiene la seleccin de estados de un ListBox para determinar qu elementos estn seleccionados. Cada entrada en el arreglo corresponde a un elemento en la lista y es puesto en True si el elemento es seleccionado, o False si no es seleccionado. Despus que el usuario selecciona elementos de la lista, cada entrada del arreglo es verificada para ver si est puesta en True. Si lo est, la entrada es agregada a la segunda lista, un ListBox normal de una columna simple, usando el mtodo AddItem. Establezca las propiedades para el ejemplo segn indicado en tabla siguiente: Objeto Propiedad Valor Form Caption Multiple-Column ListBox. TopListBox Name LstTop Columns 2 MultiSelect 2 Extended BottonListBox Name LstBotton Command1 Name CmdTranfer Caption &Tranfer Command2 Name CmdClear Caption C&lear Command3 Name CmdClose Caption &Close La propiedad MultiSelect permite seleccionar un rango de valores en un ListBox. Si da click al primer elemento, y presiona la tecla Shift y da clic al ltimo elemento en el rango (o usa la tecla Shift y la flecha que seala hacia abajo), todos los elementos en el rango son seleccionados. Eventos en la aplicacin ListBox Columnas Mltiples Agregar cdigo al procedimiento Form_Load para iniciar el top List, lstTop: Private Sub Form_Load ( ) LstTop.AddItem Paris LstTop.AddItem New Orleans LstTop.AddItem San Francisco LstTop.AddItem Chicago LstTop.AddItem Seattle LstTop.AddItem Toronto LstTop.AddItem New York LstTop.AddItem Tbilisi LstTop.AddItem Moscow LstTop.AddItem Portland seleccione un par de elementos: lstTop.Selected(0)=True lstTop.Selected(1)=True End Sub Nota: Puede agregar elementos al ListBox sin necesidad de estar repitiendo el mtodo AddItem; hgalo a travs de la propiedad List, que podr encontrarla en la ventana de propiedades del control ListBox. Despus de dar entrada a cada elemento, presione la combinacin de teclas CTRL+Enter, para ir a la siguiente lnea, esto permite introducir mltiples entradas en un ListBox Multi Columnar.

180

Agregue el siguiente cdigo al procedimiento de evento lstTop_DblClick ( ) Private Sub lstTop_DblClick ( ) CmdTranfer.Value=True presiona el botn Transfer. End Sub Agregue el siguiente cdigo al procedimiento de evento Click para el botn de comando Transfer: Private Sub cmdTransfer_Click ( ) For n=0 To (lstTop.ListCount 1) si est seleccionado agrguelo a la lista: If lstTop.Selected(n) = True Then LstBotton.AddItem lstTop.List(n) End If Next CmdClear.Enabled = True End Sub Observe cmo los valores del ndice del arreglo comienzan de cero y llegan hasta ListCount 1. Agregue el siguiente cdigo al procedimiento de evento Click para el botn de comando Clear: Private Sub cmdClear_Click ( ) LstBotton.Clear CmdClear.Enabled = False End Sub Agregue el siguiente cdigo al procedimiento de evento Click del botn de comando Close: Private Sub cmdClose_Click ( ) Unload Me End Sub Traduccin: Derechos de Autor: RBsoftware (2001) Sbado, 28 de abril 2001. 10:53pm. Archivo: Traduccin VB23. Usando el control Contenedor OLE Puede encadenar o sujetar cualquier objeto que soporte Automation dentro de un control contenedor OLE. Usando este control, su aplicacin Visual Basic puede desplegar y manipular datos de otra aplicacin basada en Windows, tales como Excel de Microsoft y Word para Windows. El contenedor OLE es usado para crear aplicaciones orientadas a documentos. En tal aplicacin, el usuario combina datos de diferentes aplicaciones para crear un solo documento. Este tipo de aplicacin puede ser un procesador de palabras que permita al usuario introducir texto y despus sujetarlo a una hoja de trabajo o a un grfico. El control contenedor OLE, le permite agregar objetos de otras aplicaciones para sus aplicaciones Visual Basic. Con este control Usted puede: Crear un recipiente en su aplicacin para un objeto. Puede crear el objeto que aparece dentro del control contenedor OLE en tiempo de ejecucin, o puede cambiar el objeto que haya depositado en el contenedor OLE en tiempo de diseo. Crear un objeto encadenado en su aplicacin. Sujetar el contenedor OLE a una base de datos. Ejecutar una accin si se mueve el ratn, modificar su tamao, o actualizar el objeto en el contenedor OLE. Crear objetos de datos que fueron copiados al clipboard. Desplegar objetos como iconos. Proporcionar compatibilidad con aplicaciones que incluyen muchos contenedores OLE.

181

Para mayor informacin vea Usando la interfase visual del componente en Programando con Componentes para una detallada discusin y ejemplos sobre cmo el contenedor OLE es usado. Usando el control Option Button Los controles OptionButton son usados para desplegar opciones, usualmente en grupos de botones de opcin, de los cuales el usuario solamente puede seleccionar uno. Aunque los controles OptionButton y los controles CheckBox aparentar funcionar de manera similar, existe una diferencia importante: Cuando el usuario selecciona un OptionButton, los otros controles OptionButton dentro del grupo automticamente se desactivan. En contraste, cualquier nmero de controles CheckBox pueden ser seleccionados, dentro del grupo, a un mismo tiempo. Para mayor informacin vea Agrupando opciones con OptionButton en Formularios, Controles y Mens para una demostracin del uso de OptionButton. Creacin de grupos OptionButton Usted agrupa los controles OptionButton dibujndolos dentro de un contenedor, tal como el control Frame, un control PictureBox, o un formulario. En tiempo de ejecucin, el usuario puede seleccionar un sencillo OptionButton por cada grupo de OptionButton que existan. Por ejemplo, si Usted agrega OptionButtons a un formulario y OptionButtons a un control Frame dentro de ese mismo formulario, usted ha creado dos grupos distintos de OptionButtons. Todos los OptionButtons que haya agregado directamente al formulario se convierten en un grupo. Para agregar adicionales grupos necesita depositarlos dentro de un control Frame o dentro de un control PictureBox. Para agrupar controles OptionButtons en un Frame o en un PictureBox, dibuje primero el Frame o el PictureBox sobre el formulario, y despus dibuje los controles OptionButtons dentro de los controles Frame o PictureBox. En tiempo de diseo, los OptionButtons contenidos en un Frame o PictureBox pueden ser seleccionados y movidos como una unidad. Para seleccionar mltiples controles contenidos dentro de un Frame o PictureBox o Formulario, mantenga presionada la tecla CTRL y use el ratn para dibujar un cuadro que rodee los controles. Para mayor informacin vea Usando el control Frame, tema visto en captulos anteriores. Seleccionando un OptionButton en tiempo de ejecucin Un OptionButton puede ser seleccionado en tiempo de ejecucin de diversas formas: dndole clic con el ratn, usando la tecla Tab hasta dar el enfoque al control, usando la tecla Tab para seleccionar un grupo de OptionButtons y despus usar las teclas de flechas para seleccionar un del grupo, crear una tecla de acceso en el Caption del OptionButton, o, en cdigo, establecer su propiedad Value a True. El evento Click Cuando un OptionButton es seleccionado, su evento Click es disparado. Dependiendo de la funcin de su aplicacin, puede o no puede responder a este evento. Por ejemplo, responder a este evento es til cuando desea actualizar el Caption del control Label para proporcionar al usuario informacin sobre la opcin que ha sido seleccionada. La propiedad Value La propiedad Value del OptionButton indica cundo est seleccionado, y lo indica cambiando su valor a True. En cdigo puede seleccionar un OptionButton estableciendo su propiedad Value. Por ejemplo: OptPentium.Value = True Para que un OptionButton sea la opcin por defecto dentro del grupo, establezca la propiedad Value en tiempo de diseo a travs de la ventana de propiedades del control, o en tiempo de ejecucin, a travs de cdigo, como el ejemplo citado previamente.

182

Cuando Usted le presenta al usuario una caja de dilogo conteniendo OptionButtons, Usted le est solicitando que seleccione una opcin que ser determinante para el siguiente paso que ejecutar la aplicacin. Puede usar la propiedad Value de cada OptionButton para determinar qu opcin ha sido seleccionada y de esta forma responder convenientemente. Creacin de teclas de acceso (keyboard shortcuts) Puede usar la propiedad Caption para crear teclas de acceso a sus OptionButtons agregando un ampersand (&) antes de la letra que Usted desea sea la tecla de acceso. Por ejemplo, para crear una tecla de acceso para la opcin cuyo Caption es Pentium, Usted agrega un ampersand (&) antes de la letra P: &Pentium. En tiempo de ejecucin, la letra P aparecer subrayada y el usuario podr seleccionar el comando si mantiene presionada la tecla Alt y despus pulsa la tecla P (Alt+P). Nota: Para incluir un ampersand en el Caption y que no se vaya a crear una tecla de acceso, incluya dos ampersands. Si lo hace as, un solo ampersand es desplegado y ningn carcter es subrayado. Desactivando un OptionButton Para desactivar un OptionButton, establezca su propiedad Enabled a False. En tiempo de ejecucin, el OptionButton aparecer difuminado, indicando que no est disponible. Visualmente mejorando el control OptionButton La apariencia de los OptionButtons puede ser mejorada alterando el valor de la propiedad Style y despus usando los valores de las propiedades Picture, DownPicture y DisabledPicture. Usando el control PictureBox El control PictureBox es usado para desplegar grficos, para actuar como contenedor de otros controles y para desplegar salidas usando mtodos grficos o para desplegar texto usando el mtodo Print. El control PictureBox es similar al control Image en el aspecto que pueden ambos ser usados para desplegar grficos en su aplicacin cada uno soporta los mismos formatos grficos. Sin embargo, el control PictureBox contiene funciones que el control Image no tiene, por ejemplo, la habilidad de actuar como contenedor de otros controles y soportar mtodos grficos. Para mayor informacin vea Trabajando con el control PictureBox en Formularios, Controles y Mens para una demostracin del uso de PictureBox. Formatos grficos soportados El control PictureBox puede desplegar archivos de imgenes en cualquiera de los siguientes formatos: bitmap, icon, metafile, metafile mejorado, o como archivos JPEG o GIF. Para mayor informacin vea Usando el control Image visto anteriormente para una descripcin detallada de estos formatos grficos. Cargando un grfico dentro de un control PictureBox Las imgenes pueden ser cargadas dentro del control PictureBox en tiempo de diseo seleccionando la propiedad Picture de la ventana de propiedades del control, o en tiempo de ejecucin usando la propiedad Picture y el mtodo LoadPicture: Picture1.Picture = LoadPicture(c:\Windows\Winlogo.bmp) Para borrar el grfico del control PictureBox use el mtodo LoadPicture sin especificar un nombre de archivo. Por ejemplo: Picture1.Picture = LoadPicture Esto limpiar el PictureBox an cuando el grfico haya sido cargado dentro de la propiedad Picture en tiempo de diseo. Usando el clipboard

183

Puede tambin agregar un grfico a un control PictureBox en tiempo de diseo copindolo de otra aplicacin. Por ejemplo, puede desear agregar una imagen creada en Windows, con Paint. Simplemente, copie la imagen al clipboard, seleccione el control PictureBox, y use la combinacin de teclas CTRL+V o el comando Paste del men Edit. Modificando el tamao de un grfico Por defecto, los grficos son cargados al PictureBox en su tamao original, lo que significa que, si el grfico es ms grande que el control, la imagen ser recortada el control PictureBox no genera barras de navegacin en forma automtica. Para hacer que el control PictureBox automticamente modifique el tamao del PictureBox, establezca su propiedad AutoSize a True. El control ser ajustado al tamao del grfico agrandndose o disminuyndose. Al contrario del control Image, el PictureBox no puede estrechar la imagen para que se ajuste al tamao del PictureBox. Para mayor informacin vea Control Barras de Navegacin Escenario: Creando una ventana grfica navegable ya visto en captulos anteriores y que trata sobre el uso de PictureBox para crear una ventana grfica navegable. Usando el control PictureBox como contenedor Puede usar el control PictureBox como contenedor de otros controles. Por ejemplo, en vista que el PictureBox puede ser situado dentro del rea interna de un formulario MDI, a menudo es usado para manualmente crear una barra de herramientas o una barra de estado. Para mayor informacin vea Creacin de una barra de herramientas en Creacin de la interfase del usuario sobre el uso del control PictureBox como contenedor de otros controles. Mtodos grficos Los PictureBox, como los formularios, pueden ser usados para recibir las salidas de los mtodos grficos tales como Circle, Line y Point. Por ejemplo, puede usar el mtodo Circle para dibujar un crculo en un PictureBox a travs del establecimiento de la propiedad AutoRedraw del control a True: Picture1.AutoRedraw=True Picture1.Circle (1200,1000),750 Establecer AutoRedraw a True permite que las salidas de estos mtodos sea dibujada en el control y automticamente vuelta a dibujar si el control PictureBox es cambiado de tamao, o vuelto a desplegar despus de haber estado oculto por otro objeto. Para mayor informacin vea Usando mtodos grficos en Trabajando con texto y grficos en donde se muestra el uso del PictureBox con mtodos grficos. Usando el mtodo Print Puede usar el control PictureBox para dar salida a texto usando el mtodo Print y estableciendo la propiedad AutoRedraw a True. Por ejemplo: Picture1.Print Una cadena de texto. Cuando usa el mtodo Print puede tambin modificar el estilo de fuente y el tamao de la fuente, o las propiedades CurrentX, CurrentY, Height, y Width para alinear el texto dentro de un PictureBox. Para mayor informacin vea Trabajando con texto y grficos y Print Method en Language Reference en Books Online. Usando el control Shape El control Shape es usado para crear las siguientes predefinidas figuras en formularios, Frames o PictureBox: rectngulo, cuadrado, oval, crculo, rectngulo redondeados, o cuadrados redondeados. Usted puede establecer el estilo de la figura, color, estilo de relleno, color de borde, y estilo de borde de cualquier figura que dibuje en un formulario.

184

Para uso simple, el control Shape le permite crear una variedad de formas sin escribir ningn cdigo. Para funciones ms avanzadas necesitar usar los mtodos Line y Circle. Para mayor informacin vea Usando mtodos grficos en Trabajando con texto y grficos. Figuras predefinidas La propiedad Style del control Shape le proporciona de seis figuras predefinidas. La tabla siguiente lista sus valores y constantes equivalentes en Visual Basic. Figura Estilo Constante Rectngulo 0 VbShapeRectangle. Cuadrado 1 VbShapeSquare. Oval 2 VbShapeOval. Crculo 3 VbShapeCircle. Rectngulo Redondeado 4 VbShapeRoundedRectangle. Cuadrado Redondeado 5 VbShapeRoundedSquare. Estilos Fill y Line Puede usar las propiedades FillStyle y BorderStyle para establecer el estilo de relleno y el estilo de borde de las figuras que dibuje sobre un formulario. La propiedad FillStyle, al igual que la propiedad Style, le proporciona un nmero de modelos de estilos de relleno predefinidos. Estos incluyen: Solid, Transparent, Horizontal Line, Vertical Line, Upward Diagonal, Downward Diagonal, Cross, y Diagonal Cross. La propiedad BorderStyle le proporciona un nmero de modelos de estilos de bordes predefinidos. Estos incluyen: Transparent, Solid, Dash, Dot, Dash-Dot, Dash-Dot-Dot e Inside Solid. Ambas propiedades, FillStyle y BorderStyle, le proporcionan constantes con los estilos antes descritos. Vea FillStyle Property y BorderStyle Property en Language Reference en Books Online para mayor informacin. Estableciendo atributos de color Las propiedades BackColor y FillColor le permiten agregar color a su figura y a sus bordes. En tiempo de diseo, puede establecer las propiedades Fill o Border eligiendo sus propiedades de la ventana de propiedades del control Shape y despus seleccionndolo de la paleta disponible o de los colores del sistema. Para establecer los colores en tiempo de ejecucin, use las constantes de color Visual Basic (vbGreen, por ejemplo) o las constantes de color del sistema (vbWindowBackground, por ejemplo) o la funcin RGB para especificar el color de relleno. Nota: Cuando las propiedades FillStyle o BackStyle son puestas en 1 (Transparent), las propiedades FillColor y BackColor son ignoradas. Para mayor informacin vea Color Constants y RGB Function en Language Reference en Books Online. Tambin vea Trabajando con Texto y Grficos en donde se detalla informacin sobre la creacin de grficos en Visual Basic. Dibujando una figura en un formulario Puede usar el control Shape para dibujar rectngulos (regulares o con las esquinas redondeadas), cuadros (regulares o con las esquinas redondeadas), ovales, y crculos en un formulario. Para dibujar una figura en un formulario:

185

1. 2. 3. 4.

De la caja de herramientas seleccione el control Shape. Cuando mueva el apuntador sobre el formulario, este se convierte en una cruz. De clic sobre el formulario y arrastre la cruz hasta hacer el control del tamao deseado. De la ventana de propiedades seleccione la propiedad Shape. De la ventana Settings, seleccione el estilo que desea.

Las figuras pueden ser modificadas de tamao como cualquier control, seleccionando y arrastrando el control hasta el tamao deseado, o modificando las propiedades Height y Width. Usando el control TextBox El control TextBox es usado para desplegar informacin entrada por el usuario en tiempo de ejecucin, o asignada a la propiedad Text del control en tiempo de diseo o en tiempo de ejecucin. En general, el control TextBox debe ser usado para editar texto, aunque puede hacerlo de solo lectura estableciendo su propiedad Locked a True. Los TextBox tambin le permiten desplegar lneas mltiples, quebrar las lneas para ajustarlas al tamao del control, y para agregar formato bsico. La propiedad Text El texto introducido en un TextBox es contenido en la propiedad Text. Por defecto, Usted puede entrar hasta un mximo de 2,048 caracteres en un TextBox. Si establece la propiedad MultiLine a True puede introducir hasta 32 kilobytes de texto. Formato de texto Cuando el texto excede las fronteras del control, Usted puede hacer que el control quiebre la lnea de texto y la contine en la siguiente estableciendo la propiedad MultiLine a True y agregar barras de navegacin estableciendo la propiedad ScrollBars, ya sea barras horizontales, barras verticales o ambas. El quiebre automtico de texto no estar disponible si agrega barras horizontales pues el rea de edicin horizontal ser aumentada por la presencia de la barra de navegacin. Cuando la propiedad MultiLine est en True, puede tambin ajustar la alineacin del texto, ya sea ajustarlo a la derecha o izquierda, o centrarlo. Por defecto el texto es alineado a la izquierda. Si la propiedad MultiLine es False, la propiedad Alignment no tiene efecto. Para mayor informacin vea Trabajando con TextBox para una demostracin de las propiedades MultiLine, ScrollBar y Alignment. Seleccionando texto Puede controlar el punto de insercin y comportamiento de seleccin en un TextBox con las propiedades SelStart, SelLength, y SelText. Para mayor informacin vea Trabajando con TextBox en Formularios, Controles y Mens. Creacin de un TextBox contrasea Un TextBox contrasea es un TextBox que permite al usuario escribir su contrasea desplegando caracteres, tales como asteriscos. Visual Basic proporciona dos propiedades TextBox, PasswordChar y MaxLength, que facilitan la creacin de un TextBox contrasea. PasswordChar se usa para especificar el carcter desplegado en el TextBox. Por ejemplo, si desea que se despliegue un asterisco en el TextBox contrasea, especifica * para la propiedad PasswordChar en la ventana propiedades. Sin importar el carcter que teclee el usuario en el TextBox, sern desplegados asteriscos. Usa MaxLength para indicar la cantidad de caracteres que deben ser tecleados en el TextBox. Una vez que MaxLength es excedido, el sistema emite un sonido y el TextBox no acepta ms caracteres. Cancelando teclas pulsadas en un TextBox

186

Puede usar el evento KeyPress para restringir o transformar caracteres en el momento en que son tecleados. El evento KeyPress usa un argumento, KeyAscii. Este argumento es un entero que representa el equivalente numrico ASCII del carcter tecleado en el TextBox. El siguiente ejemplo demuestra cmo cancelar caracteres al momento que son tecleados. Si el carcter tecleado no est dentro del rango especificado, el procedimiento lo cancela estableciendo KeyAscii a cero. El TextBox se llama txtEnterNums, y el procedimiento evita la entrada de caracteres que no sean nmeros. Private Sub txtEnterNums_KeyPress (KeyAscii As Integer) If KeyAscii < Asc(0) Or KeyAscii > (9) Then KeyAscii = 0 cancela el carcter. Beep seal de error audible. End If End Sub Para mayor informacin vea Respondiendo a eventos del teclado en Respondiendo a eventos del ratn y del teclado. Creacin de un TextBox de solo lectura (ReadOnly) Puede usar la propiedad Locked para prevenir a los usuarios sobre la edicin del contenido de un TextBox. Establezca la propiedad Locked a True para permitir al usuario navegar y seleccionar un TextBox sin posibilidad de modificar su contenido. Con la propiedad Locked en True, el comando Copy trabaja en un TextBox pero los comandos Cut y Paste no. La propiedad Locked solamente afecta la interaccin con el usuario en tiempo de ejecucin. Puede todava cambiar el contenido del TextBox en tiempo de ejecucin a travs de cdigo cambiando la propiedad Text del TextBox. Imprimiendo comillas () en una cadena Algunas veces aparecen comillas () en una cadena de texto. Ella dijo, T deseas un trato! En vista de que las cadenas asignadas a una variable o propiedad estn encerradas en comillas (), Usted debe suministrar un juego adicional de comillas para cada juego para poderlas desplegar en una cadena. Visual Basic interpreta las dos comillas en una fila como una comilla enlazada. Por ejemplo, para crear el ejemplo antes citado use el cdigo siguiente: Text1.Text = Ella dijo, T deseas un trato! Para lograr el mismo efecto use el carcter ASCII 34 para la comilla: Text1.Text = Ella dijo, & Chr(34)+ T deseas un trato! & Chr(34) Usando el control Timer Los controles Timer responden al paso del tiempo. Ellos son independientes del usuario y Usted puede programarlos para tomar acciones en intervalos regulares. Una respuesta tpica es estar verificando el reloj del sistema para ver si es tiempo para ejecutar una tarea. Los Timer son tambin tiles para otro tipo de procesamiento interno. Cada control Timer tiene una propiedad de intervalo que especifica el nmero de mili segundos que han pasado entre un evento Timer y el siguiente. A no ser que est desactivado, el Timer contina recibiendo eventos (llamado apropiadamente el evento Timer) casi en idnticos intervalos de tiempo. La propiedad Interval tiene muy pocas limitaciones a considerar cuando Usted est programando el control Timer: Si su aplicacin u otra aplicacin est haciendo fuertes demandas al sistema tales como largos bucles, clculos intensivos, a accesos a discos duros, redes o puertos su aplicacin puede que no obtenga los eventos Timer tan a menudo como la propiedad Interval especifica. El Interval puede estar entre cero y 64,767, inclusive, lo que significa que an el intervalo ms largo no puede ser mayor que un minuto (cerca de 64.8 segundos). El intervalo no garantiza que cumpla el ciclo con exactitud. Para asegurar la exactitud, el Timer debe verificar el reloj del sistema cuando lo necesite, en vez de seguir la pista del tiempo acumulado internamente.

187

El sistema genera 18 pulsaciones de reloj por segundo as que an cuando la propiedad Interval es medida en mili segundos, la precisin verdadera de un intervalo no es ms que un dieciochoavo de segundo.

Cada control debe estar asociado a un formulario. En consecuencia, para crear una aplicacin Timer, por lo menos debe crear un formulario (aunque no debe hacer visible el formulario, a no ser que lo necesite para otro propsito). Nota: La palabra Timer es usada de diferentes formas en Visual Basic, cada una relacionada con el trabajo del control Timer. Adems del nombre del control y del tipo del control, Timer es usado en el evento Timer y en la funcin Timer. Aplicacin Ejemplo: Alarm.vbp Las tcnicas para trabajar con el control Timer son incluidas en la aplicacin de ejemplo Alarm (Alarm.vbp). Si instal las aplicaciones ejemplo, encontrar esta aplicacin en el sub directorio \Alarm, en el directorio principal de Visual Basic (\VB\Samples\Pguide). Ubicando el control Timer sobre el formulario Situar el control Timer sobre un formulario es igual a dibujar cualquier otro control: da clic en el botn Timer de la caja de herramientas, esto lo selecciona. Luego posa el apuntador en el lugar del formulario en donde desea ubicar el control, y ah da clic, y arrastra el control hasta que tenga el tamao que desee. El Timer aparece sobre el formulario solamente en tiempo de diseo, de forma que Usted puede seleccionarlo, ver sus propiedades, y escribir procedimientos de eventos para l. En tiempo de ejecucin el Timer es invisible, por tanto su ubicacin y tamao son irrelevantes. Inicializando el control Timer El control Timer tiene dos propiedades principales. Propiedad Valor Enabled Si desea que el control Timer comience a trabajar desde el mismo momento en que el formulario es cargado, pngalo en True. De otra forma, deje esta propiedad en False. Podra elegir tener un evento externo (tal como un clic a un botn de comando) que de inicio la operacin del Timer. Interval Nmero de mili segundos entre eventos Timer. Observe que la propiedad Enabled para el Timer es diferente de la propiedad Enabled de otros objetos. Con la mayora de los objetos, la propiedad Enabled determina si el objeto puede responder a un evento disparado por el usuario. Con el control Timer, estableciendo Enabled a False suspende la operacin Timer. Recuerde que el evento Timer es peridico. La propiedad Interval no determina cunto tiempo sino cun a menudo. La longitud del intervalo depender de la cantidad de precisin que Usted desee. En vista de que existen errores potenciales intrnsecos, haga el intervalo la mitad de la deseada cantidad de precisin. Nota: A ms eventos Timer generados, ms tiempo es usado por el procesador para responder al evento. Esto puede ocasionar lentitud en la ejecucin total de proceso. No establezca intervalos pequeos, a no ser que lo necesite. Control Timer Escenario Respondiendo al evento Timer Cuando el intervalo del Timer concluye su vuelta, Visual Basic genera el evento Timer. Tpicamente, Usted responde a este evento verificando alguna condicin general, tal como el reloj del sistema. Un reloj digital es muy simple y de muy til aplicacin cuando envuelve al control Timer. Una vez que entiende como esto funciona, puede mejorarlo para que trabaje como reloj de alarma, reloj de parada, y otros dispositivos de tiempo.

188

La aplicacin Digital Clock incluye un Timer y un Label con un borde. En tiempo de ejecucin el Timer es invisible. La siguiente tabla lista las propiedades de la aplicacin Digital Clock: Control Label1 Timer1 Propiedad Valor BorderStyle Fixed Single Interval 500 (mitad de un segundo) Enabled True El nico procedimiento en esta aplicacin es el procedimiento de evento del Timer: Private Sub Timer1_Timer ( ) If lblTime.Caption <> CStr(Time) Then LblTime.Caption = Time End If End Sub El procedimiento despliega la hora del sistema llamando la funcin intrnseca Time. Esta funcin retorna una Variant conteniendo la hora actual como un valor Date / Time (Var Type 7). Cuando la asigna a una variable de cadena o propiedad, como la propiedad Caption en este caso, Visual Basic la convierte a una cadena usando el formato time especificado en el Panel de Control. Si desea desplegar la hora utilizando un formato diferente, puede usar la funcin Format. Para mayor informacin vea Format Property en Language Reference en Books Online. La propiedad Interval para el Timer es puesta en 500, siguiendo la regla de establecer el intervalo a la mitad de lo que uno desea distinguir (en este caso un segundo). Esto causar que el cdigo del Timer actualice el Label con la misma hora dos veces por segundo, lo cual es un gasto y puede causar cierto parpadeo en la Label, de forma que el cdigo prueba si la hora es diferente de lo que se est desplegando en el Label antes de proceder a cambiar el Caption. Puede personalizar la apariencia del Digital Clock sin tener que escribir declaraciones adicionales. Por ejemplo, puede seleccionar diferente fuente para el Label, o cambiar la propiedad BorderStyle del formulario. 01:22pm.martes.01.mayo.2001. (fin primer tomo). 398 pginas. Done. Traduccin: Derechos de Autor: RBsoftware (2001) Martes, 1 de mayo 2001. 02:46pm. Archivo: Traduccin VB24. Ms acerca de Programacin Este captulo va ms all de lo fundamental en programacin Visual Basic e introduce una variedad de caractersticas que hacen ms fcil la creacin de aplicaciones poderosas y flexibles. Por ejemplo, puede cargar mltiples proyectos dentro de sola sesin en el ambiente de programacin, trabajar con los valores de los registros de Windows, o compilar de manera selectiva ciertas partes de su programa. Ms all de lo fundamental de la escritura de cdigo, Visual Basic le proporciona una variedad de elementos del lenguaje que mejoran su cdigo. Los ltimos tres tpicos en este captulo exploran estos tres elementos del lenguaje: tipos definidos por el usuario, constantes enumeradas y colecciones. Trabajando con mltiples proyectos Puede crear muchas aplicaciones trabajando con un solo proyecto. Sin embargo, a medida que la aplicacin se hace ms compleja, Usted puede desear trabajar con mltiples proyectos en la misma sesin del ambiente de programacin. Por ejemplo, puede desear usar un proyecto para construir un archivo ejecutable de la aplicacin, y el segundo proyecto para servir para probar cdigo antes de agregarlo a la aplicacin. Usted puede agregar, un nuevo proyecto, o un proyecto que ya exista, a su actual sesin de edicin, a travs de agregarlo a un project group. Usted puede despus salvar el project group y trabajar con l en subsecuentes

189

sesiones de edicin. Puede despus abrir el project group o un proyecto individual en el project group o agregar el project group a un proyecto individual o a otro project group. En un project group, un proyecto ejecutable sirve como proyecto startup. Cuando un project group es abierto y elige Start a partir del men Run, o da clic en el botn Start en la barra de herramientas, o presiona F5, Visual Basic ejecuta el proyecto startup. En la edicin profesional o empresarial, puede usar project groups para crear y rastrear aplicaciones de componentes mltiples. Por ejemplo, puede crear y rastrear project groups conteniendo proyectos ejecutables estndar, proyectos ejecutables ActiveX, proyectos de librera de enlace dinmico ActiveX, o proyectos de controles ActiveX. Para mayor informacin vea Creacin de componentes ActiveX en Gua de herramientas de componentes Agregando o removiendo un proyecto Cuando crea un nuevo proyecto, ya sea desde el inicio, o seleccionndolo a travs del comando NewProject en el men File, Visual Basic automticamente crea un project group para l. Usted puede despus agregar nuevos proyectos o proyectos ya existentes al project group. Para agregar un nuevo proyecto al project group: De clic en el botn AddProject de la barra de herramientas, o elija AddProject del men File. Para agregar un proyecto existente al project group: 1. A partir del men File, elija AddProject. Visual Basic despliega la caja de dilogo AddProject. 2. De clic a la pestaa Existing. 3. Seleccione un archivo de proyecto, despus elija Open. Visual Basic agrega el proyecto seleccionado al project group. Visual Basic despliega mltiples proyectos en la ventana de proyectos en forma jerrquica. Cada proyecto aparece a nivel superior, con los formularios del proyecto, mdulos, pginas de propiedades, u objetos de documentos agrupados en forma jerrquica. Para remover un proyecto del project group: 1. Seleccione el nombre del proyecto de la ventana de proyectos. 2. A partir del men File, seleccione RemoveProyect. Visual Basic remueve el proyecto seleccionado del project group. Puede cambiar el tipo de un proyecto, a partir del men Project, seleccionando ProjectProperties, y cambiando la opcin Type, en la pestaa General, en la caja de dilogo ProjectProperties. Especificando un proyecto Startup En vista de que un project group contiene mltiples proyectos, Visual Basic necesita conocer cul proyecto ejecutar cuando elige Start a partir del men Run, o da clic en el botn Start en la barra de herramientas, o pulsa F5. Por defecto, Visual Basic ejecuta el primer proyecto ejecutable que es agregado al project group. Sin embargo, Usted puede especificar un diferente componente startup. Para especificar un componente startup: 1. Seleccione un proyecto de la ventana de proyectos. 2. De clic al botn derecho del ratn y seleccione Set as Start Up a partir del men contextual. Visual Basic despliega el nombre del proyecto startup en la ventana de proyectos. El rastreo de mltiples proyectos es detallado en Rastreo, prueba y depsito de componentes en Creacin de componentes ActiveX en Gua de Herramientas de Componentes.

190

Manejando las condiciones de la aplicacin Las condiciones de la aplicacin (settings), tales como posiciones de ventana, archivos usados y otros elementos fueron comnmente almacenados en archivos .ini. En Windows NT, Windows 95 y siguientes versiones de Windows estas condiciones son almacenadas en el registro del sistema. Visual Basic proporciona una ubicacin de registro estndar para almacenar informacin de programas para aplicaciones creadas con Visual Basic. HKEY_CURRENT_USER\ Software\ VB and VBA Program Settings \ appname\ section\ key Visual Basic tambin proporciona cuatro declaraciones y funciones para manipular las condiciones almacenadas en la ubicacin del registro de la aplicacin. Funcin o declaracin GetSetting funcin SaveSetting declaracin GetAllSettings funcin DeleteSetting declaracin Descripcin Recupera las condiciones del registro. Salva o crea condiciones del registro. Retorna un arreglo conteniendo mltiples condiciones del registro. Borra condiciones del registro.

Nota: Para ver las entradas del registro, use la aplicacin Regedit con Windows 95 y Windows NT. Para leer ms sobre condiciones de la aplicacin, vea los tpicos siguientes: Crear o Salvar condiciones de la aplicacin Explica cmo salvar nuevos valores para claves de registro almacenados en la ubicacin del registro de la aplicacin. Recuperar condiciones de la aplicacin Explica cmo recuperar valores de los registros almacenados en la ubicacin del registro de la aplicacin. Borrar condiciones de la aplicacin Explica cmo borrar claves de registro, o una ubicacin del registro de la aplicacin. Crear o salvar condiciones de la aplicacin Puede usar la declaracin SaveSetting para salvar un nuevo valor para una clave de registro almacenado en la ubicacin del registro de la aplicacin. Por ejemplo, puede agregar cdigo en el evento Form_Unload en el formulario principal de la aplicacin con el objetivo de preservar las condiciones despus de apagar el sistema, o en el evento Form_Load en una caja de dilogo de opciones para actualizar las preferencias del usuario (el original en ingls dice Form_Unload ambas). Use la siguiente sintaxis para la declaracin SaveSetting: SaveSetting AppName, section,key,value El siguiente cdigo salva los nuevos valores para las claves Backup y LastEntry en la seccin Startup del registro de la aplicacin llamada RegCust. Este cdigo asume que las variables strDate y intLastEntry contienen los nuevos valores. Private Sub Form_Unload (Cancel As Integer) SaveSetting RegCust, Startup, Backup, strDate SaveSetting RegCust, Startup, LastEntry, intLastEntry End Sub Si una entrada para la aplicacin RegCust o cualquiera de estas secciones o claves no existe en la seccin Software/Microsoft en el registro, este cdigo la crear. Para mayor informacin vea SaveSetting Statement en Language Reference en Books Online. Recuperando condiciones de la aplicacin

191

Puede usar las funciones GetSetting y GetAllSetting para recuperar valores del registro almacenados en la ubicacin del registro de la aplicacin. Por ejemplo, su aplicacin puede recuperar condiciones de registro para recrear su condicin al momento en que fue cerrada. Una condicin a la vez Para recuperar una sola condicin, use la siguiente sintaxis para la funcin GetSetting: GetSetting (AppName, section, key [default] ) El siguiente cdigo recupera el valor de la clave LastEntry en la seccin Startup de la aplicacin RegCust y despliega el valor en la ventana inmediata: Private Sub Form_Load ( ) Dim intLastEntry As Integer IntLastEntry = GetSetting ( RegCust, Startup, LastEntry, 0) Debug.Print intLastEntry End Sub Note que puede usar el parmetro opcional default, para establecer el valor retornado por Visual Basic cuando no existe valor listado en el registro para la clave especificada. Condiciones mltiples Para recuperar una lista de claves de registro y sus valores, use la siguiente sintaxis para la funcin GetAllSettings: GetAllSettings (AppName, section) El siguiente cdigo recupera una lista de dos columnas de claves de registro y sus valores en la seccin Startup de la aplicacin RegCust, y despliega el resultado en la ventana inmediata. Private Sub Form_Load ( ) Dim avntSettings As Variant Dim intX As Integer AvntSettings = GetAllSettings (RegCust, Startup) For intX = 0 To Ubound (avntSettings, 1) Debug.Print avntSettings(intX, 0), avntSettings(intX, 1) Next intX End Sub Para mayor informacin vea GetSetting Function y GetAllSettings Funcition en Language Reference en Books Online. Borrando condiciones de la aplicacin Puede usar la declaracin DeleteSetting para borrar una clave de registro, una seccin, o una ubicacin del registro de la aplicacin. Por ejemplo, puede desear borrar toda la informacin de registro de la aplicacin cuando la aplicacin es des instalada. Use la siguiente sintaxis para la declaracin DeleteSetting: DeleteSetting(AppName, section, key) El siguiente cdigo borra la clave LastEntry en la seccin Startup de la aplicacin RegCust. Private Sub cmdDelKey_Click ( ) DeleteSetting RegCust, Startup, LastEntry End Sub El siguiente cdigo borra la seccin Startup entera de la aplicacin RegCust del registro. Private Sub cmdDelSection_Click ( ) DeleteSetting RegCust, Startup End Sub

192

El siguiente cdigo borra la ubicacin entera del registro de la aplicacin RegCust. Private Sub cmdUnInstall_Click ( ) DeleteSetting RegCust End sub Para mayor informacin vea DeleteSetting Statement en Language Reference en Books Online. Usando compilacin condicional La compilacin condicional le permite compilar selectivamente ciertas partes de su programa. Puede incluir caractersticas especficas de su programa en diferentes versiones, tales como disear su aplicacin para que corra en diferentes plataformas, o cambiando los filtros de despliegue de fecha y moneda para una aplicacin que ser distribuida en diferentes lenguajes. Estructurando cdigo para una compilacin condicional Para compilar condicionalmente parte de su cdigo, encirrelo entre declaraciones #IfThen y #EndIf, usando una constante Booleana como la prueba de bifurcacin. Para incluir este segmento de cdigo en cdigo compilado, establezca el valor de la constante a 1 (True). Por ejemplo, para crear versiones francesas y alemanas de la misma aplicacin a partir del mismo cdigo fuente, introduzca segmentos de cdigo de la plataforma especfica dentro de las declaraciones #IfThen usando las constantes predefinidas conFrenchVersion y conGermanVersion. #If conFrenchVersion Then cdigo especfico para la versin en francs. #Else conGermanVersion Then cdigo especfico para la versin en alemn. #Else cdigo especfico para otras versiones. #End If Si el valor de la constante conFrenchVersion es puesta en True en tiempo de compilacin, el cdigo condicional para la versin en lenguaje francs ser compilada. Si el valor de la constante conGermanVersion es puesta en True, el compilador usa la versin del lenguaje alemn. Declarando constantes de compilacin condicional Existen tres formas para establecer las constantes de compilacin condicional: en la caja de dilogo ProjectProperties, pestaa Make, campo Conditional Compilation Arguments, en una lnea de comando, o en cdigo. Las constantes de compilacin condicional tienen un alcance especial y no pueden ser accedidas a travs de cdigo estndar. La forma en que establece las constantes de compilacin condicional puede depender del alcance que Usted desea tenga la constante. Cmo establecer Alcance Caja de dilogo ProjectProperties Public a todos los mdulos en el proyecto. Lnea de Comando Public a todos los mdulos en el proyecto. Declaracin #Const en cdigo Private al mdulo en el cual ellas sean declaradas. Estableciendo constantes en la caja de dilogo ProjectProperties Antes de la creacin del archivo ejecutable, a partir del men Project, elija ProjectProperties, de clic en la pestaa Make en la caja de dilogo Project Properties, y entre un argumento, tal como conFrenchVersion = 1, en el campo Conditional Compilation Arguments (si est compilando su aplicacin para la versin de lenguaje francs). Cuando compile el programa, este argumento satisfar la condicin #IfThen, y el cdigo entre las declaraciones #If...Then y #End sern incluidas dentro del programa compilado. Si tiene una declaracin compleja #IfThen, conteniendo una o ms declaraciones #ElseIf, necesitar agregar constantes adicionales. Puede establecer constantes mltiples separndolas con dos puntos, como en el siguiente ejemplo: conFrenchVersion = -1 : conANSI = 0

193

Estableciendo constantes en la lnea de comando Si desea iniciar la compilacin a partir de una lnea de comando, use el switch /d para entrar las constantes de compilacin condicional, como se muestra aqu: Vb.exe/make MyProj.vbp/d conFrenchVersion = -1 : conANSI = 0 No se requiere espacio entre el switch /d y la primer constante. Las declaraciones de lnea de comando anulan las declaraciones entradas en la caja de dilogo ProjectProperties, pero no las borran; los argumentos establecidos en la caja de dilogo ProjectProperties permanecen en efectos por compilaciones subsecuentes. Para mayor informacin vea #IfThen#Else Directive y #Const Statement en Language Reference en Books Online. Trabajando con Resource Files El Resource File le permite recolectar todo el texto especfico a la versin y los mapas de bits de una aplicacin. Esto puede incluir declaraciones de constantes, iconos, texto de pantalla, y otro material que puede cambiar entre versiones localizadas o entre revisiones o en configuraciones especficas. Agregando un Resource File al proyecto Crea el Resource File usando un editor de texto y un compilador Resource, tales como los que proporciona Microsoft Visual C++. El Resource File compilado tiene una extensin de nombre de archivo .res. El archivo actual consiste de una serie de cadenas individuales, mapas de bits, y otros elementos, cada uno de ellos con un nico identificador. El identificador es Long o String, dependiendo del tipo de dato representado por el Resource. Las cadenas, por ejemplo, tienen un identificador Long, mientras que los mapas de bits tiene un identificador Long o String. Para recuperar los Resources en su cdigo, conozca el identificador de cada Resource. Los parmetros de funcin que se refieren a los Resources pueden usar tipos de datos Variant. Para mayor informacin sobre Resource Files vea Usando Resource Files para localizaciones en Emisiones Internacionales. Nota: Los Resource Files de Windows son especficos a aplicaciones de 16 o 32 bits. Visual Basic genera un error si trata de agregar un Resource Files de 16 bits a un proyecto. Para agregar un Resource File a un proyecto, a partir del men Project, elija el comando AddFile, igual a como lo hara cuando est agregando otro archivo al proyecto. Un proyecto puede tener solamente un Resource File; si agrega un segundo archivo con extensin .res, ocurre un error. Usando Resource Files en cdigo Visual Basic proporciona tres funciones para recuperar datos del Resource File en cdigo. Funcin Descripcin LoadResString Regresa una cadena de texto. LoadResPicture Regresa un objeto de imagen, tal como un mapa de bits, icono o cursor. LoadResData Regresa un arreglo Byte. Esto es usado, por ejemplo, en archivos .wav. Para mayor informacin vea la funcin apropiada en Language Reference en Books Online. Trabajando con plantillas (Templates) Visual Basic proporciona una variedad de plantillas para la creacin de componentes de aplicacin comunes. En vez de crear todas las piezas de su aplicacin desde cero, puede personalizar una plantilla existente. Puede incluso re usar componentes personales en mltiples aplicaciones usando sus propias plantillas. Puede abrir una plantilla existente seleccionando su icono de la caja de dilogo Add Object cuando Usted crea un nuevo formulario, mdulo, control, pgina de propiedad, o documento. Por ejemplo, Visual Basic proporciona una plantilla de formulario intrnseca para la creacin de la caja de dilogo About, caja de dilogo Options, o Splash Screen.

194

Cuando abre una plantilla, Visual Basic despliega el objeto con lugares que puede Usted personalizar. Por ejemplo, para crear una caja de dilogo About, abra la plantilla About Dialog y sustituya los lugares Application Title, Version, y App Description, con informacin especfica a su aplicacin. Para crear su propia plantilla, salve el objeto que desea usar como plantilla, despus cpielo al subdirectorio apropiado del directorio Visual Basic Template. Por ejemplo, para crear la plantilla formulario MyForm, salve un formulario llamado MyForm, y despus copie el archivo MyForm.frm al directorio \vb\Template\Forms. Cuando selecciona el comando Add Form, a partir del men Project, Visual Basic despliega la plantilla MyForm en la caja de dilogo Add Form. Puede desactivar el despliegue de plantillas en la caja de dilogo objeto Add seleccionando el comando Options, en el men Tools y borrando la opcin Show Templates en la pestaa Environment de la caja de dilogo Options. Por ejemplo, para desactivar el despliegue de plantillas de formulario, borre la opcin Forms de la caja de dilogo. Trabajando con interruptores de lneas de comando (Command Line Switches) Los interruptores de lneas de comandos proporcionan un medio para controlar cmo Visual Basic se ejecuta. Usando los interruptores de lneas de comando puede iniciar una instancia de Visual Basic y correr un proyecto especfico, crear un archivo ejecutable o una librera de enlace dinmico o es especificar una cadena a ser pasada a un funcin Command$ Por ejemplo, para correr el proyecto MyProyect.vbp y despus salir en forma automtica, inicie Visual Basic con la siguiente lnea de comando: C:\Program Files\DevStudio\vb\vb5.exe / runexit MyProject.vbp La siguiente tabla resume los interruptores de lneas de comando de Visual Basic: Interruptor /cmd cmdString /d compileConst /make projectName /makedll projectName /mdi /out fileName /run projectName /runexit projectName /sdi /? Descripcin Especifica una cadena de comando a ser pasada a la funcin Command$. Cuando es usado, debe ser el ltimo interruptor en la lnea de comando. Especifica una o ms constantes de compilacin condicional para usar con el interruptor /make o /makedll. Convierte el proyecto especificado en un archivo ejecutable. Convierte el proyecto especificado en una librera de enlace dinmico. Inicia Visual Basic usando el ambiente de programacin de interfase de documentos mltiples (MDI). Da salida a los errores a un archivo cuando es usado con los interruptores /make o /makedll. Ejecuta el proyecto especificado. Ejecuta el proyecto especificado y ejecuta la salida en forma automtica. Inicia Visual Basic usando el ambiente de programacin de interfase de documento sencillo (SDI). Despliega una lista de interruptores de lneas de comando vlidos.

Para mayor informacin vea Command Line Switches en Language Reference en Books Online. Compilando su proyecto a cdigo nativo Puede compilar su cdigo en el formato p-code Visual Basic estndar o en el formato de cdigo nativo. La compilacin de cdigo nativo proporciona diversas opciones para optimizacin y rastreo que no estn disponibles con p-code. p-code o pseudo code, es un paso intermedio entre instrucciones de alto nivel en su programa Visual Basic y el cdigo de bajo nivel que el procesador de su computador ejecuta. En tiempo de ejecucin, Visual Basic traduce cada declaracin p-code a cdigo nativo. Compilndolo directamente al formato de cdigo nativo, elimina el paso p-code intermedio.

195

Puede rastrear el cdigo nativo compilado usando herramientas de rastreo de cdigo nativo, tales como el ambiente de rastreo proporcionado por Visual C ++. Puede tambin usar opciones disponibles en lenguajes tales como Visual C ++ para optimizar y rastrear el cdigo nativo. Por ejemplo, puede optimizar cdigo para aumentar velocidad de ejecucin o para disminuir de tamao en bytes. Para compilar un proyecto a cdigo nativo: 1. En la ventana Project, seleccione el proyecto que desea compilar. 2. A partir del men Project, elija Project Properties. 3. En la caja de dilogo Project Properties, de clic en pestaa Compile. 4. Seleccione Compile to Native Code. Visual Basic dispone de diversas opciones para personalizar y optimizar el archivo ejecutable. Por ejemplo, para crear cdigo compilado que ser optimizado en tamao, seleccione la opcin Optimize for Small Code. Para adicionales opciones de optimizacin avanzadas de click al botn Advanced Optimizations. 5. Seleccione las opciones que desea, y de click a OK. 6. A partir del men File, elija Make Exe, o Make Project Group. La siguiente tabla describe las opciones cdigo nativo para optimizacin: Opcin Assume No Aliasing (Optimizacin Avanzada) Descripcin Le dice al compilador que su programa no usa aliasing. Marcar esta opcin permite al compilador aplicar optimizacin, tales como almacenar variables en registros y ejecutar bucles optimizados. Create Symbolic Debug Info Produce un archivo .pdf y .exe o archivo .dll conteniendo informacin para permitir el rastreo usando Microsoft Visual C ++ 5.0 u otro rastreador compatible. Favor Pentium Pro(tm) Optimiza el cdigo para favorecer al procesador Pentium Pro (tm). No Optimization Desactiva todas las optimizaciones. Optimize for fast code Aumenta velocidad de proceso de archivos .exe y .dll dicindole al compilador que favorezca la velocidad sobre el tamao. Optimize for small code Disminuye el tamao de archivos .exe y .dll dicindole al compilador que favorezca el tamao sobre la velocidad. Remove Array Bounds Checks Desactiva el chequeo de fronteras de arreglo Visual Basic. (Advanced Optimization) Remove Floating Point Error Desactiva el chequeo de error de punto flotante de Visual Basic. Checks (Advanced Optimization) Remove Integer Overflow Checks Desactiva el chequeo de rebalse de entero de Visual Basic (integer (Advanced Optimization) overflow). Remove Safe Pentium(tm) FDIV Desactiva chequeo para seguridad de la divisin de punto flotante Checks (Advanced Optimization) del procesador Pentium(tm). Para mayor informacin sobre opciones de cdigo nativo vea Interruptores del compilador de cdigo nativo. Traduccin: Derechos de Autor: RBsoftware (2001) Jueves, 3 de mayo 2001. 09:36am. Archivo: Traduccin VB25. Creando sus propios tipos de datos (user-defined types) Puede combinar variables de diferentes tipos para crear tipos definidos por el usuario (conocidos con structs en el lenguaje de programacin C). Los tipos definidos por el usuario son tiles cuando desea crear una sola variable que contenga diversas piezas de informacin relacionada.

196

Usted crea los tipos definidos por el usuario con la declaracin Type, la cual debe ser situada en la seccin de declaraciones de un mdulo. Los tipos definidos por el usuario pueden ser declarados privados o pblicos con la apropiada palabra reservada. Por ejemplo: Private Type MyDataType o Public Type MyDataType Por ejemplo, Usted puede crear un tipo definido por el usuario que registre informacin acerca de un sistema de computacin: declaraciones (de un mdulo estndar). Private Type SystemInfo CPU As Variant Memory As Long VideoColors As Integer Cost As Currency PurchaseDate As Variant End Type Declarando variables de tipo definido por el usuario Puede declarar las variables del mismo tipo definido por el usuario como locales, privadas a nivel de mdulo, y pblicas a nivel de mdulo: Dim MySystem As SystemInfo, YourSystem As SystemInfo La siguiente tabla ilustra dnde y con qu alcance, puede declarar tipos definidos por el usuario y sus variables. Procedure/Module Procedimientos Mdulos estndar Mdulos de formulario Mdulos de clases Usted puede crear un tipo Las Variables de tipo definido definido por el usuario como por el usuario pueden ser declaradas como No aplicable Solo local. Privado o Pblico Privado o Pblico Solo Privado Solo Privado Solo Privado Solo Privado

Asignando y recuperando valores La asignacin y recuperacin de valores de los elementos de estas variables es similar establecer y obtener propiedades: MySystem.CPU = 486 If MySystem.PurchaseDate > 1/1/92# Then Puede asignar una variable a otra si ella es del mismo tipo definido por el usuario. Esto asigna todos los elementos de una variable a los mismo elementos de otra variable. YourSystem = MySystem Tipos definidos por el usuario que contienen arreglos Un tipo definido por el usuario puede contener un arreglo ordinario (de tamao fijo). Por ejemplo: Type SystemInfo CPU As Variant Memory As Long DiskDrives(25) As String arreglo de tamao fijo. VideoColors As Integer Cost As Currency PurchaseDate As Variant End Type Pueden tambin contener arreglos dinmicos.

197

Type SystemInfo CPU As Variant Memory As Long DiskDrives( ) As String VideoColors As Integer Cost As Currency PurchaseDate As Variant End Type

arreglo dinmico.

Usted accede a los valores del arreglo dentro del tipo definido por el usuario de la misma forma que accede a la propiedad de un objeto. Dim MySystem As SystemInfo ReDim MySystem.DiskDrives(3) MySystem.DiskDrives(0) = 1.44 MB Puede tambin declarar un arreglo de tipos definidos por el usuario: Dim AllSystems (100) As SystemInfo Siga las mismas reglas para acceder a los componentes de esta estructura de datos. AllSystems (5).CPU = 386SX AllSystems (5).DiskDrives(2) = 100M SCSI Pasando tipos definidos por el usuario a procedimientos Puede pasar argumentos de procedimientos usando tipos definidos por el usuario. Sub FillSystem (SomeSystem As SystemInfo) SomeSystem.CPU = lstCpu.Text SomeSystem.Memory = txtMemory.Text SomeSystem.Cost = txtCost.Text SomeSystem.PurchaseDate = Now End Sub Nota: Si desea pasar un tipo definido por el usuario a un formulario o a un mdulo de clase, el procedimiento debe ser privado. Puede retornar tipos definidos por el usuario desde funciones, y puede pasar una variable de tipo definido por el usuario a un procedimiento como uno de sus argumentos. Los tipos definidos del usuario son siempre pasados por referencia, as que el procedimiento puede modificar el argumento y retornarlo al procedimiento que ha efectuado la llamada. Para leer ms sobre pasar por referencia, vea Pasando argumentos a procedimientos en Fundamentos de programacin. Tipos definidos por el usuario que contienen objetos Los tipos definidos por el usuario tambin pueden contener objetos. Private Type AccountPack FrmInput As Form DbPayRollAccount As Database End Type Tip: En vista de que el tipo de datos Variant puede contener diferentes tipos de datos, un arreglo Variant puede ser usado en muchas situaciones en donde Usted espera usar tipos definidos por el usuario. Un arreglo Variant es en realidad ms flexible que un tipo definido por el usuario, porque Usted puede cambiar el tipo de dato que almacena en cada elemento en cualquier momento, y puede hacer el arreglo dinmico de forma que puede cambiar su tamao a como lo necesite. Sin embargo, un arreglo Variant siempre usa ms memoria que un tipo definido por el usuario equivalente.

198

Anidando estructuras de datos Las estructuras de datos anidadas pueden ser tan complejas como Usted lo desea. En realidad, los tipos definidos por el usuario pueden contener otros tipos definidos por el usuario, como se muestra en el siguiente ejemplo. Para hacer ms leble su cdigo y ms fcil de rastrear, trate de mantener todo el cdigo que define los tipos definidos por el usuario en un mdulo. Type DriveInfo Type As String Size As Long End Type Type SystemInfo CPU As Variant Memory As Long DiskDrives(26) As DriveInfo Cost As Currency PurchaseDate As Variant End Type Dim AllSystems (100) As SystemInfo AllSystems(1).DiskDrives(0).Type = Floppy Usando enumeraciones para trabajar con juego de constantes Las enumeraciones proporcionan un medio conveniente para trabajar con juegos de constantes relacionadas y para asociar valores de constantes con nombres. Por ejemplo, puede declarar una enumeracin para un juego de constantes enteras asociadas con los das de la semana, despus usar los nombres de los das en cdigo en vez de sus valores enteros. Crea una enumeracin declarando un tipo enumeracin con la declaracin Enum en la seccin de declaraciones de un mdulo estndar o en un mdulo de clase pblico. Los tipos enumeracin pueden ser declarados como pblicos o privados con la palabra reservada apropiada. Por ejemplo: Private Enum MyEnum o Public Enum MyEnum Por defecto, la primera constante en una enumeracin es inicializada al valor 0, y las subsecuentes constantes son inicializadas al valor de uno ms que la constante previa. Por ejemplo, la siguiente enumeracin, Days, contiene una constante llamada Sunday con valor cero, una constante llamada Monday con el valor uno, una constante llamada Tuesday con el valor 2, y as sucesivamente. Public Enum Days Sunday Monday Tuesday Wednesday Thursday Friday Saturday End Enum Tip: Visual Basic proporciona una enumeracin intrnseca, vbDayOfWeek, conteniendo las constantes de los das de la semana. Para ver las constantes predefinidas de enumeraciones, teclee vbDayOfWeek en la ventana de cdigo, seguida de un punto. Visual Basic automticamente despliega la lista de constantes de la enumeracin. Puede explcitamente asignar valores a constantes en una enumeracin usando una declaracin de asignacin. Puede asignar cualquier valor entero largo, incluyendo nmeros negativos. Por ejemplo, puede desear constantes con valores menores que cero para representar condiciones de error.

199

En la siguiente enumeracin, a la constante Invalid le es asignado explcitamente el valor 1, y a la constante Sunday le es asignado el valor de cero. En vista de que Saturday es la primera constante en la enumeracin, tambin le es asignado el valor 0. El valor de Monday es uno (uno ms que el valor de Sunday), Tuesday tiene el valor 2, y as, sucesivamente. Public Enum WorkDays Saturday Sunday = 0 Monday Tuesday Wednesday Thursday Friday Invalid = -1 End Enum Nota: Visual Basic trata los valores de las constantes en una enumeracin como enteros largos. Si asigna un valor de punto flotante en una enumeracin, Visual Basic redondea el valor al entero largo ms prximo. A travs de la organizacin de juegos de constantes relacionadas en enumeraciones pueden usar los mismos nombres de constantes en diferentes contextos. Por ejemplo, puede usar los mismos nombres de las constantes de los das de la semana en las enumeraciones Days y WorkDays. Para evitar ambiguas referencias cuando se refiera a una constante especfica, califique a la constante con su enumeracin. El siguiente cdigo hace referencia a la constante Saturday en las enumeraciones Days y WorkDays, desplegando sus diferentes valores en la ventana inmediata. Debug.Print Days.Saturday = & Days.Saturday Debug.Print WorkDays.Saturday = & WorkDays.Saturday Puede tambin usar el valor de una constante en una enumeracin cuando asigna el valor de una constante en una segunda enumeracin. Por ejemplo, la siguiente declaracin de la enumeracin WorkDays es equivalente a la declaracin previa. Public Enum WorkDays Sunday = 0 Monday Tuesday Wednesday Thursday Friday Saturday = Days.Saturday 6 Invalid = -1 End Enum Despus que declara un tipo enumeracin, puede declarar una variable de ese tipo, despus usar la variable para almacenar los valores constantes de enumeracin. El siguiente cdigo usa una variable del tipo WorkDays para almacenar valores enteros asociados con las constantes en la enumeracin WorkDays. Dim MyDay As WorkDays MyDay = Saturday Saturday equivale a cero. If MyDay < Monday Then Monday equivale a 1, entonces Visual Basic despliega un mensaje de error. MsgBox Es Fin de Semana. Da de Trabajo Invlido! End If Notar que cuando teclea la segunda lnea de cdigo en el ejemplo (MyDay=), Visual Basic automticamente despliega las constantes de enumeracin WorkDays en la ventana Auto List Members. En vista de que la constante Sunday tambin equivale a cero, Visual Basic tambin despliega el mensaje de error si sustituye Saturday con Sunday en la segunda lnea del ejemplo. MyDay = Sunday Sunday tambin equivale a cero.

200

Nota: Aunque normalmente Usted asigna solamente valores de constantes enumeracin a variables declaradas de tipo enumeracin, puede asignar cualquier valor entero largo a la variable. Visual Basic no generar un error si asigna un valor a la variable que no est asociada con una de las constantes de enumeracin. Para mayor informacin vea Enum Statement en Language Reference en Books Online. Tambin vea Proporcionando constantes nombradas para su componente en Creacin de componentes ActiveX en Gua de Herramientas de Componentes. Usando colecciones como alternativa a arreglos Aunque las colecciones son ms a menudo usadas para trabajar con objetos, puede usar la coleccin para trabajar con cualquier tipo de datos. En algunas circunstancias, puede ser ms eficiente almacenar elementos en una coleccin que en un arreglo. Puede usar una coleccin si est trabajando con un pequeo nmero dinmico de elementos. El siguiente fragmento de cdigo muestra cmo puede usar una coleccin para salvar y desplegar una lista de direcciones URL. coleccin a nivel de mdulo. Public colURLHistory As New Collection cdigo para agregar la direccin URL especificada a la coleccin. Private Sub SaveURLHistory (URLAddress As String) ColURLHistory.Add URLAddress End Sub cdigo para desplegar la lista de direcciones URL. Private Sub PrintURLHistory ( ) Dim URLAddress As Variant For Each URLAddress in colURLHistory Debug.Print URLAddress Next URLAddress End Sub Para mayor informacin sobre el uso de colecciones vea Programando con sus propios objetos en Programando con objetos. Para aprender ms acerca del uso de arreglos vea Arreglos, en Fundamentos de programacin. Programando con objetos Los objetos son importantes en la programacin con Visual Basic. Formularios y controles son objetos. Las bases de datos son objetos. Existen objetos en cualquier parte que Usted mire. Si Usted ha usado Visual Basic por un momento, o si ha trabajado a travs de los ejemplos en los primeros cinco captulos de este libro, entonces Usted ya ha programado con objetos pero existen mucho ms sobre objetos que lo que Usted ha visto hasta ahora. En este captulo, los tipos definidos por el usuario tomarn su propia personalidad, y se convertirn en clases. Usted ha visto cun fcil es crear sus propios objetos a partir de clases que Usted define, y el uso de objetos para simplificar su codificacin e incrementar el re uso de cdigo. Aplicacin ejemplo Algunos de los ejemplos de cdigo en este captulo son tomados de la aplicacin ejemplo ProgWOb.vbg que encontrar en el subdirectorio \ProgWOb en el directorio de los ejemplos de Visual Basic (\VB\Samples\Pguide). Qu necesita saber acerca de objetos en Visual Basic Visual Basic facilita el uso de objetos, pero lo ms importante es que hace posible la transicin gradual entre la codificacin con procedimientos a la programacin con objetos.

201

Desde luego que ayuda que Usted haya estado trabajando con objetos por el tiempo que haya estado usando Visual Basic. Los tpicos siguientes extienden su conocimiento de los objetos de Visual Basic e introducen nuevas capacidades para que Usted obtenga ventajas de las mismas. Un minuto de trminos Lo que sigue es un paseo huracanado de trminos que conocer en discusiones sobre los objetos Visual Basic y sus capacidades. Si Usted viene de otros lenguajes de programacin o ha estado trabajando con terminologa ActiveX, este tpico le ayudar a hacer la transicin. Si Usted es nuevo, y no conoce sobre objetos, puede que encuentre todo esto un poco confuso. Eso estar bien tomando un rpido paseo de los trminos que Usted pronto mirar, iniciar a formarse una idea de cmo todo calza en su conjunto. A la vez que descubre ms acerca de objetos en el resto de este captulo, puede regresar a este tpico para integrar cada pieza de informacin dentro de un todo. Aqu vamos Los objetos son encapsulados esto es, ellos contienen cdigo y datos, haciendo ms fcil su mantenimiento que los modos tradicionales de escribir cdigo. Los objetos de Visual Basic tienen propiedades, mtodos y eventos. Las propiedades son datos que describen un objeto. Los mtodos son cosas que Usted puede decir al objeto que haga. Los eventos son cosas que el objeto hace; Usted puede escribir cdigo que ser ejecutado cuando ocurra el evento. Los objetos en Visual Basic son creados a partir de clases, por eso se dice que un objeto es una instancia de una clase. La clase define la interfase del objeto, si el objeto es pblico, y bajo qu circunstancias puede ser creado. Las descripciones de las clases son almacenadas en libreras de tipo (type libraries), y puede ser vistas usando desplegadores de objeto (object browsers). Para usar un objeto, debe mantener una referencia a l en una variable objeto. El tipo de enlace o sujecin determina la velocidad con la cual los mtodos de un objeto son accedidos usando la variable objeto. Una variable objeto puede ser de sujecin tarda (late bound) (la ms lenta) o sujecin temprana (early bound). Las variables early bound pueden ser DisplDbound o vtable bound (la ms rpida). Un juego de propiedades y mtodos se llama interfase. La interfase por defecto de un objeto Visual Basic es una interfase dual la cual soporta todos los tres tipos de sujecin (binding). Si una variable objeto es strongly typed (es decir, Dim As ClassName), usar la forma ms rpida de sujecin. Adems de su interfase por defecto, los objetos Visual Basic pueden implementar interfases extras para proporcionar polimorfismo. El polimorfismo le permite manipular muchos tipos diferentes de objetos sin preocuparse de qu tipo cada uno es. Las interfases mltiples es una caracterstica del modelo de objetos componentes (COM: Component Object Model); ellos permiten que sus programas evolucionen con el tiempo, agregndoles nuevas funciones sin necesidad de destruir el cdigo antiguo. Uf! Si todo esto le pareci fcil, no tendr problemas en el resto de este captulo. Si no, no se preocupe encontrar explicaciones localizadas estratgicamente de todos estos trminos salpicadas a travs del texto (y presentadas de forma menos frentica). Para un listado alfabtico de los trminos de Visual Basic y sus definiciones, de clic en el botn Glossary en la barra de herramientas de Books Online. Descubriendo la clase a que pertenece un objeto Las variables objeto genricas (o sean, las variables que Usted declara como As Objetc) pueden guardar objetos de muchas clases diferentes. De forma similar, las variables declaradas con tipos de control y formularios intrnsecos pueden contener formularios y controles de diferentes clases.

202

Cuando est usando variables de estos tipos, puede necesitar tomar diferentes acciones en base de la clase de un objeto por ejemplo, algunos objetos pueden no soportar un mtodo o propiedad en particular. Visual Basic proporciona dos medios para hacer esto: la palabra reservada TypeOf y la funcin TypeName. La palabra reservada TypeOf puede solamente ser usada en declaraciones IfThenElse. Usted debe incluir el nombre de la clase en su cdigo. Por ejemplo; If TypeOf MyControl Is CheckBox Then La funcin TypeName es ms flexible. Puede usarla en cualquier lugar en su cdigo, y en vista de que regresa el nombre de la clase como una cadena, puede compararla con el valor de una variable de cadena. Ejecutando acciones mltiples sobre un objeto A menudo necesita ejecutar diversas y diferentes acciones sobre el mismo objeto. Por ejemplo, puede necesitar establecer diversas propiedades para el mismo objeto. Una forma de hacer esto es usar varias declaraciones. Private Sub Form_Load ( ) Command1.Caption = OK Command1.Visible = True Command1.Top = 200 Command1.Left = 5000 Command1.Enabled = True End Sub Observe que todas estas declaraciones usan la misma variable objeto: Command1. Puede hacer que este cdigo sea ms fcil de escribir, ms fcil de leer, y ms eficiente usando la declaracin WithEnd With: Private Sub Form_Load ( ) With Command1 .Caption = OK .Visible = True .Top = 200 .Left = 5000 .Enabled = True End With End Sub Puede tambin anidar las declaraciones With, situando una declaracin WithEnd With dentro de otra declaracin WithEnd With. Usando propiedades por defecto Muchos objetos tienen propiedades por defecto. Puede usar las propiedades por defecto para simplificar su cdigo, en vista de que Usted no tiene que hacer explcita referencia a la propiedad para establecer su valor. Para un objeto en donde Value es su propiedad por defecto, estas dos declaraciones son equivalentes: Object = 20 y Object.Value = 20 Para que vea cmo trabaja esto, dibuje un CommandButton y un TextBox en un formulario. Agregue el siguiente cdigo al evento click del botn de comando: Text1 = Hola Ejecute la aplicacin y de click al botn de comando. En vista de que Text es la propiedad por defecto del TextBox, la caja de texto desplegar el texto, Hola. Usando las propiedades por defecto con variables objeto Cuando una referencia a un objeto es almacenada en una variable objeto, Usted todava puede usar su propiedad por defecto. El siguiente fragmento de cdigo demuestra esto: Private Sub Command1_Click ( ) Dim obj As Object

203

site una referencia a Text1 en la variable objeto. Set obj = Text1 establezca el valor de la propiedad por defecto (text). Obj = Hola End Sub En el cdigo anterior, obj = Hola es exactamente lo mismo que teclear obj.Text=Hola. Usando las propiedades por defecto con Variants El acceso a las propiedades por defecto es diferente cuando una referencia a un objeto es almacenada en una variable de tipo Variant, en vez de una variable objeto. Esto se motiva por que una variant puede contener datos de muchos diferentes tipos. Por ejemplo, puede leer la propiedad por defecto de Text1 usando una referencia en una Variant, pero tratar de asignar la palabra Adis a la propiedad por defecto no funciona. Al contrario, sustituye la referencia al objeto con la cadena, y cambia el tipo variant. Para que vea cmo trabaja esto, introduzca el siguiente cdigo en el evento Click del botn de comando del ejemplo previo: Private Sub Command1_Click ( ) Dim vnt As Variant establezca la propiedad por defecto (text) a hola Text1 = hola site una referencia a Text1 en la variant. Set vnt = Text1 despliegue la propiedad por defecto de Text1, y muestre que la variant contiene una referencia objeto. MsgBox vnt , , IsObject? & IsObject(vnt) intente establecer la propiedad por defecto de Text1. Vnt= adis MsgBox vnt , , IsObject? & IsObject(vnt) End Sub Cuando corre la aplicacin y da click al botn de comando, primero obtiene un mensaje desplegando el valor actual de la propiedad por defecto de Text1, hola, que puede verificar viendo a Text1. El Caption de la caja de mensaje confirma que la variante contiene una referencia objeto esto es, una referencia a Text1. Cuando da click al botn OK en la caja de mensaje, adis es asignado a la variant destruyendo la referencia a Text1. Otro mensaje es entonces desplegado, mostrando el contenido de la variant el cual, como Usted podr ver, no es igual al valor actual de Text1.Text. El Caption de la caja de mensaje confirma que la variant ya no contiene una referencia objeto ahora contiene la cadena adis. Para detalles sobre variants y otros tipos de datos, vea Introduccin a variables, constantes y tipos de datos, en Fundamentos de programacin. Otros aspectos de usos de objetos con variants son discutidos en El objeto collection Visual Basic. Creacin de arreglos de objetos Puede declarar y usar arreglos de un tipo de objeto igual a como declara y usa un arreglo de cualquier tipo de datos. Estos arreglos pueden ser fijos o dinmicos. Arreglos de variables de formulario Puede declarar un arreglo de formularios con Private, Dim, ReDim, Static, o Public, de la misma forma que declara un arreglo de cualquier otro tipo. Si declara el arreglo con la palabra reservada New, Visual Basic automticamente crea una nueva instancia del formulario por cada elemento en el arreglo como Usted usa los elementos en el arreglo.

204

Private Sub Command1_Click ( ) Dim intX As Integer Dim frmNew (1 To 5) As New Form1 For intX = 1 To 5 frmNew(intX).Show frmNew(intX).WindowState = vbMinimized para crear formularios minimizados sin tener que verlos aparecer brevemente en tamao normal, revierta el orden de las dos lneas mostradas arriba. Next End Sub Presionando el botn de comando para ejecutar el cdigo arriba citado, crear cinco instancias de Form1 minimizadas. Nota: Si Usted mira a la barra de tareas, ver Form1 seis veces. La instancia extra de Form1 no est minimizada es con la que Usted comenz. Arreglos de variables de control Puede declarar un arreglo de controles con Private, Dim, ReDim, Static, o Public, de la misma forma que declara un arreglo de cualquier otro tipo. Sin embargo, al contrario de los arreglos de formularios, los arreglos de control no pueden ser declarados con la palabra reservada New. Por ejemplo, puede declarar que un arreglo sea de un especfico tipo de control: ReDim ActiveImages(10) As Image Cuando declara un arreglo para que sea de un particular tipo de control, puede asignar solo controles de ese tipo al arreglo. Por ejemplo, en el caso de la declaracin precedente, Usted podr asignar solamente controles Image al arreglo aunque estos controles Image pueden provenir de diferentes formularios. Esto contrasta con la coleccin de controles intrnseca, que puede contener diferentes tipos de controles pero todos ellos deben estar en el mismo formulario. De forma alternativa, Usted puede declarar un arreglo de variables de control genricas. Por ejemplo, podra desear mantener la pista de cada control que haya sido depositado dentro de un control en particular, y no permitir que se sigan depositando ms controles de los que ya estn. Puede hacer esto manteniendo un arreglo dinmico de variables de control que contengan referencias para cada control que haya sido depositado: Private Sub List1_DragDrop(Source As VB.Control, X As Single, Y As Single) Dim intX As Integer Static intSize As Integer Static ctlDropped( ) As Control For intX=1 To intSize si el control depositado est en el arreglo, este ya ha sido depositado una vez. If ctlDropped(intX) Is Source Then Beep Exit Sub End If Next agrandar el arreglo. IntSize=intSize +1 ReDim Preserve ctlDropped(intSize) salvar la referencia al control que fue depositado. Set ctlDropped(intSize) = Source agregar el nombre del control al ListBox. List1.AddItem Source.Name End Sub

205

Este ejemplo usa el operador Is para comparar las variables en el arreglo de control con el argumento del control. El operador Is puede ser usado para probar la identidad de las referencias del objeto Visual Basic: si compara dos referencias diferentes para el mismo objeto, el operador retorna True. El ejemplo tambin usa la declaracin Set para asignar la referencia objeto en el argumento Source a un elemento en el arreglo. Para mayor informacin vea Is Operator en Language Reference en Books Online. Los arreglos son introducidos en Arreglos y Arreglos Dinmicos en Fundamentos de programacin. Para una manera ms fcil de seguir la pista de objetos, vea Creacin de colecciones de objetos ms adelante en este captulo. Traduccin: Derechos de Autor: RBsoftware (2001) Jueves, 3 de mayo 2001. 11:49pm. Archivo: Traduccin VB26.

Creacin de colecciones de objetos Las colecciones proporcionan un medio til para mantener la pista de los objetos. Al contrario de los arreglos, la coleccin de objetos no necesita volverse a dimensionar a medida que se agregan o eliminan miembros. Por ejemplo, puede desear seguir la pista de cada control que se deposite en otro control, y no permitir que cualquier control no sea depositado ms de una vez. Usted puede hacer esto manteniendo una coleccin que contenga una referencia para cada control que haya sido depositado. Private Sub List1_DragDrop(Source As VB.Control, X As Single, Y As Single) Dim vnt As Variant Static colDroppedControls As New Collection For Each vnt In colDroppedControls si el control depositado est en la coleccin, ya ha sido depositado una vez. If vnt Is Source Then Beep Exit Sub End If Next salvar la referencia del control que ha sido depositado. ColDroppedControls.Add Source agregue el nombre del control al List.Box. List1.AddItem Source.Name End Sub Este ejemplo usa el operador Is para comparar las referencias del control en la coleccin colDroppedControls con el argumento de evento conteniendo la referencia del control depositado. El operador Is puede ser usado para probar la identidad de las referencias objeto de Visual Basic: si compara dos diferentes referencias del mismo objeto, el operador Is retorna True. El ejemplo tambin usa el mtodo Add del objeto coleccin para situar una referencia del control depositado en la coleccin. Al contrario de los arreglos, las colecciones son ellas mismas objetos. La variable colDroppedControls es declarada As New, por tal causa una instancia de la clase coleccin ser creada la primera vez que la variable sea referida en cdigo. La variable tambin es declarada Static, por tal causa el objeto coleccin no ser destruido cuando el procedimiento de evento finalice.

206

Para mayor informacin vea Is Operator en Language Reference en Books Online. Propiedades y mtodos del objeto coleccin son discutidas en El objeto coleccin de Visual Basic ms adelante en este captulo. Para comparar el cdigo antes descrito con el cdigo requerido para usar arreglos vea Creando arreglos de objetos visto anteriormente. Para aprender cmo crear colecciones ms robustas envolviendo el objeto coleccin en su propia clase de coleccin, vea Creando su propia clase de coleccin ms adelante en este captulo. Anteriormente en este captulo se muestra el ttulo Qu necesita saber acerca de objetos en Visual Basic, en donde se describe cmo los objetos son creados y destruidos. El objeto coleccin de Visual Basic Una coleccin es un medio de agrupar un juego de elementos relacionados. Las colecciones son usadas en Visual Basic para mantener la pista de muchas cosas, tales como las formas cargadas en su programa (la coleccin formularios), o todos los controles sobre un formulario (la coleccin Controls). Visual Basic proporciona la clase coleccin genrica para otorgarle la facilidad de definir sus propias colecciones. Puede crear tantos objetos coleccin es decir, tantas instancias de la clase coleccin como lo necesite. Puede usar los objetos coleccin como la base de sus propias clases de coleccin y modelos de objetos, como se describe en Creacin de sus propias clases coleccin y Modelos objeto ms adelante en este captulo. Por ejemplo, las colecciones son un buen medio para mantener la pista de mltiples formularios. En Aplicaciones (MDI) de Interfases de Documentos Mltiples en Creando una interfase de usuario se describen aplicaciones en las cuales el usuario puede abrir cualquier nmero de ventanas de documentos. El siguiente fragmento de cdigo muestra cmo podra usar el mtodo Add de un objeto coleccin para mantener la lista de ventanas child MDI que el usuario ha creado. Este cdigo asume que Usted tiene un formulario llamado mdiDocument, cuya propiedad MDIChild est puesta en True. coleccin a nivel de mdulo en el formulario padre MDIForm. Public colDocuments As New Collection cdigo para creacin de nuevos formularios childs. Private Sub mnuFileNew ( ) Dim f As New mdiDocument Static intDocumentNumber As Integer intDocumentNumber = intDocumentNumber + 1 la siguiente lnea crea el formulario. f.Caption = Document & intDocumentNumber agregue la referencia objeto a la coleccin: colDocuments.Add f f.Show End Sub La coleccin colDocuments acta como un sub conjunto de la coleccin Forms intrnseca, conteniendo solo instancias del formulario mdiDocument. El tamao de la coleccin es ajustado automticamente a medida que un nuevo formulario es agregado. Puede usar For EachNext para iterar dentro de la coleccin. Si desea otorgar al formulario una clave a travs de la cual pueda ser recuperado, puede suministrar una cadena de texto como segundo parmetro del mtodo Add, como se describir ms adelante en esta seccin. La palabra reservada New en la declaracin de la variable colDocuments ocasiona que el objeto coleccin sea creado la primera vez a que se haga referencia a esta variable en cdigo. En vista de que la coleccin es una clase, y no un tipo de dato, debe de crear una instancia de ella y mantener una referencia de esa instancia (objeto) en una variable.

207

Igual que cualquier otro objeto, el objeto coleccin ser destruido cuando la ltima variable conteniendo una referencia a l sea establecido a nulo o se vaya fuera de alcance. Todas las referencias objeto que contenga sern liberadas. Por esta razn, la variable colDocuments es declarada en el formulario padre MDIForm, de forma que este existe a travs de la vida del programa. Nota: Si usa una coleccin para mantener la pista de formularios, use el mtodo Remove de la coleccin para borrar la referencia objeto de la coleccin despus que descarga el formulario. Usted no puede reclamar la memoria que el formulario ha estado usando mientras una referencia al formulario an exista, y la referencia que el objeto coleccin est sosteniendo es tan correcta como una referencia en una variable objeto. De qu est hecho el objeto coleccin? Un objeto coleccin almacena cada elemento en un variant. De manera que la lista de cosas que Usted puede agregar a un objeto coleccin es la misma que la lista de cosas que puede agregar en una variant. Esto incluye tipos de datos estndar, objetos y arreglos pero no tipos definidos por el usuario (user-defined types). Las variants siempre usan 16 bytes, no importa lo que en ellas se almacene, de forma que el uso del objeto coleccin no es tan eficiente que el uso de arreglos. Sin embargo, Usted nunca tiene que volver a dimensionar (ReDim) un objeto coleccin, lo cual da por resultado en un cdigo ms limpio, de mejor mantenimiento. Adems, los objetos coleccin tienen extremadamente ms rpidas funciones de exploracin por clave que los arreglos no tienen. Nota: Para ser precisos, una variant siempre ocupa 16 bytes an cuando el dato es almacenado en cualquier otro lado. Por ejemplo, si asigna una cadena o un arreglo a una variant, la variant contiene un apuntador a una copia de la cadena o de los datos del arreglo. Solamente cuatro bytes de la variant son usados por el apuntador en sistemas de 32 bits, y en realidad ningn dato es almacenado dentro de la variant. Si almacena un objeto, la variant contiene la referencia al objeto, igual a como lo hace la variable objeto. Tal como sucede con cadenas y arreglos, solo 4 bytes de la variant son usados para contener objetos. Los tipos de datos numricos son almacenados dentro de la variant. Sin importar el tipo de dato, la variant siempre sigue tomando 16 bytes. A pesar del tamao de las variants, existirn muchos casos en que tiene sentido el uso del objeto coleccin para almacenar todos los tipos de datos antes descritos. Solamente est atento del negocio que est haciendo: los objetos coleccin le permiten escribir cdigo muy limpio, de fcil mantenimiento al costo de almacenar elementos en variants. Propiedades y mtodos del objeto coleccin Cada objeto coleccin contiene propiedades y mtodos que puede usar para insertar, borrar y recuperar elementos en la coleccin. Propiedad o mtodo Descripcin Mtodo Add Agrega elementos a la coleccin Propiedad Count Regresa el nmero de elementos en la coleccin. Solo lectura. Mtodo Item Regresa un elemento, por ndice, o por clave. Mtodo Remove Borra un elemento de la coleccin, por ndice o por clave. Estas propiedades y mtodos proporcionan solamente los servicios ms bsicos para las colecciones. Por ejemplo, el mtodo Add no puede verificar el tipo de objeto que est siendo agregado a la coleccin, para asegurar que la coleccin contiene solamente un tipo de objeto. Usted puede proporcionar mayor robustez a la funcin y adicionales mtodos, eventos y propiedades a travs de la creacin de su propia clase de coleccin, como se describe en Creacin de sus propias clases de coleccin ms adelante en este captulo. Los servicios bsicos de agregar, borrar y recuperar de una coleccin dependen de claves e ndices. Una clave es un valor de cadena. Puede ser un nombre, un nmero de licencia de conducir, o nmero de seguro social, o simplemente un entero convertido en una cadena. El mtodo Add permite asociar una clave con un elemento, como se describe ms adelante en esta seccin.

208

Un ndice es un tipo de dato largo (Long) entre uno (1) y el nmero de elementos de la coleccin. Usted puede controlar el valor inicial de un ndice del elemento, usando los parmetros llamados before y after, pero sus valores pueden cambiar a medida que se agreguen o borren elementos. Nota: Una coleccin cuyo ndice comienza con uno (1) es llamada base-uno, como se explic en Colecciones en Visual Basic. Puede usar el ndice para iterar sobre los elementos en una coleccin. Por ejemplo, el siguiente cdigo muestra dos formas para otorgar a todos los empleados de una coleccin el diez por ciento de aumento, asumiendo que la variable colEmployees contiene una referencia al objeto Collection. Dim lngCt As Long For lngCt=1 To colEmployees.Count ColEmployees(lngCt).Rate = colEmployees(lngCt).Rate * 1.1 Next Dim emp As Employee For Each emp In ColEmployees emp.Rate = emp.Rate * 1.1 Next Tip: Para un mejor desempeo, use For Each para iterar sobre los elementos del objeto coleccin. For Each es significativamente ms rpido que la iteracin con ndices. Esto no es aplicable en todas las implementaciones de colecciones esto depende de la forma en que la coleccin almacena los datos internamente. Agregando elementos a una coleccin Use el mtodo Add para agregar elementos a una coleccin. La sintaxis es: Sub Add (item As Variant [, key As Variant] [, before As Variant] [, after as Variant]) Por ejemplo, para agregar el objeto orden de trabajo a una coleccin de rdenes de trabajo usando la propiedad ID de la orden de trabajo como clave, puede escribir: ColWorkOrders.Add woNew, woNew.ID Esto asume que la propiedad ID es una cadena. Si la propiedad es un nmero (por ejemplo, Long), use la funcin CStr para convertirlo a la cadena requerida por las claves: ColWorkOrders.Add woNew, CStr(woNew.ID) El mtodo Add soporta argumentos nombrados. Para agregar un elemento como tercer elemento, escriba: ColWorkOrders.Add woNew, woNew.ID, after:=2 Puede usar los argumentos nombrados before y after para mantener una coleccin de objetos ordenados. Por ejemplo, before:=1 inserta un elemento al comienzo de la coleccin, en vista de que los objetos de la coleccin son en base a uno. Borrando elementos de una coleccin Use el mtodo Remove para borrar un elemento de una coleccin. La sintaxis es: Object.Remove index El argumento index puede ser la posicin del elemento que desea borrar, o la clave del elemento. Si la clave del tercer elemento en una coleccin es W017493 puede usar cualquiera de estas dos declaraciones para borrarlo: ColWorkOrders.Remove 3 o ColWorkOrders.Remove W017493 Recuperando elementos de una coleccin Use el mtodo Item para recuperar elementos especficos de una coleccin. La sintaxis es:

209

[Set] variable = object.Item(index) Como con el mtodo Remove, el ndice puede ser la posicin dentro de la coleccin, o la clave del elemento. Usando el mismo ejemplo del mtodo Remove, cualquiera de estas instrucciones recuperan el tercer elemento en una coleccin: Set woCurrent = colWorkOrders.Item(3) o Set woCurrent = colWorkOrders.Item(W017493) Si usa solo nmeros como clave, debe usar la funcin CStr para convertirlos a cadena antes de pasarlos a los mtodos Item o Remove. Un objeto coleccin siempre asume que un valor de solo nmeros es un ndice. Tip: No deje que los objetos coleccin decidan si un valor que Usted est pasando es un ndice o una clave. Si desea que un valor sea interpretado como una clave, y la variable que contiene el valor es cualquier cosa menos una cadena, use la funcin CStr para convertirlo. Si desea que un valor sea interpretado como un ndice, y la variable que contiene el valor no es una de tipo de dato entero, use la funcin CLng para convertirla. Item es el mtodo por defecto El mtodo Item es el mtodo por defecto para un objeto coleccin, de forma que puede omitirlo cuando accede un elemento en la coleccin. As, el ejemplo previo tambin pudo haber sido escrito as: Set woCurrent = colWorkOrders(3) O Set woCurrent = ColWorkOrders(W017493) Importante: Los objetos coleccin mantienen sus nmeros de ndices numricos automticamente a medida que Usted agrega o elimina elementos. El ndice numrico de un elemento determinado cambiar con el tiempo. No salve un valor de ndice numrico y espere que ste recuperar el mismo elemento ms tarde en su programa. Use claves para este propsito. Usando el mtodo Item para invocar Propiedades y Mtodos No necesita recuperar una referencia de un objeto de una coleccin y situarla en una variable objeto con el objetivo de usarla. Usted puede usar la referencia mientras est en la coleccin. Por ejemplo, suponga que el objeto WorkOrder en el cdigo anterior tiene la propiedad Priority. Las declaraciones siguientes establecern ambas la propiedad Priority de una orden de trabajo: ColWorkOrders.Item(W017493).Priority=3 ColWorkOrders(W017493).Priority=3 La razn de este trabajo es que Visual Basic evala la expresin de izquierda a derecha. Cuando viene con el mtodo Item explcito o implcito Visual Basic obtiene una referencia del elemento indicado (en este caso, el objeto WorkOrder cuya clave es W017493), y usa esta referencia para evaluar el resto de la lnea. Tip: Si Usted piensa invocar ms de una propiedad o mtodo de un objeto en una coleccin, copie la referencia objeto a una variable objeto de tipo fuerte primero. Usando una referencia objeto mientras est en la coleccin es ms lenta que usndola despus de depositarla en una variable objeto de tipo fuerte (por ejemplo, Dim woCurrent As WorkOrder), en vista de que el objeto coleccin almacena los elementos en variants. Las referencias a objeto en variants son siempre de lenta sujecin (late bound). El objeto coleccin es tambin una alternativa til de arreglos para muchas tareas de programacin ordinarias. Vea Usando colecciones como una alternativa a arreglos en Ms acerca de programacin. Visual Basic proporciona un nmero de colecciones intrnsecas. Para comparar estas con el objeto coleccin vea Colecciones en Visual Basic.

210

Colecciones en Visual Basic Qu es una coleccin? En El objeto coleccin Visual Basic, una coleccin fue definida como un medio para agrupar objetos relacionados. Esto permite un montn de interpretaciones; es ms un concepto que una definicin. De hecho, como lo ver cuando comience la comparacin de colecciones, existen un montn de diferencias an entre las clases de colecciones proporcionadas por Visual Basic. Por ejemplo, el siguiente cdigo ocasiona un error: Dim col As Collection Set col = Forms error! Qu est pasando aqu? La coleccin Forms es una coleccin; la variable col es declarada As Collection; por qu no puede Usted asignar una referencia a Forms a la variable col? La razn de esto es que la clase coleccin y la coleccin Forms no son polimrficas; es decir, Usted no puede intercambiar una por la otra, en vista de que ellas fueron desarrolladas a partir de cdigos base separados. Ellas no tienen los mismos mtodos, almacenan las referencias de la misma forma, o usan las mismas clases de valores de ndices. Esto hace que el nombre de la clase coleccin parezca una opcin peculiar, en vista de que realmente representa solamente una de muchas posibles implementacin de colecciones. Este tpico explora algunas de las diferencias en implementacin que encontrar. Colecciones base cero y base uno Una coleccin es base cero o base uno, en dependencia de cmo se inicia su ndice. Como Usted debe suponer, lo anterior significa que el ndice del primer elemento en la coleccin es cero, y el siguiente significa que es uno. Ejemplos de colecciones base cero son las colecciones Forms y Controls. El objeto Collection es un ejemplo de una coleccin base uno. Las viejas colecciones en Visual Basic eran base cero, mientras que las ms recientes son base uno. Las colecciones base uno son de cierta forma ms intuitivas en su uso, en vista de que el ndice va de uno a Count, en donde Count es la propiedad que retorna el nmero de elementos en una coleccin. En contraste, las colecciones base cero, van de cero a la propiedad Count menos uno. Valores ndice y clave Muchas colecciones en Visual Basic le permiten acceder a un elemento usando ya sea un ndice numrico o una clave de cadena, como el objeto Collection de Visual Basic lo hace. (Sin embargo, el objeto Collection de Visual Basic le permite agregar elementos sin especificar una clave). Por contraste, la coleccin Forms permite solamente un ndice numrico. Esto es porque ah no existe un valor nico de cadena asociado con un formulario. Por ejemplo, puede tener mltiples formularios con el mismo ttulo, o cargados mltiples formularios con la misma propiedad Name. Agregando y removiendo elementos Las colecciones tambin se diferencian en si o no se puedan agregar elementos a ellas, y si se puede agregar elementos, cmo estos elementos deben ser agregados. Por ejemplo, Usted no puede agregar una impresora a la coleccin Printers usando cdigo Visual Basic. En vista de que el objeto Collection es una herramienta de programacin de propsito general, es ms flexible que otras colecciones. Tiene el mtodo Add que puede usar para poner elementos dentro de la coleccin y tiene el mtodo Remove para quitar elementos de la coleccin. Por contraste, la nica forma de poner un formulario dentro de la coleccin Forms es cargar el formulario. Si crea un formulario con el operador New, o haciendo referencia a una variable declara como As New, este no ser cargado en la coleccin Forms hasta que use la declaracin Load para cargarlo.

211

Las colecciones Forms y Controls no tienen mtodos Remove. Usted agrega y remueve formularios y controles de estas colecciones indirectamente, usando las declaraciones Load y Unload. Qu es lo que tiene en sus bolsillos? Como antes se explic, un formulario no es agregado a la coleccin Forms hasta que es cargado. De forma que la definicin ms acertada de la coleccin Forms es que esta contiene todos los formularios cargados en la actualidad en el programa. Aunque esta definicin no est todava completamente acertada. Si su proyecto usa Forms de Microsoft (incluida por compatibilidad con Microsoft Office), Usted encontrar aquellos formularios en una coleccin separada llamada UserForms. De forma que la coleccin Forms contiene todos los formularios Visual Basic cargados actualmente en el programa. El contenido de una clase coleccin est muy precisamente especificado: cualquier cosa que pueda ser almacenado en una variant. De manera que el objeto Collection puede contener un objeto o un entero, pero no un tipo definido por el usuario (user-defined type). Desdichadamente, esta especificacin cubre demasiado territorio determinada instancia de una clase coleccin podra almacenar cualquier mezcla desordenada de tipos de datos, arreglos y objetos. Tip: Una de las ms importantes razones para la creacin de sus propias clases de colecciones, como se explic en Creando sus propias clases de coleccin, es que Usted puede controlar el contenido de sus colecciones un concepto llamado type safety. Enumerando una coleccin Puede usar For EachNext para enumerar los elementos en una coleccin, sin preocuparse acerca de si la coleccin es base cero o base uno. Desde luego, es difcil definir las caractersticas de las colecciones, porque Visual Basic le permite a Usted usar For EachNext para enumerar los elementos en un arreglo. Lo que hace trabajar a For EachNext es un pequeo objeto llamado enumerador. Un enumerador mantiene la pista de dnde Usted se encuentra en una coleccin, y retorna el siguiente elemento cuando este es necesitado. Cuando enumera un arreglo, Visual Basic crea un objeto enumerador de arreglo al vuelo. Las colecciones tienen sus propios objetos enumeradores, los cuales son creados al momento en que son necesitados. Los enumeradores no se saltan elementos Los enumeradores de colecciones en Visual Basic no se saltan elementos. Por ejemplo, supngase que Usted enumera una coleccin conteniendo A, B, y C, y mientras hace esto remueve B. Las colecciones Visual Basic no se saltan sobre C cuando hace esto. Los enumeradores no cogen elementos agregados Si agrega elementos en una coleccin mientras los enumera, algunos enumeradores incluirn los elementos agregados, mientras otros no. La coleccin Forms, por ejemplo, no enumerar ningn formulario que cargue mientras ejecuta la enumeracin. El objeto Collection enumerar los elementos que Usted agregue mientras ejecuta la enumeracin, si Usted permite que ellos sean agregados al final de la coleccin. Por tanto, el siguiente bucle nunca finaliza (a no ser que pulse CTRL+BREAK): Dim col As New Collection Dim vnt As Variant Col.Add Endless Col.add Endless For Each vnt In col MsgBox vnt

212

Col.Add Endless Next Por otro lado, los elementos que agregue al inicio de la coleccin no sern incluidos en la enumeracin: Dim col As New Collection Dim vnt As Variant Col.Add Will be enumerated For Each vnt In col MsgBox vnt agregar el elemento al comienzo. Col.Add Wont be enumerated, Before:=1 Next Por qu enumeradores? A travs de la emisin de un nuevo enumerador cada vez que un For EachNext se inicia, una coleccin permite enumeraciones anidadas. Por ejemplo, supngase que Usted tiene una referencia al objeto Collection en la variable mcolStrings, y que la coleccin contiene solamente cadenas. El siguiente cdigo imprime todas las combinaciones de dos cadenas diferentes: Dim vnt1 As Variant Dim vnt2 As Variant For Each vnt1 In mcolStrings For Each vnt2 In mcolStrings If vnt1<>vnt2 Then Debug.Print vnt1 & & vnt2 End If Next Next Para mayor informacin vea Creando sus propias clases Collection ms adelante en este captulo. Traduccin: Derechos de Autor: RBsoftware (2001) Sbado, 5 de mayo 2001. 08:04am. Archivo: Traduccin VB27. Encontrando objetos El object browser est basado en type libraries, recursos que contienen detallada descripcin de clases, incluyendo propiedades, mtodos, eventos, constantes nombradas, y ms. Visual Basic crea informacin de libreras tipo para las clases que Usted crea, proporcionan libreras tipo para los objetos que esta incluye, y le permite a Usted acceder a libreras tipo proporcionadas por otras aplicaciones. Usa el object browser para desplegar las clases disponibles en proyectos y libreras, incluyendo las clases que Usted haya definido. Los objetos que Usted crea a partir de esas clases tendrn los mismos miembros propiedades, mtodos y eventos que Usted ve en el object browser. Para desplegar el object browser: A partir del men View, elija Object Browser. O, pulse la tecla F2. O, de clic al botn Object Browser en la barra de herramientas. Por defecto, el object browser no puede ser atracado a otras ventanas. Esto le permite a Usted moverse entre el object browser y las ventanas de cdigo usando CTRL+TAB. Puede cambiar esto si, sobre el object browser, da clic al botn derecho del ratn para abrir su men contextual, y da clic en Docktable.

213

Nota: Cuando el object browser es docktable, no puede usar CTRL+TAB para moverse de aqu a las ventanas de cdigo. Los tpicos siguientes detallan caractersticas del object browser: Contenido del object browser El object browser muestra las clases y sus miembros. Las cadenas de descripcin le recuerdan a Usted para qu son los objetos, y muestran las plantillas de funcin. Encontrar y desplegar objetos Puede ubicar objetos y sus miembros, an cuando solo recuerde parte de su nombre. Agregar descripciones para sus objetos Descripciones que agrega a sus clases y a sus miembros pueden asistirle cuando use sus clases. Movindose entre procedimientos Puede ubicar mdulos y procedimientos en su proyecto, y saltar directamente a su cdigo. Desplegar objetos de otras aplicaciones Puede usar objetos de otras aplicaciones en su programa; el object browser le muestra los objetos Automation que otras aplicaciones proporcionan. Contenido del object browser El object browser despliega informacin en una jerarqua de tres niveles. Inicindose de arriba, puede seleccionar libreras y proyectos disponibles, incluyendo sus propios proyectos Visual Basic, usando la caja Project / Library. De clic en una clase, en la lista de clases, para ver su descripcin en la ventana que se muestra en la parte inferior de la pantalla. Las propiedades de la clase, mtodos, eventos y constantes se muestran en la lista de miembros, a la derecha. Las clases disponibles son desplegadas del proyecto o librera seleccionada de la caja Project / Library, o desde todos los proyectos y libreras y si se selecciona < All Libraries >. Usted puede ver los argumentos y valores de retorno de un miembro de la clase seleccionada, dndole clic al miembro en la lista de miembros. La ventana de descripcin en la parte inferior del object browser muestra esta informacin. Usted puede saltar a la librera u objeto que incluye a un miembro, dndole clic a la librera o nombre de objeto mostrado en la ventana de descripcin. Puede regresar dndole clic al botn Go Back en la parte superior del object browser. Tip: Cuando Usted se encuentra en la lista de clases o en la lista de miembros, teclear el primer carcter de un nombre lo mover al siguiente nombre que comienza con ese carcter. Controlando el contenido del object browser El men contextual proporciona una alternativa para los botones Copy y View Definition en el object browser. Esto tambin le permite a Usted abrir la caja de dilogo References, y si una clase o miembro est seleccionado ver las propiedades del elemento seleccionado. Usted puede establecer las descripciones de sus propios objetos usando este elemento de men, tal como se describe en Agregando descripciones a sus objetos. Si se da clic con el botn derecho sobre el object browser hace aparecer el men contextual. Adems de las funciones antes mencionadas, el men contextual controla el contenido de la lista de clases y la lista de miembros. Cuando Group Members es marcado, todas las propiedades de un objeto son agrupadas, todos los mtodos son agrupados, y as, sucesivamente. Cuando Group Members no es marcado, la lista de miembros se muestra en orden alfabtico. Cuando Show Hidden Members es marcado, la lista de clases y la lista de miembros despliegan la informacin marcada como escondida en la librera tipo. Normalmente Usted no necesita ver esta informacin. Los miembros escondidos se muestran con tipo gris claro. Tip: Cuando Group Members est seleccionado, tecleando la primera letra de un nombre har saltar al siguiente nombre que comienza con ese carcter, an cuanto el nombre se encuentre en otro grupo.

214

Encontrando y desplegando objetos Puede usar el object browser para encontrar objetos y sus miembros, y para identificar los proyectos o libreras de donde ellos provienen. Introduzca texto en la caja Search Text y de clic al botn Search (o presione Enter). Las clases y miembros cuyos nombres son iguales al texto que Usted ha especificado aparecern en la lista Search Result. Usted puede seleccionar un elemento de la lista Search Result, y ver su descripcin en la ventana ubicada en la parte inferior del object browser. Dar clic sobre el subrayado hace saltar dentro de la ventana de descripcin seleccionar la indicada librera o navegar por objetos o miembros. Usted puede restringir la bsqueda a elementos que exactamente coincidan con la cadena en la caja Search ponindole una marca a Find Whole Word Only en el men contextual. Agregando descripciones para sus objetos Puede usar el object browser para agregar descripciones y HelpContextIDs a sus propios procedimientos, mdulos, clases, propiedades y mtodos. Usted encontrar tiles estas descripciones mientras trabaja con sus clases. Nota: Usted tambin puede entrar descripciones para propiedades, mtodos y eventos usando la caja de dilogo Procedure Attributes, accedida a travs del men Tools. Para introducir cadenas de descripcin y enlazar sus clases con sus miembros a tpicos de ayuda: 1. Presione F2 para abrir el object browser. De la caja Project / Library seleccione su proyecto. 2. En la lista de clases, de click con el botn derecho sobre el nombre de la clase para hacer aparecer el men contextual, y de clic a las propiedades para abrir la caja de dilogo Member Options. De manera alterna, en la lista de miembros puede dar click con el botn derecho sobre el nombre de una propiedad, mtodo o evento que Usted haya agregado a la clase. En el men contextual de clic a propiedades. Si el miembro es Private o Friend, esto abrir la caja de dilogo Member Options. Si el miembro es Public es decir, es parte de una interfase de clase abrir por el contrario la caja de dilogo Procedure Attributes. Nota: La diferencia entre estas dos cajas de dilogo es que la caja de dilogo Procedure Attributes tiene un botn Advanced que puede ser usado para hacer que un miembro sea el defecto de una clase, como se describe en Haciendo por defecto una propiedad o un mtodo ms adelante en este captulo. 3. En la caja HelpContextID, teclee el contexto ID del tpico de ayuda que ser mostrado si Usted da clic al botn ? cuando esta clase o miembro es seleccionado en el object browser. Nota: Usted puede crear un archivo de ayuda para su propio uso, y enlazar los tpicos a sus clases y sus miembros. Para especificar un archivo de ayuda para su proyecto, use la pestaa General de la caja de dilogo Project Properties, accedida a partir del men Project. 4. 5. 6. En la caja Description, teclee una breve descripcin para la clase o el miembro. De click en OK para regresar al object browser. La cadena de descripcin que haya introducido deber aparecer en la ventana descripcin en la parte inferior del object browser. Repita los pasos 2 a 5 para cada clase, y para cada miembro de cada clase.

Nota: Usted no puede suministrar cadenas de despliegue o tpicos de ayuda para enumeraciones. Para mayor informacin: Enumeraciones son introducidas en Usando Enumeraciones para trabajar con juegos de constantes en Ms acerca de programacin.

215

Movindose entre procedimientos Puede usar el object browser para moverse con rapidez hacia el cdigo de una clase, un mdulo o procedimiento en su proyecto. Para moverse hacia una clase, mdulo, o procedimiento: 1. (Opcional) Seleccione su proyecto de la caja Project / Library. Este paso 1 es opcional si tiene seleccionado <All Libraries> en la caja Project / Library, en vista de que aqu estn incluidos todos sus proyectos. 2. Los nombres de clases, mdulos y miembros que pertenecen a sus proyectos se muestran en bold. De doble clic a cualquier nombre mostrado en bold para moverse hacia esa clase, mdulo, o miembro. (O de doble clic sobre un nombre, lo cual har aparecer una ventana contextual, de donde seleccionar View Definition. El elemento seleccionado es desplegado en la ventana Cdigo. Desplegando objetos de otras aplicaciones Dentro de Visual Basic puede acceder y controlar objetos suministrados por otras aplicaciones. Por ejemplo, si tiene Microsoft Project y Microsoft Excel en su sistema, puede usar el objeto Graph de Microsoft Excel y el objeto Calendar de Microsoft Project como parte de su aplicacin. Puede usar el object browser para explorar los tipos de libreras de otras aplicaciones. Un tipo de librera proporciona informacin acerca de los objetos proporcionados por otras aplicaciones. Nota: En la lista Project / Library, existen entradas separadas para Visual Basic (VB) y Visual Basic para Aplicaciones (VBA). Aunque nosotros decimos objetos proporcionados por Visual Basic, Usted notar que el objeto Collection es proporcionado por VBA. Usted puede agregar libreras a su proyecto seleccionando References del men contextual del object browser, para abrir la caja de dilogo References. Para mayores detalles sobre el uso de Automation para combinar y manipular objetos de otras aplicaciones vea Programando con componentes. Creando sus propias clases Si Usted es un programador con experiencia, ya tiene una librera de funciones tiles que ha escrito a travs de los aos. Los objetos no sustituyen funciones Usted todava escribir y usar funciones utilitarias pero ellas proporcionan un medio conveniente y lgico para organizar procedimientos y datos. En particular, las clases a partir de las cuales Usted crea objetos combinan datos y procedimientos dentro de una unidad. Los siguientes tpicos explican cmo esto incrementa el vigor de su cdigo, y cmo esto conduce hacia nuevos caminos de programacin. Clases: poniendo juntos tipos definidos por el usuario y procedimientos Las clases son tipos definidos por el usuario con una actitud. La encapsulacin pone cdigo y datos en el mismo mdulo, dando nacimiento objetos que pueden proteger y validar sus propios datos. Personalizando clases de formularios Por aos ha estado creando clases cada vez que disea un formulario. Esta es una interesante consecuencia del diseo de formularios. Mdulos de clase paso a paso Una pequea introduccin a mdulos de clase, incluyendo creacin de clases, creacin de objetos de clases, y las reglas del tiempo de vida de los objetos. Rastreo de mdulos de clases Describe el Break en la opcin de captura de errores en el mdulo de clases, ms la presin de teclas ALT+F8 y ALT+F5 para ir paso a paso o correr errores pasados. Ciclo de vida de los formularios Visual Basic El tiempo de vida de los formularios y de los controles que ellos contienen siguen reglas un poco diferentes de aquellas que gobiernan otros objetos. Mdulos de clases versus mdulos estndar Existen diferencias significativas entre los mdulos de clases y los mdulos estndar. Entender esto le ayudar a escribir mejor cdigo para sus objetos. Clases:

216

Poniendo tipos definidos por el usuario y procedimientos Los tipos definidos por el usuario (user-defined types) son una herramienta poderosa en el agrupamiento de elementos de datos relacionados. Considere, por ejemplo, el tipo definido por el usuario llamado udtAccount definido aqu: Public Type udtAccount Number As Long Type As Byte CustomerName As String Balance As Double End Type Usted puede declarar una variable de tipo utdAccount, establecer los valores de sus campos en forma individual, y despus pasar todo el registro a procedimientos para que lo impriman, lo salve a una base de datos, efectuar clculos, validar campos, y dems. A pesar de lo poderosos que son, los tipos definidos por el usuario presentan al programador algunos problemas. Puede crear el procedimiento Sobregiro que emite un error cuando una cuenta tiene sobregiro, pero no existe nada que pueda prevenir que el campo Balance no pueda ser reducido por otro cdigo en su programa. En otras palabras, la conexin entre procedimientos y tipos definidos por el usuario dependen de la disciplina, memoria y conocimientos del programador en el mantenimiento del cdigo. Objetos: tipos definidos por el usuario con una actitud La programacin orientada a objetos soluciona este problema combinando datos y procedimientos en una sola entidad. Cuando el tipo definido por el usuario udtAccount se convierte en la clase Account, sus datos se vuelven privados, y los procedimientos que los acceden se mueven dentro de la clase y se convierten en propiedades y mtodos. Esto es lo que significa el trmino encapsulacin es decir, un objeto es una unidad (una cpsula, si lo prefiere) conteniendo tanto cdigo como datos. Cuando crea un objeto Account de una clase, la nica forma de acceder a sus datos es a travs de propiedades y mtodos que estructuran su interfase. El siguiente fragmento de cdigo muestra cmo los procedimientos dentro de la clase Account soportan encapsulacin: la cuenta de balance esta escondida para cdigo externo. Private mdblBalance As Double la propiedad de solo lectura del balance permite al cdigo externo encontrar la cuenta de balance. Public Property Get Balance ( ) As Double Balance = mdblBalance End Property el mtodo retiro cambia el saldo de la cuenta, pero solo que no exista sobregiro. Public Sub Withdrawal (ByVal Amount As Double) If Amount > Balance Then Err.Raise Number:=vbObjectError + 2081, Description:=Sobregiro End If MdblBalance=mdblBalance Amount End Sub Por el momento, no se preocupe acerca de cmo Usted obtiene los procedimientos dentro de la clase, o acerca de entender la sintaxis de procedimientos de propiedad y variables privadas. Lo importante es recordar que Usted puede definir un objeto que encapsula y valida sus propios datos. Con el objeto Account, nunca tiene que preocuparse acerca de que si llam los procedimientos correctos para actualizar la cuenta, en vista de que los nicos procedimientos que puede Usted llamar estn construidos dentro del objeto.

217

Para mayor informacin vea personalizando formularios de clases que pone la creacin de propiedades y mtodos dentro de una estructura que le es familiar. Ms adelante, Agregando propiedades y mtodos a una clase le explicarn la sintaxis. Puede leer acerca de tipos definidos por el usuario en Creacin de sus propios tipos de datos en Ms acerca de programacin. Para detalles sobre procedimientos Sub y Funciones vea Introduccin a procedimientos en Fundamentos de programacin. Personalizando formularios de clases Le sorprender saber que Usted ha estado creando clases mientras ha estado programando en Visual Basic. Esto es verdad: Form1, ese vecino familiar de cada proyecto con el que Usted siempre ha iniciado, es realmente una clase. Para ver esto, abra un nuevo proyecto Standard Exe. Agregue un botn de comando a Form1, y site el siguiente cdigo en su evento Click: Private Sub Command1.Click ( ) Dim f As New Form1 f.Show End Sub Pulse F5 para correr el proyecto, y de click al botn. Santo Cielo, ah hay otra instancia de Form1! De click de nuevo al botn. Ah hay otra! Cada instancia que Usted crea se mira igual, y tiene el mismo comportamiento, porque todas ellas son instancias de la clase Form1. Qu est pasando aqu? Si ya ley Trabajando con objetos en Fundamentos de programacin ya sabe que una variable objeto declarada As New contiene nada hasta la primera vez que Usted la refiere en cdigo. Cuando usa la variable por vez primera, Visual Basic nota que esta contiene el valor especial nada y crea una instancia de la clase. (Y hace bien, pues si no f.Show emitir error). Yo y mi variable global escondida Usted se estar preguntando como es que puede referirse a Form1 en cdigo, como si fuese una variable objeto. No existe magia. Visual Basic crea una variable objeto global escondida por cada clase de formulario. Es como si Visual Basic le hubiese agregado la siguiente declaracin a su proyecto: Public Form1 As New Form1 Cuando selecciona Form1 como su objeto startup, o teclea Form1.Show en cdigo, Usted se est refiriendo a esta variable objeto global escondida. En vista de que es declarada As New, una instancia de la clase Form1 es creada la primer vez que Usted usa esta variable pre declarada en cdigo. La razn por la cual esta declaracin es escondida es que Visual Basic la cambia cada vez que Usted cambia la propiedad Name de un formulario. De esta forma, la variable escondida siempre tiene el mismo nombre que la clase del formulario. Un pequeo y rpido examen Cules de las instancias de Form1 que cre en el ejercicio anterior est asociada con la variable global escondida? Si ha pensado que la primera, Usted ha acertado. Form1 es el objeto startup por defecto para el proyecto, y para Visual Basic es justamente como si estuviese usando la variable global pre declarada Form1 en cdigo. Tip: Despus que descarga un formulario, Usted debe siempre establecer cualquier referencia al formulario a Nothing con el objetivo de liberar la memoria y recursos que el formulario ha estado usando. La referencia ms a menudo ignorada es la variable de formulario global escondida. Y qu hacer con todas esas otras instancias de Form1?

218

En Fundamentos de programacin Usted aprendi que para referirse a un objeto, Usted necesita una variable objeto, y que un objeto existe solamente mientras exista al menos una variable objeto conteniendo una referencia a l. Qu mantiene vivas todas esas otras instancias? La segunda instancia de Form1, y todas las dems que le siguieron, tienen una variable objeto justamente por el tiempo que les toma llamar su mtodo Show. Despus esa variable se va fuera de alcance, y es puesta en Nothing. Pero Visual Basic mantiene una coleccin especial llamada Forms, sobre la cual puede leer en Ms acerca de formularios en Creacin de la interfase del usuario. La coleccin Forms contiene una referencia de cada uno de los formularios cargados en su proyecto, de forma que siempre puede encontrarlas y controlarlas. Nota: Como aprender, esto no es cierto para todas las clases. Por ejemplo, las clases que Usted disea no tienen variables globales escondidas o colecciones globales para mantener la pista de ellas aquellas son caractersticas especiales de las clases de formularios. Sin embargo, Usted puede declarar sus propias variables globales, y Usted puede crear sus propias colecciones como se describe en Creando sus propias clases de colecciones. Propiedades, mtodos y eventos de clases de formularios La primer vez que agrega una propiedad a una clase del formulario, Usted probablemente lo hace visualmente, depositando un botn de comando (u otro control) sobre Form1. Al hacer esto, Usted agrega una propiedad Command1 de solo lectura a la clase del formulario. Ms adelante, Usted invoca esta propiedad de Form1 siempre que necesite llamar un mtodo o propiedad del botn de comando: Command1.Caption = Dame clic Cuando cambia la propiedad Name de un control en un formulario, Visual Basic calladamente cambia el nombre de la propiedad de solo lectura, de forma que ellas siempre coinciden. Si Usted todava tiene abierto el proyecto del pasado ejercicio, Usted puede ver esta propiedad del Command1 presionando F2 del object browser. En la caja Project / Library, seleccione Project1. Ver Form1 en la ventana de clases. En el ventana de miembros navegue hasta encontrar Command1 y seleccinele. Command1 tiene el smbolo de las propiedades a su lado, y si Usted mira en la ventana de descripcin, ver que esta es la propiedad WithEvents. Tal como aprendi Usted en Agregando eventos a una clase esto significa que la propiedad (o variable objeto) tiene procedimientos de eventos asociados a s. Uno de estos procedimientos de evento, Command1_Click ( ), podr ser el primer lugar que Usted siempre escribir cdigo Visual Basic. Pero espere, existe ms Depositar controles en un formulario no es la nica forma de agregar nuevos miembros a una clase del formulario. Usted puede agregar sus propias y personales propiedades, mtodos y eventos, tan fcilmente como crea nuevas variables en procedimientos. Para ver esto, agregue el siguiente cdigo a la seccin de declaraciones de Form1: la propiedad Comment de la clase de Form1. Public Comment As String Agregue el siguiente cdigo al evento Click de Form1: Private Sub Form_Click ( ) MsgBox Comment, , My comment is: End Sub Finalmente, cambie el cdigo en el procedimiento de evento Command1_Click ( ) agregando una lnea, como sigue: Private Sub Command1.Click ( ) Dim f As New Form1 f.Comment = InputBox (Whats my comment?) f.Show End Sub

219

Presione F5 para correr el proyecto. De Click en Command1, y cuando aparezca la caja de entrada, teclee cierto mensaje ingenioso y de click en OK. Cuando la instancia de Form1 aparezca, de click sobre ella para repetir su propiedad Comment. De click en la primer instancia de Form1, y ver que la propiedad Comment est en blanco. Esto se debe porque Visual Basic cre esta instancia como objeto startup, de forma que Usted nunca tiene oportunidad para establecer su propiedad Comment. Los formularios pueden llamar a los mtodos entre s Si Usted ha observado de cerca, habr notado que el cdigo que agreg a la clase Form1 no estableci la propiedad Comment propia del objeto este establece la propiedad Comment de la nueva instancia de Form1 que est creando. Esta habilidad de los formularios para establecer las propiedades entre ellos y llamarse los eventos entre ellos, es una tcnica muy til. Por ejemplo, cuando un formulario MDI est abriendo una nueva ventana child, puede inicializar la nueva ventana estableciendo sus propiedades y llamando a sus mtodos. Puede usar esta tcnica para pasar informacin entre formularios. Tip: Para crear eventos personales para formularios puede ver Agregando eventos a un formulario ms adelante en este captulo, en donde se proporciona este procedimiento paso a paso. Otros tipos de mdulos Usted agrega propiedades, mtodos y eventos a clases de formulario poniendo cdigo en sus mdulos de cdigo. De la misma forma, puede agregar propiedades, mtodos y eventos a los mdulos de clase, y a los mdulos de cdigo de UserControl y UserDocument. Como ley en Agregando propiedades y mtodos a una clase y Agregando eventos a una clase, recuerde que todo lo que lee se aplica tanto a clases de formularios como a clases de mdulos. Qu diablos es mdulo de clase? Mdulos de clase, paso a paso, muestra cmo definir una clase e ilustra el ciclo de vida de los objetos que Usted haya creado a partir de esa clase. Mdulos de clase paso a paso Este ejemplo muestra como puede Usted usar los mdulos de clase para definir clases, a partir de las cuales puede despus crear objetos. Tambin le mostrar a Usted como crear propiedades y mtodos para la nueva clase, y demuestra como los objetos son creados y destruidos. Abra un nuevo proyecto Standard Exe e inserte un mdulo de clase seleccionando Add Class Module a partir del men Project. Dibuje cuatro botones de comando sobre el formulario. La siguiente tabla describe los valores de las propiedades que necesita establecer para los objetos en este ejemplo. Objeto Propiedad Valor Class module Name Thing Command1 Caption Show the Thing Command2 Caption Reverse the Things Name Command3 Caption Create new Thing Command4 Caption Temporary Thing Nota: Los mdulos de clases son salvados en archivos con extensin .cls. En la seccin de declaraciones del mdulo de clase, agregue lo siguiente: Option Explicit Public Name As String Private mdtmCreated As Date La variable Name ser una propiedad del objeto Thing, en vista de que es declarada pblica.

220

Nota: No confunda esta propiedad Name con la propiedad Name del mdulo de clase, que la tabla de arriba le instruy a establecer. (La propiedad Name del mdulo de clase le otorga a la clase Thing su nombre). Por qu Usted tiene que darle a la clase Thing una propiedad Name? Una mejor pregunta sera, Por qu no? Usted podra desear darle a la clase Thing una propiedad Name porque Things deben tener nombres! Recuerde que no existe nada especial acerca de los nombres y propiedades y mtodos que usa Visual Basic. Usted puede usar estos mismos nombres de propiedades y mtodos para sus clases. La variable mdtmCreated es un miembro de dato privado que es usado para almacenar el valor de la propiedad Created de solo lectura. La propiedad Created retorna la fecha y hora en que el objeto Thing ha sido creado. Para implementar la propiedad Created, agregue el siguiente Property Get a la seccin de declaraciones del mdulo de clase: Property Get Created ( ) As Date Created = mdtmCreated End Property Nota: Si Usted agreg el procedimiento Property usando la caja de dilogo Add Procedure, a partir del men Tools, asegrese de borrar la declaracin Property Let que es agregada automticamente por este dilogo. Property Let es solamente requerida por propiedades de lectura escritura, como se explica en Poniendo los procedimientos de propiedad a trabajar por Usted. El objeto Thing tiene un mtodo, ReverseName, el cual simplemente cambia el orden de las letras de la propiedad Name. No retorna un valor, de forma que es implementado como un procedimiento Sub. Agregue el siguiente procedimiento Sub al mdulo de clase: Public Sub ReverseName ( ) Dim intCt As Integer Dim strNew As String For intCt = 1 to len (Name) StrNew = mid$(Name,intCt,1) & strNew Next Name = strNew End Sub Los mdulos de clase tienen dos eventos, Initialize y Terminate. En la ventana Object, del mdulo de clase, seleccione Class. El procedimiento le mostrara los eventos. Site el siguiente cdigo en los procedimientos de evento: Private Sub Class_Initilize ( ) establece la fecha / hora de creacin del objeto, que ser retornada por la propiedad Created de solo lectura mdtmCreated = Now desplegar las propiedades del objeto: MsgBox Name: & Name & vbCrLf & Created: _ & Created,, Thing Initialize End Sub Private Sub Class_Terminate ( ) desplegar propiedades del objeto: MsgBox Name: & Name & vbCrLf & Created: _ & Created,, Thing Terminate End Sub Usualmente, el procedimiento de evento Initialize contiene todo cdigo que necesite ser ejecutado en el momento en que el objeto es creado, tal como proporcionando la fecha y hora para la propiedad Created. El evento Terminate contiene todo cdigo que necesite ser ejecutado con el objeto de limpiar despus el objeto cuando este sea destruido. En este ejemplo, los dos eventos son usados principalmente para darle a Usted una indicacin visual que el objeto Thing est siendo creado o destruido.

221

Usando el objeto Thing Agregue esta declaracin en la seccin de declaraciones del mdulo de formulario: Option Explicit Private mth As Thing La variable mth sostendr una referencia para el objeto Thing, que ser creada en el evento Load del formulario. Ponga el siguiente cdigo en el procedimiento de evento Form_Load, y en los procedimientos de eventos Click de los cuatro botones de comando: Private Sub Form_Load ( ) Set mth = New Thing Mth.Name = InputBox (Enter a name for the Thing) End Sub botn Show The Thing Private Sub Command1_Click ( ) MsgBox Name: & mth.Name & vbCrLf _ & Created: & mth.Created,, Form Thing End Sub botn Reverse the Things Name Private Sub Command2_Click ( ) Mth.ReverseName clic Show the Thing Command1.Value = True End Sub botn Create New Thing Private Sub Command3_Click ( ) Set mth = New Thing Mth.Name = InputBox (Enter a name for the new Thing) End Sub Botn Temporary Thing Private Sub Command4_Click ( ) Dim thTemp As New Thing ThTemp.Name = InputBox (Enter a Name for the Temporary Thing) End Sub Ejecutando el proyecto Pulse F5 para ejecutar el proyecto. Viendo al cdigo en el procedimiento de evento Form_Load, Usted podr ver que el operador New es usado para crear el objeto Thing. Una referencia a este objeto Thing es asignada a la variable mth. Usted mirar al InputBox requirindole a Usted por un nombre para Thing. Cuando Usted teclea un nombre y pulsa Enter, el valor retornado es asignado a la propiedad Name del objeto Thing. Mostrando el formulario Thing Usted podr verificar que la propiedad Name ha sido asignada presionando el primer botn, Show the Thing, que despliega una caja de mensaje con todas las propiedades del objeto Thing. Poner al revs el nombre de Thing Presione el segundo botn, Reverse the Things Name. Este botn llama al mtodo ReverseName para tornar al revs el nombre del objeto Thing, y despus de click al primer botn para desplegar los valores de la propiedad actualizada. Crear nuevo Thing Dar click al botn Create New Thing para destruir el objeto Thing y crear uno nuevo. (O, en el momento que se ejecuta, crear un nuevo Thing y despus destruir el viejoThing).

222

El operador New causa que el nuevo Thing sea creado, de forma que ver que el MsgBox es desplegado por el evento Initialize del nuevo Thing. Cuando da click a OK, una referencia al nuevo Thing es situada en la variable a nivel de formulario mth. Esto borra la referencia para el viejo Thing. En vista de que no existen ms referencias para l, es destruido, y Usted ver su caja de mensaje de evento Terminate. Cuando Usted da click en OK, la declaracin InputBox requiere un nombre para el nuevo Thing. Nota: Si Usted desea destruir el viejo Thing antes de crear uno nuevo, Usted puede agregar la lnea Set mth = Nothing al comienzo del procedimiento de evento. Thing Temporal El cuarto botn demuestra otro aspecto del tiempo de vida del objeto. Cuando Usted lo presiona, se le requerir a Usted que d un nombre para el Thing temporal. Pero espere ah no existe Thing temporal an. Usted no ha visto su caja de mensaje Initialize. Cmo puede asignarle un nombre? En vista de que la variable thTemp ha sido declarada como As New, un objeto Thing ser creado en el momento en que sea invocada una de sus propiedades o mtodos. Esto suceder cuando el valor de retorno del InputBox sea asignado a la propiedad Name. Teclee un nombre y d click al botn OK del InputBox. Usted ahora mirar la caja de mensaje Initialize Thing, la cual le muestra a Usted que la propiedad Name todava est en blanco. Cuando da click a OK para desaparecer la caja de mensaje, el valor de la declaracin InputBox es finalmente asignado a la propiedad Name. Esto es un montn de actividad para una sola lnea de cdigo. Desde luego, tan pronto como haya hecho esto, el procedimiento de evento Click finaliza, y la variable thTemp se va fuera de alcance. La referencia objeto para el Thing temporal es liberada, de forma que Usted ver la caja de mensaje Terminate del Thing. Note que esta contiene el nombre que Usted haya suministrado. Cada vez que Usted de click a este botn, otro Thing temporal ser creado, nombrado, y destruido. Cerrando el programa Cierre el programa dndole click al botn cerrar del formulario. No use el botn End sobre la barra de herramientas. Cuando el programa se cierra, Form1 es destruido. La variable mth se va fuera de alcance, y Visual Basic borra la referencia a Thing. No quedan ningn resto de referencias a Thing, por tanto Thing es destruido, y la caja de mensaje del evento Terminate es desplegada. Corra de nuevo el programa, y esta vez finalcelo usando el botn End de la barra de herramientas. Observe que la caja de mensaje Terminate del objeto Thing no es desplegada. Es importante recordar que finalizando su programa con el botn End, o con la declaracin End en su cdigo, detiene el programa inmediatamente, sin ejecutar los eventos Terminate de ningn objeto. Siempre es mejor finalizar los programas descargando todos los formularios. Usted encontrar til correr el ejemplo presionando F8 para ejecutar el cdigo lnea por lnea. Esta es una buena forma para entender el orden de los eventos de creacin y destruccin. Importante: En una aplicacin real, los eventos Initialize y Terminate no contienen cajas de mensaje, o cualquier otro cdigo que permita que los mensajes Windows sean procesados. En general, es mejor usar las declaraciones Debug.Print para rastrear el tiempo de vida de los objetos. Para mayor informacin: Los formularios y controles son un poco diferentes de otros objetos, como se describe en Ciclo de vida de formularios Visual Basic.

223

Puede leer ms acerca de lo que puede hacer con clases y mdulos de clases en Agregndole propiedades y mtodos a una clase y Agregando eventos a una clase. Traduccin: Derechos de Autor: RBsoftware (2001) Lunes, 7 de mayo 2001. 11:09pm. Archivo: Traduccin VB28. Rastreando mdulos de clase El rastreo de los mdulos de clase difiere un poco del rastreo de ordinarios programas. Esto es porque un error en una propiedad o mtodo de un mdulo de clase siempre acta como un manipulador de errores. (Es decir, siempre existe un procedimiento en la pila de llamada que puede manipular el error nombrando al procedimiento que llam al mtodo o a la propiedad del mdulo de clase). Visual Basic compensa esta diferencia proporcionando la opcin atrapa errores Break en los mdulos de clase, adems de las viejas opciones Break on Unhandled Errors y Break on All Errors. Nota: Usted puede establecer la opcin Default Error Trapping State en la pestaa General de la caja de dilogo Options, disponible a partir del men Tools. La opcin que selecciona afecta la sesin actual, y se convierte en valor por defecto para las subsiguientes instancias de Visual Basic. Para cambiar los valores solo para la sesin actual, sin afectar al valor por defecto, seleccione Toggle de la ventana Code del men contextual (que est disponible si se da click al botn derecho sobre la ventana Code). Por ejemplo, supngase que el mdulo de clase Class1 contiene el siguiente cdigo: Public Sub Oops ( ) Dim intOops As Integer IntOops = intOops / 0 End Sub Ahora suponga que un procedimiento en otro mdulo de clase, formulario, o mdulo estndar llama al miembro Oops: Private Sub Command1_Click ( ) Dim c1 As New Class1 cl.Oops End Sub Si la opcin atrapa error es establecida en Break on Unhandled Errors, la ejecucin no se detiene en la divisin entre cero. Al contrario, el error ser activado en el procedimiento de llamada, Command1_Click. La ejecucin se detendr sobre la llamada del mtodo Oops. Usted podra usar la opcin Break on All Errors para detenerse en la divisin entre cero, pero Break on All Errors es una opcin muy inconveniente para la mayora de los propsitos. Se detiene en cada error, an en errores a los cuales haya escrito rutinas para manejo de errores. La opcin Break in Class Module es un valor que transige: La ejecucin no se detiene en el cdigo del mdulo de clase para el cual Usted haya escrito un manipulador de error. La ejecucin solamente se detiene en un error que no es manipulado por el mdulo de clase, y por tanto debe ser retornado al llamador del mtodo. Cuando da inicio el ambiente de desarrollo de Visual Basic, su opcin por defecto es Break in Class Module. Si no existen mdulos de clases involucrados, Break in Class Module es exactamente la misma opcin que la opcin Break on Unhandled Errors.

224

Tip: Cuando Usted golpea un punto de ruptura usando el Break in Class Module o Break on All Errors, puede ignorar el error dentro de su cdigo manipulador de error o dentro del cdigo que llam al procedimiento en que el error haya ocurrido presionando ALT+F8 o ALT+F5. Para mayor informacin: Rastreo es descrito en detalle en Rastreando su cdigo y manipulando errores. Ciclo de vida de formularios Visual Basic En vista de que ellos son visibles al usuario, los formularios y controles tienen diferentes ciclos de vida que los dems objetos. Por ejemplo, un formulario no se cierra porque Usted haya liberado todas las referencias a l. Visual Basic mantiene una coleccin global de todos los formularios en su proyecto, y solamente remueve un formulario de esa coleccin cuando Usted descarga el formulario. De forma similar, Visual Basic mantiene una coleccin de controles en cada formulario. Usted puede cargar y descargar controles de arreglos de controles, pero simplemente liberando todas sus referencias no es suficiente para destruirlos. Para mayor informacin: Las colecciones Forms y Controls son descritas en detalle en Colecciones en Visual Basic en pasados tpicos. Estados por los que atraviesa un formulario Visual Basic Un formulario Visual Basic normalmente atraviesa cuatro estado en su vida: 1. Creado, pero no cargado. 2. Cargado, pero no desplegado. 3. Desplegado. 4. Memoria y recursos completamente reclamados. Existe un quinto estado en que puede estar un formulario bajo determinadas circunstancias: Descargado y no referenciado mientras un control todava es referenciado. Este tpico describe estos estados, y las transiciones entre ellos. Creado pero no cargado El inicio de este estado es marcado por el evento Initialize. El cdigo que Usted sita en el procedimiento de evento Form_Initialize es por lo tanto el primer cdigo que es ejecutado cuando un formulario es creado. En este estado, el formulario existe como un objeto, pero este no tiene ventana. Ninguno de sus controles existe an. Un formulario siempre pasa por este estado, aunque su estada ah pueda ser breve. Por ejemplo, si Usted ejecuta Form1.Show, el formulario ser creado, y Form_Initialize ser ejecutado; tan pronto como Form_Initialize es completado, el formulario ser cargado, el cual es el siguiente estado. La misma cosa sucede si Usted especifica un formulario como su objeto startup, en la pestaa General de la caja de dilogo Project Properties (la cual es accesible a travs del men Project). Un formulario especificado como el objeto startup es creado tan pronto como el proyecto se inicia, y es inmediatamente cargado y desplegado. Nota: Usted puede provocar que su formulario sea cargado dentro de Form_Initialize, llamando su mtodo Show o invocando sus propiedades y mtodos intrnsecos como se muestra ms adelante. Permanece creado, pero no cargado Por contraste, el siguiente cdigo crea una instancia de Form1 sin avanzar el formulario al estado de carga: Dim frm As Form1 Set frm = New Form1 Una vez que Form_Initialize ha concluido, los nicos procedimientos que Usted puede ejecutar sin forzar que el formulario sea cargado son Sub, Function, y procedimientos Property que Usted haya agregado en la ventana de cdigo del formulario. Por ejemplo, podra agregar el siguiente mtodo a Form1:

225

Public Sub AnewMethod ( ) Debug.Print Executing AnewMethod End Sub Puede ejecutar este mtodo usando la variable frm (es decir, frm.AnewMethod) sin forzar al formulario a que pase al siguiente estado. De forma similar, puede llamar AnewMethod con el objetivo de crear un formulario: Dim frm As New Form1 Frm.AnewMethod Nota: Ejecutando Form1.AnewMethod, sin declarar una variable de formulario, tiene el mismo efecto que el ejemplo anterior. Como se explic en Personalizando clases de formulario, Visual Basic crea una variable global escondida por cada clase de formulario. Esta variable tiene el mismo nombre que la clase; es como si Visual Basic haya agregado automticamente esta instruccin Public Form1 As New Form1. Usted puede ejecutar tantas propiedades y mtodos personales como lo desee, sin forzar al formulario a que sea cargado. Sin embargo, en el momento que Usted accede a una de las propiedades intrnsecas del formulario, o a cualquier control en el formulario, el formulario entra al siguiente estado. Nota: Usted encontrar til pensar que un formulario tiene dos partes, la parte de cdigo y la parte visual. Antes que el formulario sea cargado, solamente la parte de cdigo est en memoria. Usted puede llamar tantos procedimientos como lo desee en la parte de cdigo sin cargar la parte visual del formulario. El nico estado que todos los formularios atraviesan Creado, pero no cargado, es el nico estado que pasas todos los formularios. Si la variable frm del ejemplo anterior es puesta en Nothing, como se muestra aqu, el formulario ser destruido antes de transitar al siguiente estado: Dim frm As New Form1 Frm.AnewMethod Set frm = Nothing el formulario es destruido. Un formulario usado de esta manera no es mejor que un mdulo de clase, de manera que la vasta mayora de los formularios transitan al siguiente estado. Cargado pero no desplegado El evento que marca el inicio de este estado es el familiar evento Load. El cdigo que Usted sita en el procedimiento de evento Form_Load es ejecutado tan pronto como el formulario entra al estado de carga. Cuando el procedimiento Form_Load se inicia, todos los controles en el formulario han sido creados y cargados, y el formulario tiene una ventana completa con el manipulador window (hWnd) y el contexto de dispositivo (hDC) aunque esa ventana no sea an desplegada. Cualquier formulario que se hace visible primero debe ser cargado. Muchos formularios pasan automticamente del estado Creado, pero no cargado, al estado Cargado, pero no desplegado. Un formulario ser desplegado automticamente si: El formulario ha sido especificado como el objeto startup, en la pestaa General, de la caja de dilogo Project Properties. El mtodo Show es la primer propiedad o mtodo del formulario a ser invocado, como por ejemplo, Form1.Show. La primer propiedad o mtodo del formulario a ser invocado es uno de los miembros intrnsecos del formulario, como por ejemplo el mtodo Move. Nota: Este caso incluye cualquier control sobre el formulario, porque cada control define una propiedad del formulario; es decir, con el objetivo de acceder a la propiedad Caption de Command1, Usted debe ir a travs de la propiedad Command1 del formulario: Command1.Caption. La declaracin Load es usada para cargar el formulario, sin necesidad de usar primero New o As New para crear el formulario, como se describi antes.

226

Formularios que nunca son desplegados En los primeros dos casos descritos antes, el formulario permanecer en su estado visible, tan pronto como se complete el Form_Load. En los dos ltimos casos, el formulario permanecer cargado, pero no ser visible. Desde hace mucho tiempo ha sido una prctica de codificacin comn en Visual Basic cargar un formulario pero nunca mostrarlo. Esto podra ser hecho por varias razones: Usar el control Timer para generar eventos de tiempo. Usar los controles por su funcin, y no por su interfase de usuario por ejemplo, para comunicaciones seriales o para acceder al sistema de archivos. Para ejecutar transacciones DDE. Nota: Puede crear componentes ActiveX quienes a menudo son mejores en proporcionar funcionalidad de solo cdigo que los controles. Vea Creando componentes ActiveX en Gua de herramientas de componentes. Siempre regresando a casa Los formularios regresan del estado visible al estado cargado siempre que ellos sean escondidos. Sin embargo, retornar al estado cargado no re ejecuta el evento Load. El evento Form_Load es ejecutado solamente una vez en la vida del formulario. Despliegue Una vez que el formulario se vuelve visible, el usuario puede interactuar con l. De ah en adelante el formulario puede ser escondido y desplegado tantas veces como lo desee antes de ser finalmente descargado. Interludio: preparando para descargar Un formulario puede estar, o escondido, o visible, cuando es descargado. Si no est explcitamente escondido, permanece visible hasta ser descargado. El ltimo evento que el formulario adquiere antes de ser descargado es el evento Unload. Sin embargo, antes que este evento ocurra Usted se comunica con un evento muy importante llamado QueryUnload. QueryUnload es su oportunidad de detener la descarga del formulario. Si existen datos que el usuario deseara salvar, este es el tiempo de requerir al usuario para que los salve o que descargue los cambios. Importante: Estableciendo el argumento Cancel del QueryUnload a True detendr la descarga del formulario, negando una declaracin Unload. Una de las caractersticas ms poderosas de este evento es que le dice a Usted cmo el descargue inminente fue causado: por el usuario dndole click al botn Close; por su programa ejecutando la declaracin Unload; por la aplicacin ejecutando el cierre; o por Windows ejecutando el cierre. De esta suerte, QueryUnload le permite a Usted ofrecer al usuario una oportunidad para cancelar cerrando el formulario, y a su vez todava dejando que Usted cierre el formulario a travs de cdigo cuando lo necesite. Importante: Bajo ciertas circunstancias, un formulario no recibir el evento QueryUnload: Si usa la declaracin End para terminar su programa, o si da clic al botn End (o selecciona End del men Run) en el ambiente de desarrollo. Para mayor informacin vea QueryUnload Event en Language Reference en Books Online. Regresando al estado creado, pero no al estado cargado Cuando el formulario es descargado, Visual Basic lo remueve de la coleccin Forms. A menos que Usted mantenga alrededor una variable con una referencia al formulario, el formulario ser destruido, y su memoria y recursos ser reclamados por Visual Basic. Si guarda una referencia al formulario en una variable en algn lado, tal como la variable global escondida descrita en Personalizando clases del formulario, entonces el formulario regresa al estado Created, But Not Loaded. El formulario no tendr una ventana, y sus controles no existirn.

227

El objeto todava est manteniendo sus recursos y memoria. Todos los datos en las variables a nivel de mdulo en la parte de cdigo del formulario estn ah todava. (Sin embargo, las variables Static en los procedimientos de evento, se habrn ido). Usted puede usar esa referencia que ha estado manteniendo para llamar los mtodos y propiedades que Usted ha agregado al formulario, pero si invoca a los miembros intrnsecos del formulario, o accede a sus controles, el formulario ser cargado de nuevo, y Form_Load ser ejecutado. Recursos y memoria completamente reclamados La nica forma de liberar toda la memoria y recursos es descargar el formulario y despus poner todas las referencias a Nothing. La referencia ms comnmente ignorada cuando se hace esto es la variable global escondida antes mencionada. Si en cualquier momento se ha referido al formulario por su nombre de clase (como se muestra en la ventana de propiedades por la propiedad Name), Usted ha usado la variable global escondida. Para liberar la memoria del formulario, Usted debe poner esta variable en Nothing. Por ejemplo: Set Form1 = Nothing Su formulario recibir su evento Terminate justamente antes de ser destruido. Tip: Muchos programadores profesionales evitan el uso de la variable global escondida, prefiriendo declarar sus propias variables de formulario (por ejemplo, Dim dlgAbout As New frmAboutBox) para manejar el tiempo de vida del formulario. Nota: Ejecutando la declaracin End descarga todos los formularios y pone todas las variables objeto en su programa a Nothing. Sin embargo, esta es una forma muy abrupta para terminar su programa. Ninguno de sus formularios obtendrn sus eventos QueryUnload, Unload o Terminate, y los objetos que Usted haya creado no obtendrn sus eventos Terminate. Descargado y no referenciado, pero un control todava est referenciado Para entrar a este peculiar estado, Usted tiene que descargar y liberar el formulario mientras mantiene una referencia a uno de sus controles. Si a Usted le parece que esta es una cosa tonta a hacer, somos solidarios con Usted. Dim frm As New Form1 Dim obj As Object Frm.Show vbModal cuando el formulario modal es despedido, salve una referencia a uno de sus controles. Set obj = frm.Command1 Unload frm Set frm = Nothing El formulario ha sido descargado, y todas sus referencias han sido liberadas. Sin embargo, usted todava mantiene una referencia a uno de sus controles, y esto evitar que la parte del cdigo del formulario libera la memoria que est usando. Si Usted invoca cualquiera de las propiedades o mtodos de este control, el formulario ser cargado de nuevo: Obj.Caption = De vuelta a la vida Los valores de las variables a nivel de mdulo quedarn preservados, pero todos los valores de las propiedades de todos los controles regresarn a sus valores por defecto, tal y como si el formulario estuviese siendo cargado por vez primera. Form_Load se ejecutar. Nota: No todos los formularios se comportan como los formularios Visual Basic lo hacen. Por ejemplo, los formularios Microsoft proporcionados en Microsoft Office no tienen eventos Load y Unload; cuando estos formularios reciben sus eventos Initialize, todos sus controles existen y estn listos a ser usados. Para mayor informacin: Forms se describe en Diseando un formulario en Formularios, controles y mens y en Ms acerca de formularios en Creando la interfase del usuario. Mdulos de clases versus mdulos estndar

228

Las clases difieren de los mdulos estndar en la forma en que sus datos son almacenados. Nunca existe ms de una copia de los datos de un mdulo estndar. Esto significa que cuando una parte de su programa cambia una variable pblica en un mdulo estndar, y otra parte de su programa subsecuentemente lee esa variable, obtendr el mismo valor. Sin embargo, los datos en los mdulos de clase existen separadamente de cada instancia de la clase (esto es, por cada objeto creado a partir de esa clase). De igual forma, los datos en los mdulos estndar tienen alcance de programa es decir, existen mientras su programa viva mientras que los datos de los mdulos de clase por cada instancia de una clase existen solamente por el tiempo de vida del objeto; es creado cuando el objeto es creado, y destruido cuando el objeto es destruido. Finalmente, las variables declaradas pblicas en los mdulos estndar son visibles desde cualquier lado en su proyecto, mientras que las variables pblicas en los mdulos de clase pueden ser accedidas solamente si tiene una variable objeto que contenga una referencia a una instancia particular de una clase. Todo lo anterior es aplicable a los procedimientos pblicos en los mdulos estndar y en los mdulos de clase. Esto es ilustrado en el siguiente ejemplo. Puede correr este cdigo abriendo un nuevo proyecto Standard Exe y usando el men Project para agregar un mdulo estndar y un mdulo de clase. Site el cdigo siguiente en Class1: lo siguiente es una propiedad de los objetos de Class1: Public Comment As String lo siguiente es un mtodo de los objetos de Class1: Public Sub ShowComment ( ) MsgBox Comment, , gstrVisibleEveryWhere End Sub Site el siguiente cdigo en Module1: el cdigo en el mdulo estndar es global: Public gstrVisibleEveryWhere As String Public Sub CallableAnywhere (ByVal c1 As Class1) la siguiente lnea cambia una variable global (propiedad) de una instancia de Class1. Solamente el objeto particular pasado a este procedimiento es afectado: cl.Comment = Tocado por una funcin global. End Sub Ponga dos botones de comando en Form1, y agregue el siguiente cdigo a Form1: Private mc1First As Class1 Private mc1Second As Class1 Private Sub Form_Load ( ) crea dos instancias de Class1: Set mc1First = New Class1 Set mc1Second = New Class1 GstrVisibleEverywhere = Datos de cadena global End Sub Private Sub Command1_Click ( ) Call CallableAnywhere (mc1First) Mc1First.ShowComment End Sub Private Sub Command2_Click ( ) Mc1Second.ShowComment End Sub

229

Presione F5 para ejecutar el proyecto. Cuando Form1 es cargado, crea dos instancias de Class1, cada una teniendo sus propios datos. Form1 tambin establece el valor de la variable global gstrVisibleEverywhere. Presione Command1, el cual llama al procedimiento global y pasa una referencia al primer objeto Class1. El procedimiento global pone la propiedad Comment, y Command1 despus llama al mtodo ShowComment para desplegar los datos del objeto. En pantalla aparece una caja de mensaje, con el ttulo Datos de cadena global y con el mensaje Tocado por una funcin global. La caja de mensaje resultante demuestra que el procedimiento global CallableAnywhere pone la propiedad Comment del objeto que fue pasado a l, y que la cadena global es visible desde dentro de Class1. Presione Comman2, el cual simplemente llama al mtodo de la segunda instancia de Class1. En pantalla aparece una caja de mensaje, mostrando que ambos objetos tienen acceso a la variable de cadena global; pero la propiedad Comment del segundo objeto est en blanco, porque llamando al procedimiento global CallableAnywhere solamente cambia la propiedad Comment del primer objeto. Importante: Evite hacer el cdigo de sus clases dependiente de datos globales esto es, variables pblicas en mdulos estndar. Muchas instancias de una clase pueden existir de forma simultnea, y todos estos objetos comparten los datos globales en su programa. Usando variables globales en el cdigo de los mdulos de clase tambin viola la encapsulacin del concepto de programacin orientada a objetos, porque los objetos creados a partir de tales clases no contienen todos sus datos. Datos de clase estticos Puede encontrar situaciones en que desee que un elemento de dato se compartido entre todos los objetos creados a partir de un mdulo de clase. Esto algunas veces es llamado datos de clase estticos. Usted no puede implementar datos de clases estticos verdadero en un mdulo de clase de Visual Basic. Sin embargo, puede simularlo usando procedimientos de propiedad para poner y retornar el valor de un miembro de datos pblico en un mdulo estndar, como en el siguiente fragmento de cdigo: propiedad de solo lectura regresando el nombre de la aplicacin: Property Get CommonString ( ) As String la variable gstrVisibleEverywhere es guardada en un mdulo estndar, y declarada pblica. CommonString = gstrVisibleEverywhere End Property Nota: Usted no puede usar la palabra Static para variables a nivel de mdulo en un mdulo de clase. La palabra Static puede ser usada solamente entre procedimientos. Es posible simular datos de clase estticos que no son de solo lectura proporcionando un procedimiento Property Let correspondiente o Property Set para una propiedad que contiene una referencia a un objeto para asignar un nuevo valor al miembro de datos del mdulo estndar. Sin embargo, el uso de variables globales de esta forma viola el concepto de encapsulacin, y no es recomendado. Por ejemplo, la variable gstrVisibleEverywhere puede establecerse de cualquier lado en su proyecto, y an desde cdigo que no pertenece a la clase que tiene la propiedad CommonString. Esto puede conducir a sutiles errores en su programa. Para mayor informacin: Los datos globales en componentes ActiveX requieren diferente manipulacin que los programas ordinarios. Vea Mdulos Estndar Versus Mdulos de Clases en Principios Generales en el Diseo de Componentes de Creacin de Componentes ActiveX en Gua de Herramientas de Componentes.

230

Agregando propiedades y mtodos a una clase Las propiedades y mtodos de una clase forman su interfase por defecto. La interfase por defecto es el medio ms comn para manipular un objeto. En general, las propiedades representan datos acerca de un objeto, mientras que los mtodos representan acciones que un objeto puede tomar. Puesto de otra forma, las propiedades proporcionan la descripcin de un objeto, mientras que los mtodos son su comportamiento. Los siguientes tpicos describen el mecanismo para agregar propiedades y mtodos a sus clases, y publica algunos de los principios que deber cumplir. Agregando propiedades a una clase Discute dos formas de agregar propiedades a sus clases el lado fcil y el lado correcto. Procedimientos de propiedad versus variables pblicas Aunque los procedimientos de propiedad son el mejor medio para implementar la mayora de las propiedades, las variables pblicas tienen sus usos. Poniendo procedimientos de propiedad a trabajar por Usted Proporciona amplios detalles de la forma en que los procedimientos de propiedad trabajan, y describe la implementacin de los tipos de propiedad comn por ejemplo, solo lectura, lectura escritura, objeto y variant. Agregando mtodos a una clase Mtodos el comportamiento de un objeto son solamente procedimientos pblicos que Usted agrega a su mdulo de clase. Es una propiedad o un mtodo? Algunas veces no es obvio si la funcin que Usted considera ser mejor implementado como una propiedad o como un mtodo. Este tpico proporciona algunos lineamientos. Haciendo por defecto a una propiedad o a un mtodo Puede usar el dilogo Procedure Attributes para dar a su clase un miembro por defecto. Propiedades Friend y mtodos Los procedimientos Friend estn a la mitad del camino entre Pblic y Private. Al igual que Private, ellos no son miembros de una interfase de clase, pero al igual que los Public ellos son visibles a travs de todo el proyecto. Ellos pueden ser usados para pasar tipos definidos por el usuario. Nota: Los eventos no son parte de la interfase por defecto. Los eventos son interfases salientes (esto es, interfases que alcanzan y tocan otros objetos), mientras que las propiedades y mtodos pertenecen a la interfase entrante (es decir, interfases cuyos miembros son invocados por otros objetos). La interfase por defecto de un objeto Visual Basic es una interfase entrante. Importante: Los siguientes nombres no pueden ser usados como nombres de propiedad o mtodo, porque ellos pertenecen a las interfases IUnknown y IDispatch: QueryInterfase, AddRef, Release, GetTypeInfoCount, GetTypeInfo, GetDsOfNames e Invoke. Estos nombres provocarn errores de compilacin. Para mayor informacin: Los eventos son descritos en Agregando eventos a una clase ms adelante en este captulo. Agregando propiedades a una clase El medio ms fcil para definir propiedades para una clase es agregando variables pblicas al mdulo de clase. Por ejemplo, Usted puede fcilmente crear la clase Account declarando dos variables pblicas en un mdulo de clase llamado Account: Public Balance As Double Public Name As String Esto es muy fcil. Es tan fcil como crear datos privados para una clase; simplemente declare una variable Private, y esta ser accesible solamente desde cdigo dentro del mdulo de clase: Private mstrMothersMaidenName As String Private mintWithdrawalsMonthToDate As Integer Ocultando datos

231

La habilidad para proteger parte de los datos de un objeto, mientras se expone el resto como propiedades, es llamada ocultando datos. Este es un aspecto del principio orientado a objetos de encapsulacin, como fue explicado en Clases: poniendo tipos definidos por el usuario y procedimientos juntos. La ocultacin de datos significa que Usted puede hacer cambios en la implementacin de una clase por ejemplo, incrementado la variable Private de la clase Account mintWithdrawalsMonthToDate de un entero (Integer) a un largo (Long) sin afectar el cdigo existente que use el objeto Account. La ocultacin de datos tambin le permite definir propiedades que son de solo lectura. Por ejemplo, Usted podra usar un procedimiento Property Get para retornar el valor de una variable privada conteniendo el nmero de retiros en un mes, mientras solo incrementa la variable desde dentro del cdigo objeto Account. Esto nos lleva a los procedimientos de propiedad. Procedimientos de propiedad La ocultacin de datos no sera de mucho uso si la nica manera que tiene Usted para crear propiedades es declarando variables pblicas. Cuan bueno sera para Usted darle a la clase Account la propiedad Type, si cualquier cdigo que hace referencia a un objeto Account puede alegremente poner el tipo Account a ningn valor. Los procedimientos de propiedad le permiten ejecutar cdigo cuando un valor de propiedad es puesto o recuperado. Por ejemplo, podra desear implementar la propiedad Type del objeto Account con un par de procedimientos de propiedad: Public Enum AccountTypes AtSaving = 1 AtChecking AtLineOfCredit End Enum almacenamiento de datos privado para la propiedad Type: Private matType As AccountTypes Public Property Get Type ( ) As AccountTypes Type = matType End Property Public Property Let Type (ByVal NewType As AccountTypes) Select Case NewType Case atCheking, atSavings, atLineOfCredit no necesita hacer nada si NewType es vlido: Case Else Err.Raise Number: = vbObject Error + 32112, _ Description: = Invalid Account Type End Select If mbytType > NewType Then Err.Raise Number : = vbObjectError + 32113, _ Description: = No puedo degradar el tipo Account Else MbytType = NewType End If End Property Ahora suponga que tiene una variable llamada acct que contiene una referencia a un objeto Account. Cuando el cdigo x = acct.Type es ejecutado, el procedimiento Property Get es invocado para regresar el valor almacenado en el miembro de datos privados del mdulo de clase mbytType. Cuando el cdigo acct.Type = atChecking es ejecutado, la propiedad Let es invocada. Si el objeto Account es nuevo, mbytType ser cero, y ningn tipo Account vlido ser asignado. Si el tipo Account actual es atSavings, el tipo ser aumentado.

232

Sin embargo, si el tipo de cuenta actual es atLineOfCredit, la propiedad Let disparar un error, previniendo el sobregiro. De igual manera, si el cdigo acct.Type = 0 es ejecutado, la declaracin Select en el Property Let detectar el tipo de cuenta invlido y disparar un error. En resumen, los procedimientos de propiedad permiten a un objeto proteger y validar sus propios datos. Para mayor informacin: Entonces, las variables pblicas son buenas para todo? Procedimientos de propiedad versus variables pblicas resaltan el uso apropiado de ambas. Las capacidades de los procedimientos de propiedad son exploradas a mayor profundidad en Poniendo a los procedimientos de propiedad a trabajar por Usted. Procedimientos Property y variables pblicas Los procedimientos de propiedad son claramente medios poderosos para permitir la encapsulacin que Usted se debe estar preguntando si alguna vez se volver a molestar con variables pblicas. En programacin siempre la respuesta es Desde luego algunas veces. Aqu estn unas reglas bsicas: Use procedimientos de propiedad cuando: La propiedad es de solo lectura, o no puede ser cambiada una vez que haya sido establecida. La propiedad tiene un bien definido juego de valores que necesitan ser validados. Los valores fuera de ciertos rangos por ejemplo, nmeros negativos son vlidos para el tipo de datos de la propiedad, pero ocasionan errores de programa si la propiedad es permitida a asumir tales valores. Establecer la propiedad ocasiona cambio perceptible en el estado del objeto, por ejemplo, la propiedad Visible. Establecer la propiedad ocasiona cambios a otras variables internas o a los valores de otras propiedades. Use variables pblicas para propiedades de lectura escritura donde: La propiedad es un tipo de auto validacin. Por ejemplo, un error, o conversin de datos automtica ocurrir si un valor que no sea True o False es asignado a una variable Boolean. Cualquier valor en el rango soportado por el tipo de datos es vlido. Esto ser verdadero en muchas propiedades de tipo Single y Double. La propiedad es un tipo de datos de cadena, y ah no existe restriccin sobre el tamao o valor de la cadena. Nota: No implemente una propiedad como variable pblica solamente para evitar el calentamiento de una llamada de funcin. Detrs de escenas, Visual Basic implementar variables pblicas en sus mdulos de clase como un par de procedimientos de propiedad de cualquier manera, porque esto es requerido por la librera tipo. Para mayor informacin: Las capacidades de los procedimientos de propiedad son exploradas adicionalmente en Poniendo a los procedimientos de propiedad a trabajar por Usted. Poniendo los procedimientos de propiedad a trabajar por Usted Visual Basic proporciona tres tipos de procedimientos de propiedad, como se describe en la siguiente tabla: Procedimiento Propsito PropertyGet Regresa el valor de una propiedad. PropertyLet Establece el valor de una propiedad. PropertySet Establece el valor de una propiedad objeto (esto es, una propiedad que contiene una referencia a un objeto). Como puede Usted ver en la tabla, cada uno de estos procedimientos de propiedad tienen un rol particular a jugar en la definicin de una propiedad. La propiedad tpica ser hecha de un par de procedimientos de propiedad: un PropertyGet para recuperar el valor de la propiedad, y un PropertyLet o PropertySet para asignar un nuevo valor.

233

Estos roles se pueden traslapar en algunos casos. La razn de que existan dos tipos de procedimientos de propiedad para asignar un valor es que Visual Basic tiene una sintaxis especial para asignar referencias objeto a variables objeto: Dim wdg As Widget Set wdg = New Widget La regla es simple: Visual Basic llama a PropertySet si la declaracin Set es usada, y PropertyLet si no lo es. Tip: Para mantener a PropertyLet y PropertySet correctos, regrese a los tiempos de antao en donde en vez de x = 4 Usted deba escribir Let x = 4 (sintaxis soportada por Visual Basic desde estos das). Visual Basic siempre llama al procedimiento de propiedad que corresponde al tipo de asignacin PropertyLet para Let x = 4 y Property Set para Set c1 = New Class1 (esto es, propiedades objeto). Para mayor informacin vea Trabajando con objetos en Fundamentos de programacin explica el uso de la declaracin Set con variables objeto. Propiedades lectura escritura El siguiente fragmento de cdigo muestra una tpica propiedad lectura escritura: almacenamiento privado para el valor de la propiedad: Private mintNumberOfTeeth As Integer Public Property Get NumberOfTeeth ( ) As Integer NumberOfTeeth = MintNumberOfTeeth End Property Public Property Let NumberOfTeeth (ByVal NewValue _ As Integer) (cdigo para validar el valor de la propiedad omitido) mintNumberOfTeeth = NewValue End Property El nombre de la variable privada que almacena el valor de la propiedad es hecho de un alcance pre fijado (m) que identifica una variable a nivel de mdulo; un prefijo de tipo (int); y un nombre (NomberOfTeeth). Usando el mismo nombre como la propiedad sirve para recordar que la variable y la propiedad tienen relacin. Como sin duda Usted ya lo habr notado, aqu y en ejemplos anteriores, los nombres de procedimientos de propiedad que estructuran una propiedad lectura escritura deben ser los mismos. Nota: Los procedimientos Property son pblicos por defecto, de forma que si omite la palabra Public, ellos siempre sern pblicos. Si por alguna razn desea que una propiedad sea privada (esto es, accesible solo dentro del objeto), Usted debe declararla con la palabra Private. Es una buena prctica usar la palabra Public, an cuando no sea requerida, porque revela claras sus intensiones. Procedimientos de propiedad a trabajar Es instructivo transitar a travs de algunos cdigos de procedimientos de propiedad. Abra un nuevo proyecto Standard Exe y agregue un mdulo de clase, usando el men Project. Copie el cdigo de la propiedad NumberOfTeeth, antes mostrada, dentro de Class1. Cambie a Form1, y agregue el siguiente cdigo al evento Load: Private Sub Form_Load ( ) Dim c1 As Class1 Set c1 = New Class1 asignar un nuevo valor de propiedad: c1.NumberOfTeeth = 42 desplegar el valor de la propiedad: MsgBox cl.NumberOfTeeth End Sub Presione F8 para transitar a travs del cdigo lnea por lnea. Note que cuando la propiedad Value es asignada, ingresa a PropertyLet, y cuando es recuperada, ingresa a PropertyGet. Usted podra encontrar muy til duplicar este ejercicio con otras combinaciones de procedimientos de propiedad.

234

Los argumentos de procedimientos de propiedad pareados deben coincidir Los ejemplos de procedimientos de propiedad que Usted ha visto hasta ahora han sido simples, como ellos son para la mayora de las propiedades. Sin embargo, los procedimientos de propiedad pueden tener argumentos mltiples e incluso argumentos opcionales. Los argumentos mltiples son tiles para propiedades que actan como arreglos, como se describe ms adelante. Cuando usa argumentos mltiples, los argumentos de un par de procedimientos de propiedad deben coincidir. La siguiente tabla demuestra los requerimientos para argumentos en declaraciones de procedimientos de propiedad. Procedimiento Sintaxis de la declaracin PropertyGet PropertyGet propertyname (1,,n) As type PropertyLet PropertyLet propertyname (1,,n, n+1) PropertySet PropertySet propertyname (1,,n, n+1) Del primer argumento al antepenltimo argumento (1,,n) deben compartir los mismos nombres y tipos de datos en todos los procedimientos de propiedad con el mismo nombre. Igual a como con los otros tipos de procedimientos, todos los parmetros requeridos en esta lista deben preceder al primer parmetro opcional. Usted probablemente habr notado que la declaracin del procedimiento PropertyGet toma un argumento menos que sus relacionados PropertyLet o PropertySet. El tipo de datos del procedimiento PropertyGet debe ser el mismo que el tipo de dato del ltimo argumento (n + 1) en los relacionados PropertyLet o PropertySet. Por ejemplo, considere esta declaracin PropertyLet, para una propiedad que acta como un arreglo bi dimensional: Public Property Let Things(ByVal X As Integer, _ ByVal Y As Integer, ByVal Thing As Variant) cdigo para asignar elemento de arreglo omitido. End Property La declaracin PropertyGet debe usar argumentos con el mismo nombre y el mismo tipo de dato que los argumentos en el procedimiento PropertyLet. Public Property Let Things (ByVal X As Integer, _ ByVal Y As Integer) As Variant cdigo para recuperar de arreglo, omitido. End Property El tipo de dato en el argumento final de una declaracin PropertySet debe ser un tipo objeto o una variant. Haciendo coincidir los argumentos

Demo (a, b, c) = d Property Let Demo (w, x, y, z) codigo omitido End Property

La razn de estas reglas de coincidencia de argumentos es ilustrada en esta figura, que muestra cmo visual Basic hace coincidir las partes de las declaraciones de asignacin con los argumentos de un PropertyLet.

El uso ms comn de los procedimientos de propiedad con argumentos mltiples es para crear arreglos de propiedad.

Propiedades de solo lectura Para crear propiedades de solo lectura simplemente omita PropertyLet o (para propiedades objeto) PropertySet. Propiedades objeto

235

Si Usted est creando un propiedad objeto de lectura escritura, use PropertyGet y PropertySet, como sigue: Private mwdgWidget As Widget Public Property Get Widget ( ) As Widget la declaracin Set debe ser usada para retornar una referencia objeto Set Widget = mwdgWidget End Property Public Property Set Widget (ByVal NewWidget As Widget) Set mwdgWidget = NewWidget End Property Propiedades variant Las propiedades lectura escritura del tipo de datos variant son ms complicadas. Ellas usan todos los tres tipos de procedimientos de propiedad, como se muestra a continuacin: Private mvntAnything As Variant Public Property Get Anything ( ) As Variant la declaracin Set es usada solamente cuando la propiedad Anything contiene una referencia objeto. If IsObject (mvntAnything) Then Set Anything = mvntAnything Else Anything = mvntAnything End If End Property Public Property Let Anything (ByVal NewValue As Variant) validacin de cdigo omitida. MvntAnything = NewWidget End Property Public Property Set Anything (ByVal NewValue As Variant) validacin de cdigo omitida. Set mvntAnything = NewWidget End Property PropertySet y PropertyLet son francas, como siempre cuando son llamadas en las circunstancias correctas. Sin embargo, PropertyGet debe manejar los dos casos siguientes: StrSomeString = objvar1.Anything Set objvar2 = objvar1.Anything En el primer caso, la propiedad Anything contiene una cadena, la cual est siendo asignada a una variable de cadena. En el segundo, Anything contiene una referencia objeto, que est siendo asignada a una variable objeto. PropertyGet puede ser codificado para que maneje estos casos, a travs del uso de la funcin IsObject para probar la variant privada antes de retornar el valor. Desde luego, si la primer lnea de cdigo es llamada cuando Anything contiene una referencia objeto, ocurrir un error, pero ese no es un problema de PropertyGet es un problema con el uso de las propiedades variant. Propiedades de solo escritura Existen muchas combinaciones posibles de procedimientos de propiedad. Todas ellas son vlidas, pero algunas son relativamente no comunes, tales como las propiedades de solo escritura (solo PropertyLet, sin PropertyGet). Y algunas dependen de factores y no de las clases de procedimientos de propiedad que Usted pueda combinar. Por ejemplo, cuando organiza los objetos en su programa a travs de la creacin de un modelo objeto, como se describe en Modelos objeto ms adelante en este captulo, puede desear un objeto que sea capaz de referirse al objeto que lo contiene. Usted puede hacer esto implementado la propiedad Padre.

236

Necesita poner esta propiedad Padre cuando el objeto es creado, pero puede desear prevenir que pueda ser modificado accidentalmente o a propsito. El siguiente ejemplo muestra cmo el objeto Account puede implementar una propiedad Padre que apunta al objeto Departamento que contiene la cuenta: almacenamiento de datos privado para la propiedad Parent: Private mdeptParent As Department Property Get Parent ( ) As Deparment use la declaracin Set para referencias objeto: Set Parent = mdeptParent End Property el valor de la propiedad puede ser puesto solo una vez: Public Property Set Parent (ByVal NewParent As Department) If deptParent Is Nothing Then asignar el valor inicial: Set mdeptParent = NewParent Else Err.Raise Number: =vbObjectError + 32144 _ Description:= Parent property is read only End If End Property Cuando Usted accede al padre de un objeto Account, por ejemplo a travs de este cdigo strX = acctNew.Parent.Name para obtener el nombre del departamento, PropertyGet es invocada para retornar la referencia del objeto Padre. PropertySet en este ejemplo es codificada de forma que la propiedad Padre solamente pueda ser puesta una vez. Por ejemplo, cuando el objeto Department crea una nueva cuenta, debe ejecutar el cdigo Set acctNew.Parent = Me para establecer la propiedad. Por tanto, la propiedad es de solo lectura. Para mayor informacin: En vista de que los formularios en Visual Basic son clases, Usted puede agregar propiedades personales a los formularios. Vea Personalizando clases de formularios ya visto en este captulo. Traduccin: Derechos de Autor: RBsoftware (2001) Viernes, 11 de mayo 2001. 00:41am. Archivo: Traduccin VB29. Agregando mtodos a una clase Los mtodos de una clase son los procedimientos pblicos Sub o de funcin que Usted ha declarado. Ya que los procedimientos Sub y de funcin son pblicos por defecto, Usted no tiene que explcitamente especificar la palabra Public para crear un mtodo. Por ejemplo, para crear el mtodo Withdrawal para la clase Account, puede agregar este procedimiento de funcin pblica al mdulo de clase: Public Function WithDrawal (ByVal Amount As Currency, _ ByVal TransactionCode As Byte) As Double cdigo para ejecutar retiros y retornar el nuevo saldo, o disparar un error por sobregiro. End Function Tip: Aunque no tiene que escribir la palabra Public, hacerlo es una buena prctica de programacin, ya que esto hace clara su intencin a la gente que pueda darle mantenimiento a su cdigo ms tarde. Declarando mtodos como Public Subs Retornar el nuevo saldo es opcional, ya que puede llamar la propiedad Balance del objeto Account despus de llamar al mtodo Withdrawal. Usted podra codificar Withdrawal como un procedimiento Sub Public. Tip: Si se encuentra llamando a Balance cada vez que llama a Withdrawal, regresando el nuevo saldo ser un poco ms eficiente. Esto es porque, como se explic en Agregando propiedades a los mdulos de clase,

237

cualquier acceso a una propiedad, an una lectura de variable pblica, significa una llamada de funcin un explcito o implcito PropertyGet. Importante: Los siguientes nombres no pueden ser usados como nombres de mtodos o de propiedad, porque ellos pertenecen a las interfases Iunknown y Idispatch: QueryInterface, AddRef, Release, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, e Invoke. Estos nombres causan error en tiempo de compilacin. Para mayor informacin sobre procedimientos Sub y de funcin, ve Introduccin a procedimientos en Fundamentos de programacin. Protegiendo detalles de implementacin La interfase pblica de una clase es definida por las declaraciones de propiedad y mtodo en el mdulo de clase. Como en la ocultacin de datos, los procedimientos que declara como privados no son parte de la interfase. Esto significa que Usted puede hacer cambios a procedimientos utilitarios que son usados internamente por un mdulo de clase, sin afectar el cdigo que usan los objetos. An ms importante, puede cambiar el cdigo dentro del procedimiento pblico Sub o funcin que implementa un mtodo, sin afectar el cdigo que usa el mtodo. Mientras no cambie los tipos de datos de los argumentos del procedimiento, o el tipo de dato retornado por un procedimiento de funcin, la interfase permanecer sin cambio. Esconder los detalles de la implementacin de un objeto detrs de la interfase es otra faceta de encapsulacin. La encapsulacin le permite mejorar la ejecucin de mtodos, o cambiar completamente la forma en que el mtodo es implementado, sin tener que cambiar el cdigo que usa el mtodo. Nota: Los lineamientos para nombrar los elementos de la interfase descritos en Nombrando propiedades, mtodos y eventos se aplican no solamente a nombres de propiedades y mtodos, sino a los nombres de parmetros en los procedimientos Sub y de funcin que definen sus mtodos. Estos nombres de parmetros son visibles cuando visualiza los mtodos con el object browser, y pueden ser usados como parmetros nombrados (esto es, parametername = value) cuando los mtodos son invocados. Los argumentos nombrados son introducidos en Pasando argumentos a procedimientos en Fundamentos de programacin. Agregar mtodos a clases de formularios es una poderosa tcnica de programacin, descrita en Personalizando clases de formularios. Algunas veces no est claro cundo un miembro debe ser una propiedad o un mtodo. Es una propiedad o un mtodo? ofrece algunos lineamientos. Es una propiedad o un mtodo? En general, una propiedad son datos acerca de un objeto, mientras que un mtodo es una accin que el objeto ser requerido que ejecute. Algunas cosas son obviamente propiedades, como Color y Name, o otras son obvios mtodos, tales como Move y Show. Sin embargo, al igual que cualquier faceta de comportamiento humano, existe un rea gris en que un argumento puede ser uno u otro. Por ejemplo, por qu el mtodo elemento de la clase Collection de Visual Basic es un mtodo y no una propiedad indexada? No son los elementos de una coleccin solamente datos? El mtodo Item de una clase Collection Widget hipottica puede ser implementada de una u otra forma, como se muestra a continuacin: almacenamiento privado para los objetos en la coleccin Widget (el mismo para ambas implementaciones: Private mcol As New Collection Public Property Get Item (Index As Variant) As Widget Set Item = mcol.Item(Index)

238

End Function -oPublic Function Item (Index As Variant) As Widget Set Item = mcol.Item(Index) End Function No existe una gran diferencia en estas dos implementaciones. Ambas son de solo lectura, por tanto ambas dependen del mtodo Add de la clase Widgets para obtener objetos Widget dentro de la coleccin. Ambos delegan todo al objeto Collection an sus errores son generados por Collection! Delegacin es explicada en Las muchas interfases de Code Reuse y Creando sus propias clases Collection ms adelante en este captulo. Usted puede encontrarse con la trivialidad de tratar de decidir si un miembro es dato para un objeto, o comportamiento del objeto. Por ejemplo, puede argir que item es un mtodo por que la coleccin est haciendo algo por Usted buscando el widget que Usted desea. Sin embargo, este tipo de argumento puede usualmente ser hecho con igual validez para uno y otro lado. Puede encontrar ms til preguntarse cmo desea que piensen acerca del miembro. Si desea que la gente piense que son datos acerca de un objeto, hgalo una propiedad. Si desea que la gente piense que es algo que el objeto hace, hgalo un mtodo. El argumento sintaxis Una razn fuerte para implementar un miembro usando procedimientos de propiedad depende de la forma que desee usar el miembro en cdigo. Es decir, a un usuario de la coleccin Widgets se le permitir codificar lo siguiente? Set Widgets.Item (4) = wdgMyNewWidget Si es as implemente el miembro como una propiedad de lectura escritura, usando PropertyGet y PropertySet, porque los mtodos no soportan esta sintaxis. Nota: En la mayora de las implementaciones de coleccin que Usted encuentra esta sintaxis no es permitida. Implementar PropertySet para una coleccin no es tan fcil como parece. El argumento de la ventana propiedad Puede suponer por un momento que su objeto es como un control. Se imagina al miembro mostrndose en una ventana de propiedad o en una pgina de propiedad? Si esto no tiene sentido, no implemente el miembro como una propiedad. El argumento del error sensible Si olvida que hizo el elemento como una propiedad de solo lectura y trata de asignarle un valor, se le facilitar entender el mensaje de error que Visual Basic dispara para un PropertyGet Cant assign to read only property que el error que dispara por un procedimiento de funcin Function call on left - hand side of assignment must return Variant or Object. El argumento del ltimo recurso Como ltimo argumento, lance una moneda al aire. Si ninguno de los argumentos en este tpico le obligan, probablemente esto no hace mucha diferencia. Los procedimientos de propiedad son introducidos en Agregando propiedades a clases ya visto en este captulo. Los mtodos son descritos en Agregando mtodos a clases. Haciendo por defecto a una propiedad o a un mtodo Puede otorgarles a sus objetos creados a partir de sus clases propiedades por defecto, igual que las propiedades por defecto proporcionadas por Visual Basic. El mejor candidato a miembro por defecto es uno que use ms a menudo. Para establecer por defecto a una propiedad o a un mtodo:

239

1. 2. 3.

En el men Tools, seleccione Procedure Attributes para abrir la caja de dilogo Procedure Attributes. De clic en Advanced para expandir la caja de dilogo Procedure Attributes. En la caja Name, seleccione la propiedad o mtodo que es actualmente el defecto para la clase. Si la clase actualmente no tiene un miembro por defecto, sltese al paso5. Nota: Puede usar el object browser para encontrar cul es actualmente el miembro por defecto de la clase. Cuando seleccione la clase en la lista de clases, puede navegar a travs de los miembros en la lista de miembros; el miembro por defecto estar marcado con un pequeo globo azul al lado de su icono.

4. 5. 6.

En la caja Procedure ID, seleccione None para remover el estatus por defecto de la propiedad o mtodo. En la caja Name, seleccione la propiedad o mtodo que desea sea el nuevo valor por defecto. En la caja Procedure ID, seleccione (Default), despus de clic en OK.

Importante: Una clase puede tener solamente un miembro por defecto. Si una propiedad o mtodo ya est marcado como por defecto, debe cambiar su Procedure ID a None antes de poder marcar otro valor por defecto para la propiedad o para el mtodo. No ocurrir error de compilacin si dos miembros tienen marca por defecto, pero no existe forma de predecir cul de ellos para Visual Basic ser el valor por defecto. Puede abrir la caja de dilogo Procedure Attributes a partir del object browser. Esto es conveniente cuando cambia el miembro por defecto de una clase, porque de esta forma puede rpidamente ubicar el existente miembro por defecto. Para cambiar la propiedad por defecto usando el object browser: 1. Presione F2 para abrir el object browser. 2. En la lista de clases, seleccione la clase cuyo valor por defecto desea cambiar. 3. En la lista de miembros, de clic con el botn derecho sobre el miembro con el pequeo globo azul al lado de su icono para abrir el men contextual. De clic en Properties para abrir la caja de dilogo Property Attributes. 4. De clic en Advanced para expandir la caja de dilogo Procedure Attributes. 5. En la caja Procedure ID, seleccione None para remover el estatus por defecto de la propiedad o el mtodo, despus de clic en OK. 6. En la lista de miembros de clic con el botn derecho sobre el miembro que desee sea el nuevo valor por defecto para abrir el men contextual. Clic Properties para mostrar la caja de dilogo Property Attributes. 7. De clic en Advanced para expandir la caja de dilogo Procedure Attributes. 8. En la caja Procedure ID, seleccione (Default), despus de clic en OK. Nota: No puede usar la caja de dilogo Procedure Attributes para cambiar el miembro por defecto de una clase proporcionada por Visual Basic. Propiedades Friend y mtodos Adems de declarar las propiedades y mtodos pblicos y privados, puede declararlos Friend. Los miembros Friend se parecen a los miembros pblicos para otros objetos en su proyecto. Esto es, ellos aparentan ser parte de la interfase de clase. Ellos no lo son. En los componentes ActiveX los miembros Friend juegan un importante papel. Porque ellos no son parte de una interfase objeto, ellos no pueden ser accedidos por programas que usan los objetos del componente. Sin embargo, ellos son visibles a todos los otros objetos dentro del componente, as que ellos permiten comunicacin interna segura dentro del componente. Importante: Ya que los miembros Friend no son parte de la interfase pblica del objeto, ellos no pueden ser accedidos late bound es decir, a travs de variables declaradas As Object. Para usar miembros Friend debe declarar las variables early binding es decir, As classname.

240

Los proyectos Standard Exe no pueden ser componentes ActiveX, porque sus mdulos de clase no pueden ser pblicos, y por ello no pueden ser usados por otras aplicaciones. Todas las comunicaciones entre objetos en un proyecto Standard Exe es por lo tanto privado, y por lo tanto ah no hay necesidad de miembros Friend. Sin embargo, los miembros Friend tienen una caracterstica til particular. En vista de que ellos no son parte de una interfase ActiveX, ellos pueden ser usados para pasar tipos definidos por el usuario entre objetos. Por ejemplo, supngase que tiene el siguiente tipo definido por el usuario en un mdulo estndar: Public Type udtDemo IntA As Integer LngB As Long StrC As String End Type Puede definir la siguiente variable privada y miembros Friend en Class1: Private mDemo As udtDemo Friend Property Get Demo ( ) As udtDemo Demo = mDemo End Property note que udtDemo debe ser pasado por referencia: Friend Property Let Demo (NewDemo As udtDemo) MDemo = NewDemo End Property Friend Sub SetDemoParts (ByVal A As Integer, _ ByVal B As Long, ByVal C As String) MDemo.intA = A MDemo.lngB = B MDemo.strC = C End Sub Public Sub ShowDemo ( ) MsgBox mDemo.intA & vbCrLf _ & mDemo.lngB & vbCrLf & mDemo.strC End Sub Nota: Cuando pasa tipos definidos por el usuario como Sub, Function, o argumentos de procedimientos de propiedad, debe de pasarlos por referencia. (ByRef es el valor por defecto para argumentos de procedimientos). Puede entonces escribir el siguiente cdigo para usar Class1: Private Sub Command1_Click ( ) Dim c1A As New Class1 Dim c1B As New Class1 C1A.SetDemoParts 42, 1138, Howdy C1B.Demo = c1A.Demo Clb.ShowDemo End Sub La caja de mensaje desplegar 42, 1138, y Howdy Nota: En vista de que los procedimientos Friend no son parte de la interfase de la clase, ellos no son incluidos cuando usa declaraciones Implements para implementar mltiples interfases, como se describe en Polimorfismo. El uso de miembros Friend en componentes es descrito en Comunicaciones privadas entre sus objetos en Principios generales de diseo de componentes en la Gua de herramientas de componentes.

241

Agregando eventos a una clase Bien, digamos que ha creado una simulacin de dinosaurios, completadas con clases Stegosaur, Triceratops, y Tyrannosaur. Como toque final, desea que el Tyrannosaur ruja, y cuando haga esto desea que los otros dinosaurios en su simulacin se sienten y presten atencin. Si la clase Tyrannosaur tiene un evento Roar, podra manejar ese evento en todas las clases dinosaurios. Este tpico describe la declaracin y manejo de eventos en sus mdulos de clases. Nota: Nios, no traten este ejemplo en casa, al menos no con ms que unos pocos dinosaurios. Conectar cada dinosaurio usando eventos puede hacerlos tan lentos que los objetos mamferos pueden asumir la direccin de la simulacin. Se dice que las propiedades y mtodos pertenecen a interfases de entrada, porque ellas son invocadas desde la parte externa del objeto. Por contraste, los eventos son llamados interfases de salida, porque ellas son iniciadas dentro del objeto, y manipuladas en cualquier lado. Los siguientes tpicos describen el proceso de declarar, originar, y manipular eventos, con ejemplos. Declarando y originando eventos Como los procedimientos, los eventos (y sus argumentos) tienen que ser declarados. Para que un evento declarado ocurra, el objeto debe originarse. Manipulando eventos de objetos Los eventos que sus objetos originan pueden ser manejados por otros objetos usando variables declaradas usando la palabra WithEvents. Comparando WithEvents versus Eventos de Control en formularios Similitudes y diferencias entre procedimientos de evento asociados con variables WithEvents y aquellos asociados con controles sobre formularios. Agregando un evento a un formulario Un corto ejemplo paso a paso para agregar eventos personales a un formulario. Resumen de declaracin, origen, y manejo de eventos Un resumen de los procesos sobre el uso de eventos en clases. Para mayor informacin: Creacin de componentes ActiveX en la Gua de herramientas de componentes describe el uso de eventos en el diseo de su propio software de componentes. Para una descripcin de una mejor forma para manejar dinosaurios, vea Polimorfismo ms adelante en este captulo. Declarando y originando eventos Asuma por el momento que tiene una clase Widget. Su clase Widget tiene un mtodo que toma mucho tiempo para ejecutarse, y desea que su aplicacin despliegue alguna clase de indicador de avance del proceso. Desde luego, puede hacer que el objeto Widget muestre una caja de dilogo de porcentaje de avance, pero ocurre el problema de que esta caja de dilogo se mostrar en cada proyecto en que usa la clase Widget. Un buen principio en el diseo de objetos es permitir a la aplicacin que usa el objeto que maneje la interfase de usuario a no ser que todo el propsito del objeto es el manejo de un formulario o de una caja de dilogo. El propsito del Widget es ejecutar otras tareas, por tanto es razonable darle el evento PercentDone, y permitir a los procedimientos que llaman a los mtodos del Widget que manejen ese evento. El evento PercentDone puede tambin proporcionar un mecanismo para cancelar la tarea. Puede comenzar construyendo el cdigo ejemplo para este tpico abriendo un proyecto Standard Exe y agregando dos CommandButton y un Label a Form1. En el men Project, seleccione Add Class Module para agregar un mdulo de clase al proyecto. Nombre los objetos como se muestra en la tabla siguiente: Objeto Propiedad Valor Mdulo de Clase Name Widget Command1 Caption Start Task

242

Command2 Label

Caption Name Caption

Cancel LblPercentDone 0

La clase Widget Declare un evento en la seccin de declaraciones del mdulo de clase, usando la palabra reservada Event. Un evento puede tener argumentos ByVal y ByRef, como el evento PercentDone del Widget lo demuestra: Option Explicit Public Event PercentDone (ByVal Percent As Single, _ ByRef Cancel As Boolean) Cuando el objeto llamado recibe el evento PercentDone, el argumento Percent contiene el porcentaje de la tarea que ha sido completada. El argumento ByRef Cancel puede ser puesto a True para cancelar el mtodo que ha originado el evento. Nota: Puede declarar argumentos de evento como lo hace con procedimientos de argumento, con las excepciones siguientes: los eventos no pueden tener argumentos nombrados, argumentos opcionales, o argumentos ParamArray. Los eventos no tienen valores de retorno. Originando el evento PercentDone El evento PercentDone es originado por el mtodo LongTask de la clase Widget. El mtodo LongTask toma dos argumentos: la longitud del tiempo que el mtodo pretender hacer el trabajo, y el intervalo de tiempo mnimo antes de que LongTask haga una pausa para originar el evento PercentDone. Public Sub LongTask (ByVal Duration As Single, _ ByVal MinimumInterval As Single) Dim sngThreshold As Single Dim sngStart As Single Dim blnCancel As Boolean la funcin Timer regresa el nmero fraccional de segundos desde medianoche como Single sngStart = Timer sngThreshold = MinimumInterval Do While Timer < (sngStart + Duration ) en una aplicacin real, cierta unidad de trabajo ser hecha aqu cada vez dentro del bucle. If Timer > (sngStart + sngThreshold) Then RaiseEvent PercentDone( _ SngThreshold / Duration, blnCancel) ver si el operador cancela la operacin: If blnCancel Then Exit Sub SngThreshold = sngThreshold + MinimumInterval End If Loop End Sub Por cada MinimumInterval segundos el evento PercentDone es originado. Cuando el evento regresa, LongTask verifica si el argumento Cancel ha sido puesto en True. Nota: Por simplicidad, LongTask asume que sabe cunto tiempo tomar la tarea. Esto casi nunca es el caso. Dividir las tareas en pedazos de igual tamao puede ser difcil, y a menudo la cosa que ms los usuarios necesitan es simplemente la cantidad de tiempo que ha pasado antes de que ellos obtengan una indicacin que algo est pasando. Ahora que ha declarado un evento y lo ha originado, cmo obtiene otro objeto para manejarlo? Manejando eventos de un objeto contina la saga del objeto Widget. Manejando eventos de un objeto Un objeto que origina un evento es llamado evento fuente. Para manejar los eventos originados por un evento fuente declara una variable de la clase del objeto usando la palabra reservada WithEvents.

243

Este tpico contina el ejemplo objeto Widget iniciado en Declarando y originando eventos. Para manejar el evento PercentDone del Widget, site el siguiente cdigo en la seccin de declaraciones generales de Form1: Option Explicit Private WithEvents mWidget As Widget Private mblnCancel As Boolean La palabra reservada WithEvents especifica que la variable mWidget ser usada para manejar los eventos de un objeto. Especifica el tipo de objeto suministrando el nombre de la clase a partir de la cual el objeto ser creado. La variable mWidget es declarada en la seccin de declaraciones de Form1 porque las variables WithEvents deben de ser variables a nivel de mdulo. Esto es aplicable sin importar el tipo de mdulo en donde las coloque. La variable mblnCancel ser usada para cancelar el mtodo LongTask. Limitaciones de las variables WithEvents Debe estar enterado de las siguientes limitaciones sobre el uso de las variables WithEvents: La variable WithEvents no puede ser una variable objeto genrica. Esto es, no puede declararla As Object debe especificar el nombre de la clase cuando especifica la variable. No puede declarar la variable WithEvents As New. El objeto evento fuente debe ser explcitamente creado y asignado a la variable WithEvents. No puede declarar variables WithEvents en un mdulo estndar. Ellas pueden declararlas solamente en mdulos de clase, mdulos de formulario, y otros mdulos que definen clases. No puede crear arreglos con variables WithEvents. Escribiendo cdigo para manejar un evento Tan pronto como declara una variable WithEvents, el nombre de la variable aparece a la izquierda de la ventana de cdigo del mdulo. Cuando selecciona mWidget, los eventos de la clase Widget aparecern a la derecha. Al seleccionar un evento se desplegar el correspondiente procedimiento de evento, con el prefijo mWidget_. Todos los eventos de procedimientos asociados con una variable WithEvents tendrn el nombre de la variable como prefijo. Agregue el siguiente cdigo al procedimiento de evento mWidget_PercentDone: Private Sub mWidget_PercentDone (ByVal Percent As _ Single, Cancel As Boolean) LblPercentDone.Caption = Cint(100 * Percent) & % DoEvents If mblnCancel Then Cancel = True End Sub Cada vez que el evento de procedimiento PercentDone es originado, el procedimiento de evento despliega el porcentaje completado en un control Label. La declaracin DoEvents permite al Label ser repintado, y tambin brinda al usuario la oportunidad de dar clic al botn Cancel. Agregue el siguiente cdigo para el evento click del botn cuyo Caption es Cancel: Private Sub Command2_Click ( ) MblnCancel = True End Sub Si el usuario da clic al botn Cancel mientras LongTask se est ejecutando, el evento del Command2_Click ser ejecutado tan pronto como la declaracin DoEvents permita al procesamiento de evento que ocurra. La variable a nivel de mdulo mblnCancel es puesta a True, y el evento mWidget_PercentDone despus lo prueba y pone el argumento ByRef Cancel a True. Conectando la variable WithEvents a un objeto En Form1 ya est todo preparado para manejar los objetos Widget. Lo que resta es encontrar un Widget en algn lado.

244

Cuando declara una variable WithEvents en tiempo de diseo, no existe objeto asociado con ella. Una variable WithEvents es como cualquier otra variable objeto. Tiene que crear un objeto y asignar una referencia al objeto y a la variable WithEvents. Agregue el siguiente cdigo al procedimiento de evento Form_Load para crear el Widget: Private Sub Form_Load ( ) Set mWidget = New Widget End Sub Cuando el cdigo anterior es ejecutado, Visual Basic crea un Widget y conecta sus eventos a los procedimientos de evento asociados con mWidget. A partir de este punto, cada vez que Widget origine su evento PercentDone, el procedimiento de evento mWidget_PercentDone ser ejecutado. Para llamar el mtodo LongTask, agregue el siguiente cdigo al evento clic del botn cuyo Caption es Start Task: botn Start Task: Private Sub Command1_Click ( ) MblnCancel = False LblPercentDone.Caption = 0% LblPercentDone.Refresh Call mWidget.LongTask (14.4, 0.66) If Not mblnCancel Then lblPercentDone.Caption = 100 End Sub Antes que el mtodo LongTask es llamado, el Label que despliega el porcentaje completado debe ser inicializado, y el flag Boolean a nivel de mdulo para cancelar el mtodo debe ser puesto en False. LongTask es llamado con una duracin de tarea de 14.4 segundos. El evento PercentDone es originado una vez cada dos tercios de segundo. Cada vez que el evento es originado, el procedimiento de evento mWidget_PercentDone ser ejecutado. Cuando LongTask es hecho, mblnCancel es probado para ver si LongTask finaliz normalmente o si fue detenido porque mblnCancel fue puesto a True. El porcentaje completado es actualizado solamente en el caso pasado. Ejecutando el programa Pulse F5 para poner el proyecto en modo de ejecucin. De clic al botn Start Task. Cada vez que el evento PercentDone es llamado, el Label es actualizado con el porcentaje de la tarea que es completado. De clic en el botn Cancel para detener la tarea. Observe que la apariencia del botn Cancel no cambia inmediatamente cuando le da clic. El evento clic no puede suceder hasta que la declaracin DoEvents permite el procesamiento de eventos. Encontrar instructivo ejecutar este programa con F8, e ir paso a paso dentro del cdigo, una lnea cada vez. Claramente ver cmo la ejecucin entra en LongTask, y como re entra a Form1 brevemente cada vez que el evento PercentDone es llamado. Qu suceder si, mientras la ejecucin retorna al cdigo de Form1, el mtodo LongTask haya sido de nuevo llamado? Confusin, caos, y eventualmente (si esto sucede cada vez que el evento ha sido llamado) un rebalse de tarea (stack overflow). Manejando eventos para un Widget diferente Puede causar que la variable mWidget maneje eventos por un diferente objeto Widget asignando una referencia al nuevo Widget y a mWidget. De hecho, puede hacer que el cdigo en Command1 haga esto cada vez que de clic a este botn, agregando estas lneas de cdigo: Set mWidget = New Widget nueva lnea. Call mWidget.LongTask(14.4, 0.66) Set mWidget = Nothing

245

Este cdigo crea un nuevo Widget cada vez que el botn es presionado. Tan pronto como el mtodo LongTask se completa, la referencia al Widget es liberada poniendo al Widget en Nothing, y el Widget es destruido. Una variable WithEvents puede contener solamente una referencia objeto a la vez, de manera que si asigna un diferente objeto Widget a mWidget, los previos eventos del objeto Widget no sern manejados. Si mWidget es la nica variable objeto conteniendo una referencia para el viejo Widget, el objeto ser destruido. Nota: Puede declarar tantas variables WithEvents como lo desee, pero arreglos con variables WithEvents con son soportados. Terminando un manipulador de eventos para una variable WithEvents Mientras exista un objeto Widget asignado a la variable mWidget, los procedimientos de evento asociados con mWidget sern llamados siembre que Widget evoque un evento. Para terminar la manipulacin de evento, puede poner mWidget en Nothing, como se muestra en el siguiente fragmento de cdigo: terminar manipular evento de mWidget: Set mWidget = Nothing Cuando una variable WithEvents es puesta en Nothing, Visual Basic desconecta los eventos del objeto de los procedimientos de evento asociados con la variable. Importante: Una variable WithEvents contiene una referencia objeto, igual como cualquier otra variable objeto. Esta referencia objeto mantiene el objeto vivo. Cuando est poniendo todas las referencias a un objeto a Nothing con el objeto de destruirlo, no olvide las variables declaradas con WithEvents. Para mayor informacin: Los procedimientos de evento asociados con variables WithEvents mucho se parecen a los procedimientos de evento de los controles de los formularios. Comparando WithEvents versus eventos de controles en formularios describe sus similitudes y diferencias. Comparando WithEvents versus eventos de controles de formularios Existen similitudes en la forma en que se usan las variables WithEvents y la forma que se usa para manejar los eventos invocados por controles en un formulario. En ambos casos, cuando selecciona el evento en la parte derecha de la ventana de cdigo, obtiene el procedimiento de evento conteniendo los argumentos correctos para el evento. De hecho, el mecanismo es exactamente el mismo. Un control es tratado como una propiedad de la clase formulario, y el nombre de esa propiedad es el valor asignado a la propiedad Name del control en la ventana de propiedades. Es como si existiera una variable a nivel de mdulo pblica con el mismo nombre del control, y todos los nombres de los procedimientos de evento del control comiencen con este nombre de variable, igual a como sucede con la variable WithEvents. Puede fcilmente ver esto declarando la variable mWidget Public en vez de Private. Al hacer esto, mWidget se muestra en el object browser como una propiedad de Form1, igual que los controles del formulario. La diferencia entre los dos casos es que Visual Basic automticamente crea instancias de todos los controles en un formulario cuando el formulario es creado, mientras que Usted tiene que crear sus propias instancias de clases cuyos eventos desea manejar, y asignar referencias a aquellos objetos y a variables WithEvents. Para mayor informacin: Puede agregar sus propios eventos a los formularios, como se describe en Agregando un evento a un formulario.

246

Agregando un evento a un formulario El siguiente procedimiento muestra paso a paso cmo crear eventos personales para formularios. Para probar este ejercicio abra un nuevo proyecto Standard Exe, y haga lo siguiente: Para agregar un evento a Form1: 1. En el men Project seleccione Add Class Module, para agregar un mdulo de clase al proyecto. Site el siguiente cdigo en la seccin de declaraciones de Class1: Public Property Get Form1 ( ) As Form1 Set Form1 = mForm1 End Property Public Property Set Form1 (ByVal NewForm1 As Form1) Set mForm1 = NewForm1 End Property Si est usando Procedure View, los procedimientos de propiedad no pueden ser vistos al mismo tiempo. De clic en el botn Full Module View ubicado en la esquina inferior izquierda de la ventana de cdigo para cambiar a Full Module View. Puede volver a Procedure View dndole clic al botn Procedure View que est contiguo. (Ubique el apuntador sobre estos botones para saber cul es cul). 2. Agregue el siguiente cdigo a la seccin de declaraciones de Form1: Event Gong Private mc1 As Class1 Ahora que Class1 ha sido creado, es posible crear una variable de tipo Class1. Este procedimiento cambia entre Form1 y Class1 muchas veces, porque un paso en un mdulo requiere primero agregar cdigo al otro. 3. Regrese a Class1 y agregue el siguiente cdigo a la seccin de declaraciones: Private WithEvents mForm1 As Form1 Como se describe en Agregando eventos a una clase la palabra reservada WithEvents significa que esta instancia de Form1 es asociada con eventos. Note que este paso no es posible hasta que el evento Gong haya sido creado. 4. En la parte izquierda (object) de la ventana de cdigo de Class1, seleccione mForm1 para obtener el procedimiento de evento para el evento Gong. Agregue el siguiente cdigo al procedimiento de evento: Private Sub mForm1_Gong ( ) MsgBox Gong! End Sub

5. Regrese a Form1. En la ventana objeto seleccione Form. A la derecha (Procedure), seleccione Load.
Agregue el siguiente cdigo al procedimiento de evento: Private Sub Form_Load ( ) Set mc1 = New Class1 Set mc1.Form1 = Me End Sub La primera lnea crea el objeto Class1, y la segunda le asigna a su propiedad Form1 (creada en paso 1) una referencia a Form1 (esto es, Me cuando est en la ventana de cdigo de Form1, Me se refiere a Form1, cuando est en la ventana de cdigo de Class1, Me se refiere a Class1). Coloque tres cajas de texto en Form1. Use las ventanas Object y Procedures para seleccionar eventos de procedimiento Change para cada control, y coloque esta lnea de cdigo a cada uno de ellos: Private Sub Text1_Change ( ) RaiseEvent Gong End Sub Cada vez que cambie el contenido de una caja de texto, el evento Gong del formulario ser invocado. Presione F5 para correr el proyecto. Cada vez que escriba un carcter en una de las cajas de texto, la caja de mensaje suena una campana. Es muy molesta, pero muestra cmo puede agregar un evento a un formulario, y as tener notificaciones a partir de diversos controles.

6.

7.

247

Como se muestra en Declarando e invocando eventos puede agregar argumentos a eventos. Puede pasar el nombre de un control o, mejor an, una referencia al control al recibidor del evento. Resumen de declaracin, invocacin y manipulacin de eventos Para agregar un evento a una clase y despus usar el evento, debe: En la seccin de declaraciones del mdulo de clase que define la clase, use la declaracin Event para declarar el evento con los argumentos deseados que tenga. Los eventos son siempre pblicos. Nota: Los eventos no pueden tener argumentos nombrados, argumentos opcionales, o argumentos ParamArrray. Los eventos no retornan valores. En lugares apropiados en el cdigo del mdulo de clase, use la declaracin RaiseEvent para invocar el evento, suministrando los argumentos necesarios. En la seccin de declaraciones del mdulo que manipular el evento, agregue una variable del tipo de clase, usando la palabra reservada WithEvents. Esta debe ser una variable a nivel de mdulo. En la ventana de cdigo, parte izquierda, seleccione la variable declarada con WithEvents. En la ventana de cdigo, parte derecha, seleccione el evento que desea manipular. (puede declarar eventos mltiples para una clase). Agregue cdigo al procedimiento de evento, usando los argumentos suministrados. Para mayor informacin: Detalles y ejemplos de cdigo son proporcionados en Agregando eventos a una clase. Nombrando propiedades, mtodos y eventos Las propiedades, mtodos y eventos que agrega al mdulo de clase definen la interfase que ser usada para manipular objetos creados a partir de la clase. Cuando nombre estos elementos, y sus argumentos, podr encontrar til las reglas siguientes: Use palabras enteras siempre que sea posible, por ejemplo, SpellCheck. Las abreviaturas pueden tomar muchas formas, en consecuencia pueden ser confusas. Si la frase completa es muy larga, use las primeras slabas completas. Use letras maysculas y minsculas, inicie con mayscula cada palabra o slaba, como por ejemplo, ShortcutMenus o AsyncReadComplete. Use el plural correcto para nombres de clase collection, como por ejemplo, Worksheets, Forms, o Widgets. Si la coleccin contiene objetos con un nombre que finaliza en s, agregue la palabra collection como sufijo, como por ejemplo, SeriesCollection. Use el orden, ya sea verbo / objeto, u objeto / verbo, en forma consistente para sus nombres de mtodos. Esto es, use InsertWidget, InsertSprocket, y as sucesivamente, o siempre coloque primero el objeto, como en WidgetInsert y SprocketInsert.

Uno de los principales beneficios de la programacin con objetos es el re uso del cdigo. Siguiendo las reglas anteriores, las cuales son parte de los lineamientos de ActiveX para interfases, hace que se facilite recordar los nombres y propsitos de propiedades, mtodos y eventos. Para mayor informacin vea la lista explicada en Qu hay dentro de un nombre? en Principios generales de diseo de componentes en Creando componentes ActiveX en la Gua de herramientas de componentes. Polimorfismo Polimorfismo significa que muchas clases pueden proporcionar la misma propiedad o mtodo, y un llamador no tiene que conocer a qu clase pertenece un objeto antes de llamar a la propiedad o al mtodo. Por ejemplo, la clase Flea y la clase Tyrannosaur pueden tener cada una el mtodo Bite. Polimorfismo significa que puede invocar Bite sin conocer si un objeto es Flea o Tyrannosaur aunque verdaderamente lo conocer despus.

248

Los siguientes tpicos describen los primeros pasos de Visual Basic en la entrada a polimorfismo y puede usarlo en sus programas. Cmo Visual Basic proporciona polimorfismo Muchos lenguajes orientados a objeto proporcionan polimorfismo va hereditaria; Visual Basic usa el planteamiento de interfase mltiple del modelo objeto componente (COM). Creando e implementando una interfase Un ejemplo de cdigo extendido que muestra cmo crear una interfase de animal abstracto e implementarla para las clases Tyrannosaur y Flea. Implementando propiedades Las interfases que implementa pueden tener propiedades as como mtodos, aunque existen algunas diferencias en la forma en que las propiedades son implementadas. Interrupcin para una breve discusin sobre objetos e interfases Aclara los trminos objeto e interfase, introduce el concepto de interpelacin a una interfase, y describe otras fuentes de interfases a implementar. Las muchas interfases de re uso de cdigo Adems de implementar interfases abstractas, puede re usar su cdigo implementando la interfase de una clase ordinaria, y despus selectivamente delegndola a una instancia escondida de la clase. Para mayor informacin: El polimorfismo se ha convertido en un mecanismo poderoso para el desarrollo de sistemas de componentes de software. Esto es descrito en Principios generales de diseo de componentes en Creacin de componentes ActiveX en Gua de herramientas de componentes. Cmo Visual Basic proporciona polimorfismo La mayora de los sistemas de programacin orientados a objeto proporcionan polimorfismo a travs de herencia. Esto es, las clases hipotticas Flea y Tyrannosaur ambas heredan de la clase Animal. Cada clase debe anular el mtodo Bite de la clase Animal, con el objeto de proporcionar sus propias caractersticas Bite. El polimorfismo proviene del hecho que puede llamar al mtodo Bite de un objeto perteneciendo de cualquier clase de que se derive de Animal, sin conocer a qu clase pertenece el objeto. Proporcionando polimorfismo con interfases Visual Basic no usa la herencia para proporcionar polimorfismo. Visual Basic proporciona polimorfismo a travs de mltiples interfases ActiveX. En el modelo objeto de componentes (COM) que forma la estructura de la especificacin ActiveX, mltiples interfases permiten a los sistemas de componentes de software evolucionar sin cambiar el cdigo existente. Una interfase es un juego de propiedades y mtodos. Gran parte de las especificaciones ActiveX estn relacionadas con la implementacin de interfases estndar para obtener servicios del sistema o para proporcionar funcionalidad a otros programas. En Visual Basic una interfase Animal y la implementar en sus clases Flea y Tyrannosaur. Despus podr invocar el mtodo Bite para cualquier tipo de objeto, sin conocer de qu clase era. Polimorfismo y ejecucin El polimorfismo es importante por razones de ejecucin. Para ver esto, considere la siguiente funcin: Public Sub GetFood (ByVal Critter As Object, _ ByVal Food As Object) Dim dblDistance As Double cdigo para calcular la distancia a food omitido: Critter.Move dblDistance late bound. Critter.Bite Food late bound. End Sub Los mtodos Move y Bite son late bound a Critter. Late binding ocurre cuando Visual Basic no puede determinar en tiempo de compilacin qu tipo de objeto contendr una variable. En este ejemplo, el

249

argumento Critter es declarado As Object, de manera que en tiempo de ejecucin puede contener una referencia a cualquier tipo de objeto como Car o Rock. Dado que no puede decir qu tipo de objeto ser, Visual Basic compila algn cdigo extra para preguntar al objeto si soporta el mtodo que haya llamado. Si el objeto soporta el mtodo, este cdigo extra lo invoca; si no, el cdigo extra invoca un error. Cada llamada a mtodo o propiedad incurre en este funcionamiento adicional. Por contraste, las interfases permiten early binding. Cuando Visual Basic conoce en tiempo de compilacin qu interfase est siendo llamada, puede chequear el tipo de librera para ver si esa interfase soporta el mtodo. Visual Basic despus puede compilar en un salto directo al mtodo, usando una funcin de tabla virtual (vtable). Esto es muchas veces ms rpido que late binding. Ahora suponga que los mtodos Move y Bite pertenecen a una interfase Animal, y que todas las clases animal implementan esta interfase. El argumento Critter puede ahora ser declarado As Animal, y los mtodos Move y Bite sern early bound: Public Sub GetFood (ByVal Critter As Animal, _ ByVal Food As Object) Dim dblDistance As Double cdigo para calcular la distancia a food (omitido): Critter.Move dblDistance early bound (vtable) Critter.Bite Food early bound (vtable) End Sub Para mayor informacin: Creacin e implementacin de una interfase crea una interfase Animal y la implementa en las clases Flea y Tyrannosaur. Creando e implementando una interfase Como se explic en Cmo Visual Basic proporciona polimorfismo, una interfase es un juego de propiedades y mtodos. En el siguiente cdigo ejemplo, crea una interfase Animal y la implementa en dos clases, Flea y Tyrannosaur. Puede crear la interfase Animal agregando un mdulo de clase a su proyecto, nombrndolo Animal, e insertando el siguiente cdigo: Public Sub Move (ByVal Distance As Double) End Sub Public Sub Bite (ByVal What As Object) End Sub Observe que no existe cdigo para estos mtodos. Animal es una clase abstracta, no contiene cdigo de implementacin. Una clase abstracta no tiene por propsito la creacin de objetos su propsito es proporcionar una plantilla para una interfase que agrega a otras clases. (Aunque algunas veces es til implementar la interfase de una clase que no sea abstracta; esto es discutido despus en este tpico). Nota: Hablando apropiadamente, una clase abstracta es una cosa a partir de la cual no puede crear objetos. Puede siempre crear objetos a partir de las clases de Visual Basic, an cuando no contengan cdigo; en este caso ellas no son verdaderamente abstractas. Ahora se agregan dos mdulos de clases adicionales, nombrando uno Flea, y al otro Tyrannosaur. Para implementar la interfase Animal en la clase Flea, usa la declaracin Implements: Option Explicit Implements Animal Tan pronto como agrega esta lnea de cdigo, puede dar clic en la ventana de la izquierda de la ventana de cdigo. Una de sus entradas ser Animal. Cuando la selecciona, en la ventana de la derecha mostrar los mtodos de la interfase Animal.

250

Seleccione cada mtodo, para crear plantillas de procedimientos vacas para todos los mtodos. Las plantillas tendrn los argumentos y tipos de datos correctos, como fueron definidos en la clase Animal. Cada nombre de procedimiento tendr como prefijo Animal_ para identificar la interfase. Importante: una interfase es como un contrato. A travs de la implementacin de la interfase, una clase acuerda responder cuando cualquier propiedad o mtodo de la interfase sea invocado. Por lo tanto, debe implementar todas las propiedades y mtodos de una interfase. Ahora puede agregar el siguiente cdigo a la clase Flea: Private Sub Animal_Move (ByVal Distance As Double) cdigo para saltar cierto nmero de pulgadas omitido: Debug.Print Flea moved End Sub Private Sub Animal_Bite (ByVal What As Object) cdigo para chupar sangre omitido: Debug.Print Flea bit a & TypeName (What) End Sub Puede preguntarse por qu los procedimientos son declarados privados. Si fueran pblicos, los procedimientos Animal_Jump (es Animal_Move) y Animal_Bite seran parte de la interfase Flea, y estaramos empantanados en donde originalmente estuvimos, de forma que declarando el argumento Critter como As Object podr contener ya sea Flea o Tyrannosaur. Mltiples interfases La clase Flea ahora tiene dos interfases: la interfase Animal que acaba de implementar, que tiene dos miembros, y la interfase Flea por defecto, que no tiene miembros. Ms adelante en este ejemplo agregar un miembro a una de las interfases por defecto. Puede implementar la interfase Animal en forma similar para la clase Tyrannosaur: Option Explicit Implements Animal Private Sub Animal_Move (ByVal Distance As Double) cdigo para saltar unas yardas omitido: Debug.Print Tyrannosaur moved End Sub Private Sub Animal_Bite (ByVal What As Object) cdigo para tomar una libra de carne omitido: Debug.Print Tyrannosaur bit a & TypeName(What) End Sub Ejercitando al Tyrannosaur y el Flea Agregue el siguiente cdigo al evento Load de Form1: Private Sub Form_Load ( ) Dim fl As Flea Dim ty As Tyrannosaur Dim anim As Animal Set fl = New Flea Set ty = New Tyrannosaur primero dar un disparo al piojo: Set anim = fl Call anim.Bite(ty) el piojo pica al dinosaurio. ahora el dinosaurio tiene su oportunidad: Set anim = ty Call anim.Bite(fl) el dinosaurio muerde al piojo. End Sub

251

Pulse F8 para ver el cdigo paso a paso. Note el mensaje en la ventana inmediata. Cuando la variable anim contiene una referencia a Flea, la implementacin Flea de Bite es invocada, y de igual forma para el Tyrannosaur. La variable anim puede contener una referencia para cualquier objeto que implemente la interfase Animal. En realidad, puede contener solamente referencias a tales objetos. Si intenta un objeto Form o PictureBox a un anim, ocurrir un error. El mtodo Bite es early bound cuando lo llama a travs de anim, porque Visual Basic conoce en tiempo de compilacin que cualquier objeto asignado a anim tendr el mtodo Bite. Pasando Tyrannosaur y Flea a procedimientos Recuerde el procedimiento GetFood de Cmo Visual Basic proporciona polimorfismo? Puede agregar una segunda versin del procedimiento GetFood el que ilustra polimorfismo para Form1, y sustituya el cdigo del evento Load con lo siguiente: Private Sub Form_Load ( ) Dim fl As Flea Dim ty As Tyrannosaur Set fl = New Flea Set ty = New Tyrannosaur el piojo se cena al dinosaurio: Call GetFood(fl, ty) y viceversa: Call GetFood(ty, fl) End Sub Ejecutando este cdigo paso a paso muestra cmo una referencia objeto que pasa un argumento de otro tipo de interfase es convertido en una referencia de una segunda interfase (en este caso, Animal). Lo que sucede es que Visual Basic interpela al objeto a que encuentre si soporta la segunda interfase. Si el objeto la soporta, regresa una referencia a la interfase, y Visual Basic sita esa referencia en la variable argumento. Si el objeto no soporta la segunda interfase, ocurre un error. Implementado mtodos que regresan valores Suponga que el mtodo Move retorna un valor. Despus de todo, sabe cundo desea hacer que el Animal se mueva, pero un espcimen individual puede no estar apto para moverse tan lejos. Puede ser viejo y decrpito, o puede haber una pared en el camino. El valor de retorno del mtodo Move puede usarse para decirle cun largo en realidad el Animal se ha movido. Public Function Move (ByVal Distance As Double) As Double End Function Cuando implementa este mtodo en la clase Tyrannosaur, asigna el valor de retorno al nombre del procedimiento, justo como lo hara con cualquier otro procedimiento de funcin: Private Function Animal_Move(ByVal Distance _ As Double) As Double Dim dblDistanceMoved As Double cdigo para calcular cunto puede saltar (basado en edad, estado de salud, y obstculos) es omitido. Este ejemplo asume que el resultado ha sido situado en la variable dblDistanceMoved). Debug.Print Tyrannosaur moved; dblDistanceMoved Animal_Move = dblDistanceMoved End Function Para asignar el valor de retorno, use el nombre de procedimiento completo, incluyendo el prefijo de la interfase. Para mayor informacin: Las interfases que implementa pueden tener propiedades y mtodos. Implementando Propiedades describe algunas diferencias en la forma en que las propiedades son implementadas. Implementando propiedades

252

Este tpico contina el ejemplo de cdigo iniciado en Creando e implementando una interfase, agregando propiedades a la interfase Animal que fue implementada en las clases Flea y Tyrannosaur. Es til que lea ese tpico antes de comenzar ste. Supngase que da a la clase Animal la propiedad Age, agregando una variable pblica en la seccin de declaraciones: Option Explicit Public Age As Double La ventana de procedimientos de la ventana cdigo para las clases Tyrannosaur y Flea ahora contienen procedimientos de propiedad para implementar la propiedad Age. Esto ilustra el punto hecho en Agregando propiedades a una clase anteriormente en este captulo. Usando una variable pblica para implementar una propiedad es estrictamente para conveniencia del programador. Detrs de escenas, Visual Basic implementa la propiedad como un par de procedimientos de propiedad. Debe implementar ambos procedimientos. Los procedimientos de propiedad son fcilmente implementados almacenando el valor en un miembro de dato privado, como se muestra aqu: Private mdbAge As Double Private Property Get Animal_Age ( ) As Double Animal_Age = mdbAge End Property Private Property Let Animal_Age (ByVal RhsVal As Double) MdbAge = RhsVal End Property El miembro de dato privado es un detalle de la implementacin, de forma que debe agregarlo Usted. Nota: Cuando Implements proporciona las plantillas para PropertySet o PropertyLet, no tiene forma de determinar el nombre del ltimo argumento, as que sustituye el nombre RhsVal, como se muestra en el cdigo ejemplo anterior. No existe validacin de datos en una propiedad implementada como miembro de dato pblico, pero esto no significa que no pueda agregar cdigo a PropertyLet para Animal_Age. Por ejemplo, podra desear restringir los valores de edades apropiadas para Tyrannosaur y Flea, respectivamente. En realidad, esto muestra la independencia de interfase e implementacin. Tan pronto como la interfase coincide con la descripcin del tipo de librera, la implementacin puede ser cualquier cosa. Antes de continuar con el siguiente paso, remueva la implementacin de la propiedad Age de solo lectura de ambos mdulos de clase. Implementando propiedades de solo lectura (Read Only) Desde luego, permitir que la edad de un animal pueda ser puesta en forma arbitraria es un diseo de objetos malo. El objeto debe conocer su edad y proporcionarla al usuario como una propiedad de solo lectura. Remueva la variable pblica Age de la clase Animal, y agregue una plantilla para una propiedad Age de solo lectura, como esta: Public Property Get Age ( ) As Double End Property Ahora, en la ventana de cdigo, parte de procedimientos, para las clases Tyrannosaur y Flea contienen solamente una entrada, Age (ProperyGet). Puede implementar esto para el Tyrannosaur como sigue: Private mdbBirth As Double Private Property Get Animal_Age ( ) As Double Animal_Age = Now mdbBirth End Property El cdigo anterior regresa la edad del Tyrannosaur en das. Puede poner mdbBirth en el evento Initialize de la clase Tyrannosaur como aqu: Private Sub Class_Initialize ( )

253

MdbBirth = Now End Sub Y, desde luego, puede retornar el valor de la propiedad en ms comnmente usadas unidades, tales como dog days. Para mayor informacin: Hemos estado hablando de interfases y objetos como si fuesen la misma cosa, aparentando poner referencias a objetos dentro de una variable objeto, y referencias a interfases dentro de otras. Se aclara esta materia en Tiempo para una breve discusin sobre objetos e interfases. Traduccin: Derechos de Autor: RBsoftware (2001) Lunes, 14 de mayo 2001. 06:31pm. Archivo: Traduccin VB30. Tiempo para una breve discusin sobre objetos e interfases Este tpico completa el cdigo de ejemplo iniciado en Creando e implementando una interfase y continuado en Implementando propiedades. Encontrar de utilidad leer estos tpicos antes de comenzar ste. El cdigo ejemplo del Tyrannosaur y Flea parecen operar con rapidez y conveniencia con interfases y objetos. Referencias a objetos son asignadas a una variable objeto, y las referencias a interfases son asignadas a otra. En realidad, todas las referencias son referencias objeto. Una referencia a una interfase es tambin una referencia al objeto que implementa la interfase. An ms, un objeto puede tener interfases mltiples, pero en el fondo todava es el mismo objeto. En Visual Basic, cada clase tiene una interfase por defecto que tiene el mismo nombre que la clase. Bien, casi el mismo. Por convencin, el carcter de subrayado es puesto como prefijo al nombre de la clase. El carcter subrayado indica que esta interfase est escondida dentro de una librera tipo. Por tanto la clase Tyrannosaur tiene una interfase por defecto llamada _Tyrannosaur. Dado que Tyrannosaur tambin implementa Animal, la clase tiene una segunda interfase llamada Animal. Sin embargo, en el fondo de todo esto, el objeto todava es Tyrannosaur. Site un botn de comando en Form1 y agregue el siguiente cdigo: Private Sub Command1_Click ( ) Dim ty As Tyrannosaur Dim anim As Animal Set ty = New Tyrannosaur Set anim = ty MsgBox TypeName (anim) End Sub Usted puede esperar que la caja de mensaje despliegue Animal pero en realidad despliega Tyrannosaur. Preguntando por interfases Cuando asigna un objeto Tyrannosaur a una variable de tipo Animal, Visual Basic pregunta al objeto Tyrannosaur si este soporta la interfase Animal. (El mtodo usado para esto es llamado QueryInterface, o QI por sus iniciales; podr algunas veces escuchar que QI es usado como verbo). Si la respuesta es no, ocurre un error. Si la respuesta es si, el objeto es asignado a la variable. Solamente los mtodos y propiedades de la interfase Animal pueden ser accedidos a travs de esta variable. Variables de objeto genrico e interfases Qu sucedera si asigna la referencia objeto a una variable objeto genrica, como lo muestra el cdigo siguiente?

254

Private Sub Command1_Click ( ) Dim ty As Tyrannosaur Dim anim As Animal Dim obj As Object Set ty = New Tyrannosaur Set anim = ty Set obj = anim MsgBox TypeName (obj) End Sub El resultado de nuevo es Tyrannosaur. Ahora, qu interfase adquiere cuando llama propiedades y mtodos a travs de la variable obj? Agregue el siguiente mtodo a la clase Tyrannosaur: Public Sub Growl ( ) Debug.Print Rrrrrr End Sub El mtodo Growl pertenece a la interfase por defecto del objeto Tyrannosaur. En el cdigo del botn de comando del evento clic, sustituya la declaracin MsgBox con las siguientes dos lneas de cdigo: Obj.Move 42 Obj.Growl Cuando ejecuta el proyecto y da clic al botn, la ejecucin se detiene en el mtodo Growl, con el error El objeto no soporta esta propiedad o mtodo. Claramente, la interfase es todava Animal. Esto es algo que se debe de tener en mente cuando se usen variables de tipo objeto con objetos que tienen interfases mltiples. La interfase que la variable acceder es la ltima interfase asignada. Por ejemplo: Private Sub Command1_Click ( ) Dim ty As Tyrannosaur Dim anim As Animal Dim obj As Object Set ty = New Tyrannosaur Set anim = ty Set obj = anim Obj.Move 42 no falla. Obj.Growl falla. Set obj = ty Obj.Move 42 falla. Obj.Growl no falla. End Sub Afortunadamente, existe muy poca razn para usar el ms lento, tipo de datos objeto late bound con objetos que tienen interfases mltiples. Una de las principales razones para usar interfases mltiples es para ganar la ventaja de early binding a travs de polimorfismo. Otras fuentes de interfases Los mdulos de clase de Visual Basic no son la nica fuente de interfase que puede implementar. Puede implementar cualquier interfase contenida en una librera tipo, siempre que esta interfase soporte Automation. Puede crear sus propios tipos de libreras de clases abstractas. Estos tipos de libreras pueden ser usadas en muchos proyectos, como se describe en Principios generales de diseo de componentes en Creando componentes ActiveX en Gua de herramientas de componentes. La utilidad MkTypLib (Make Type Library), que puede encontrarla en el directorio Tools, puede usarla para crear interfases. Usando interfases en su proyecto Para usar una interfase en su proyecto, de clic en References, en el men Project, para abrir la caja de dilogo References. Si el tipo de librera est registrado, aparecer en la lista de referencias, y podr ponerle una marca. Si la librera tipo no est en la lista, puede usar el botn Browse para encontrarla.

255

Una vez que tiene una referencia para la librera tipo, puede usar Implements para implementar cualquier interfase Automation que la librera tipo contenga. Para mayor informacin: No est limitado a implementar interfases abstractas. Las muchas interfases de re uso de cdigo describen cmo puede implementar una interfase y selectivamente re usar las propiedades y mtodos de la clase que proporciona la interfase. Las muchas interfases de re uso de cdigo Existen dos formas principales de re uso de cdigo binaria y fuente. El re uso del cdigo binario es logrado creando y usando un objeto, mientras que el re uso de cdigo fuente es logrado por herencia, la cual no es soportada por Visual Basic. (El re uso del cdigo fuente puede ser logrado copiando y modificando el cdigo fuente, pero esta tcnica no es nada nuevo, y tiene muchos bien conocidos problemas). Visual Basic ha sido pionero en el re uso del cdigo binario los controles han sido el ejemplo clsico. Re usa el cdigo de un control situando una instancia del control sobre el formulario. Esto es conocido como una relacin de contenedor o como una relacin tiene un, esto es, el formulario contiene o tiene un botn de comando. Para mayor informacin: La relacin de contenedor es discutida en Modelos objeto ms adelante en este captulo. Delegando a un objeto implementado Implements proporciona nuevos y poderosos medios de re uso de cdigo. Puede implementar una clase abstracta (como se describe en Creando e implementando una interfase) o puede implementar la interfase de una clase funcional llena. Puede crear el inner object (es decir, el objeto implementado) en el evento Initialize del outer object (es decir, el que implementa la interfase del objeto inner). Como se describe en Creando e implementando una interfase, una interfase es como un contrato debe implementar todos los miembros de la interfase del objeto inner en el mdulo de clase del objeto outer. Sin embargo, puede ser selectivo en la forma que delega las propiedades y mtodos del objeto inner. En un mtodo puede delegar directamente al objeto inner, pasando los argumentos sin cambio, mientras que en otro mtodo puede ejecutar algn cdigo propio antes de llamar al objeto inner y en un tercer mtodo puede ejecutar su propio cdigo, ignorando el objeto inner en su conjunto! Por ejemplo, suponga que tiene la clase OneManBand y la clase Cacophony, ambas generan sonidos. Desea agregar la funcionalidad de la clase Cacophony a la clase OneManBand, y re usar algo de la implementacin de los mtodos de la clase Cacophony. OneManBand implementa la interfase Cacophony: Implements Cacophony variable objeto para mantener la referencia: Private mcac As Cacophony Private Sub Class_Initialize ( ) crear el objeto: Set mcac = New Cacophony End Sub Ahora puede ir a la ventana de cdigo, en la parte objeto, y seleccionar Cacophony, y despus adquirir las plantillas de procedimientos de los mtodos de la interfase Cacophony. Para implementar estos mtodos, puede delegar al objeto Cacophony. Por ejemplo, el mtodo Beep se parecera a esto: Private Sub Cacophony Beep(By Val Frequency As Double, _ ByVal Duration As Double) delegar al objeto Cacophony inner: Call mcac.Beep(Frequency, Duration) End Sub

256

La implementacin anterior es bien simple. El objeto outer (OneManBand) delega directamente al inner (Cacophony), re usando el mtodo Beep del objeto Cacophony sin ningn cambio. Esto es algo bueno, pero es solo el comienzo. La declaracin Implements es muy poderosa para re uso de cdigo, porque brinda enorme flexibilidad. Puede decidir alterar los efectos del mtodo Beep de la clase OneManBand, insertando su propio cdigo antes (o despus) de la llamada al objeto Cacophony inner: Private Sub Cacophony_Beep (ByVal Frequency As Double, _ ByVal Duration As Double) golpear para todos una octava arriba: Frequency = Frequency * 2 basado en otra propiedad de la clase OneManBand, Stacatto, corte la duracin de cada sonido: If Stacatto Then Duration = Duration * 7 / 8 Call mcac.Beep(Frequency, Duration) incluso puede llamar a otros mtodos de OneManBand: If Stacatto Then Pause(Duration * 1 / 8) End Sub Para algunos de los mtodos, su implementacin puede delegar directamente al objeto Cacophony inner, mientras que para otros puede interponer su propio cdigo antes o despus de delegar y an omitir la delegacin en su conjunto, usando enteramente su propio cdigo para implementar un mtodo. En vista de que la clase OneManBand implementa la interfase Cacophony, puede usarla en cualquier aplicacin musical que llame a esa interfase. Los detalles de su implementacin estn escondidos para la aplicacin llamada, pero los sonidos resultantes son todos de su invencin. Nota: COM proporciona otro mecanismo de re uso de cdigo binario, llamado aggregation. En agreggation, una interfase entera es re usada, sin ningn cambio, y la implementacin es proporcionada por una instancia de la clase que est siendo agregada. Visual Basic no soporta esta forma de re uso de cdigo. No es esto tedioso? Escribir cdigo de delegacin puede verdaderamente convertirse en un tedio, especialmente si la mayora de los mtodos y propiedades del objeto outer simplemente delegan directamente a sus correspondientes propiedades y mtodos del objeto inner. Para esto puede usar el modelo Extensibility para crear su propio wizard de delegacin para automatizar la tarea, el cual es similar al Class Wizard. Para mayor informacin: El uso de polimorfismo e interfases mltiples en componentes de software es descrito en Principios generales de diseo de componentes en Creacin de componentes ActiveX en Gua de herramientas de componentes. El uso del modelo Extensibility es descrito en Extendiendo el ambiente de Visual Basic con Add-ins en Gua de herramientas de componentes. Fin: 508 pginas. Jueves, 17 de mayo del 2001. 03:26pm. Done! Programando con sus propios objetos Puede comenzar usando objetos de manera gradual, encontrando tareas tiles para las cuales la combinacin de cdigo y datos es una ventaja. Puede usar la funcionalidad de estos objetos declarando variables objetos, asignando nuevos objetos a ellas, y llamando a los mtodos y propiedades del objeto. A medida que agrega ms y ms objetos a sus programas, comenzar a ver la relacin entre ellos. Puede iniciar haciendo que el diseo de sus programas sea ms dependiente de objetos y de sus relaciones, y puede comenzar usando tcnicas ms robustas tales como la creacin de clases collection para expresar aquellas relaciones en cdigo.

257

En cierto momento, de repente ver cmo encadenar objetos cambia la naturaleza de su programa, y estar listo para iniciar el diseo de programas basados en objetos desde la base. Los siguientes tpicos proporcionan un repaso de estos cambios revolucionarios en su estilo de codificacin. Lalos ahora, para conocer de forma amplia lo que viene a continuacin, y lalos de nuevo cuando sus ideas sobre programacin basada en objetos comiencen a madurar. Referencias objeto y contador de referencias A medida que ms use objetos, ms necesitar manejar sus referencias objetos, para que su componente libere memoria cuando lo deba y se desactiva de forma ordenada. Modelos objeto Cmo los objetos que crea de sus clases se relacionan entre ellos? Los modelos objetos expresan sus relaciones en trminos de contenedor es decir, un tipo de objeto contiene uno o ms de otros tipos. Este es un principio de organizacin poderoso para sus programas. Creando sus clases collection propias Expone algunos problemas con el objeto collection de Visual Basic, y muestra cmo puede crear sus propias clases collection es decir, clases que delegan a un objeto collection (as, ganando la habilidad de trabajar con For EachNext) mientras que se proporciona incremento en la robustez y mayor funcionalidad. Para mayor informacin: Los componentes ActiveX abren otra dimensin de re uso de cdigo y programacin orientada a objetos. Puede comenzar a explorar esta dimensin a travs de Creacin de componentes ActiveX en Gua de herramientas de componentes. Referencias objeto y contador de referencias La primera regla para el tiempo de vida de un objeto es muy simple: Un objeto es destruido cuando la ltima referencia a l es destruida. Sin embargo, como muchas cosas en la vida, simple no siempre significa fcil. A medida que usa ms objetos, y mantiene ms variables conteniendo referencias a esos objetos, puede encontrar periodos en los que le parezca imposible hacer que sus objetos se vayan cuando lo desee. En cierto momento, necesitar que Visual Basic mantenga la pista de referencias objeto de otro modo, cmo sabr cundo la ltima referencia a un objeto fue liberada? Entonces comenzar a pensar que si pudiese tener acceso al contador de referencias de Visual Basic el rastreo sera sumamente fcil. Desdichadamente, esto no es cierto. Para hacer el uso de objetos ms eficiente, el modelo de objetos de componentes (COM) especifica un complejo nmero de atajos a sus reglas de contador de referencias. El resultado es que no puede confiar en los valores del contador de referencias an cuando tenga acceso a l. De acuerdo a las reglas COM, la nica informacin en que puede depender es si o no el contador de referencias es cero. Sabe cundo el contador de referencias llega a cero, porque el evento Terminate de sus objetos ocurren. Ms all de esto no existe ninguna informacin veraz a ser buscada en los contadores de referencias. Nota: El hecho de que no debe recordar el contador de referencias COM no es poca cosa. El manejo de contadores de referencias por uno mismo es mucho ms difcil que seguir la pista de cules variables objetos en su programa contienen referencias a objetos. Tip: Declare sus variables objetos como class types, en vez de As Object. De esta forma, si tiene un objeto Widget que no est terminando, las nicas variables por las que tiene que preocuparse son aquellas declaradas como As Widget. Para colecciones de referencias objeto, no use el objeto Collection de Visual Basic. Las referencias objeto en un objeto Collection de Visual Basic son almacenadas en variants las cuales, igual que las variables declaradas As Object, pueden guardar referencias de cualquier clase. En su lugar es preferible la creacin de collection classes propias que acepten objetos de una sola clase, como se describe en Creacin de sus propias

258

clases Collection. De esta forma, las nicas colecciones que necesita buscar para su objeto Widget son aquellas del tipo Widget. Organice sus objetos jerrquicamente, como se describe en Modelos objeto. Si todos sus objetos estn conectados, es fcil escribir un procedimiento que transite a travs de todo el modelo y reporte todos los objetos existentes. No declare variables As New. Ellas son como las cancelas de cumpleaos, se vuelven a encender despus que les ha lanzado un soplo: si usa una despus de haberla puesto en Nothing, Visual Basic obligatoriamente crea otro objeto. Para mayor informacin: Modelos objeto. Las referencias circulares son la clase ms difcil de desconectar limpiamente. Vea

Modelos objeto Una vez que ha definido una clase a travs de la creacin de un mdulo de clase y dndole propiedades y mtodos, puede crear cualquier nmero de objetos a partir de esa clase. Cmo mantiene la pista de los objetos que crea? La forma ms simple para seguir la pista de los objetos es declarar una variable objeto por cada objeto que planea crear. Desde luego, esto establece un lmite de los objetos que pude crear. Puede mantener mltiples referencias en un arreglo o en una coleccin, como se describe en Creacin de arreglos de objetos y Creacin de colecciones de objetos ya vistos en este captulo. Al comienzo, probablemente ubica variables objeto, arreglos y colecciones en formularios o en mdulos estndar, tal como lo hace con las variables ordinarias. Sin embargo, a medida que agrega ms clases, probablemente descubrir que los objetos que usa tienen una clara relacin entre ellos. Los modelos objeto expresan relaciones de contenedor Los modelos objeto dan la estructura a un programa basado en objetos. Definiendo las relaciones entre los objetos que usa en su programa, un modelo objeto organiza sus objetos de forma que hace la programacin ms fcil. Tpicamente un modelo objeto expresa el hecho de que algunos objetos son ms grandes o ms importantes que otros estos objetos se imaginan como contenedores de otros objetos, o que son conformados por otros objetos. Por ejemplo, puede crear el objeto SmallBusiness como el corazn de su programa. Desea que el objeto SmallBusiness tenga otros tipos de objetos asociados a l, tales como los objetos Employee y los objetos Customer. Probablemente desea tambin que contenga el objeto Product. Un modelo objeto para este programa se muestra a continuacin: Puede definir cuatro mdulos de clases, llamados SmallBusiness, Employee, Customer, y Product, y darle a

SmallBusiness

Employee Customer Product

cada uno de ellos apropiadas propiedades y mtodos, pero, cmo har las conexiones entre objetos? Tiene dos herramientas para este propsito: Propiedades objeto y el objeto Collection. El siguiente fragmento de cdigo le muestra una forma de implementar esta jerarqua.

259

cdigo para la seccin de declaraciones del mdulo de clase SmallBusiness: Public Name As String Public Product As New Product Public Employees As New Collection Public Customers As New Collection La primera vez que se refiera a la propiedad Product, el objeto ser creado, porque este fue declarado As New. Por ejemplo, el cdigo siguiente cdigo crea y establece el nombre y precio del objeto Product del objeto SmallBusiness. cdigo para un mdulo estndar: Public sbMain As New SmallBusiness Sub Main SbMain.Name = Velociraptor Enterprises, Inc. la primera vez que la variable Product es usada en cdigo, el objeto Product es creado. SbMain.Product.Name = Inflatable Velociraptor SbMain.Product.Price = 1.98 cdigo para inicializar y mostrar el formulario principal End Sub Nota: Implementar una propiedad objeto con variables pblicas es negligente. Podra inadvertidamente destruir el objeto Product poniendo la propiedad a Nothing en cualquier otro lado de su cdigo. Es mejor crear propiedades objeto como propiedades de solo lectura, como se muestra en el cdigo de fragmento siguiente: cdigo para una propiedad objeto ms robusta. El almacenamiento para la propiedad es privado, por tanto sta no puede ser puesta a Nothing fuera del objeto. Private mProduct As New Product Property Get Product ( ) As Product la primera vez que la propiedad es llamada, mProduct contiene Nothing, de forma que Visual Basic crea el objeto Product. Set Product = mProduct End If Relaciones de objetos de uno a muchos Las propiedades objeto trabajan bien cuando las relaciones entre objeto es uno a uno. Sin embargo, ocurre con frecuencia que un objeto de un tipo contiene determinado nmero de objetos de otro tipo. En el modelo objeto SmallBusiness, la propiedad Employees es implementada como un objeto Collection, de forma que el objeto SmallBusiness puede contener mltiples objetos Employee. El fragmento de cdigo siguiente muestra cmo nuevos objetos Employee pueden ser agregados a esta coleccin. Public Function NewEmployee(Name, Salary, HiereDate, _ ID) As Employee Dim empNew As New Employee EmpNew.Name = Name creacin de objeto implcita. EmpNew.Salary = Salary EmpNew.HireDate = HireDate agregarlo a la coleccin usando ID como clave: sbMain.Employees.Add empNew, CStr(ID) retornar una referencia al nuevo Employee: Set NewEmployee = empNew End Function La funcin NewEmployee podr ser llamada tantas veces como sea necesario para crear los empleados para el negocio representado por el objeto SmallBusiness. Los empleados existentes podrn ser listados en cualquier momento iterando sobre la coleccin Employees. Nota: De nuevo otra vez, esta no es una implementacin robusta. Una mejor prctica es crear su propia clase collection, y exponerlas como propiedades de solo lectura. Esto es descrito en Creacin de sus propias clases collection.

260

Tip: El utilitario Class Builder puede generar mucho del cdigo que necesita para implementar un modelo objeto. El Class Builder crea propiedades objeto robustas y clases collection, y permite ordenar su modelo con facilidad. Propiedades familiares Cuando tiene una referencia a un objeto, puede acceder a lo que contiene el objeto usando sus propiedades objeto y colecciones. Es tambin muy til para navegar por la jerarqua, y as obtener el objeto del cual tiene una referencia. La navegacin es usualmente hecha a travs de las propiedades familiares. La propiedad Parent regresa una referencia al contenedor del objeto. Para una descripcin de la navegacin del modelo objeto vea Modelos objeto de navegacin en Programando con componentes. Puede encontrar un ejemplo de la propiedad Parent en Agregando propiedades a las clases ya vista en este captulo. Tip: Cuando asigne una propiedad Parent a un objeto en una coleccin, no use una referencia al objeto Collection. El Parent real del objeto es el objeto que contiene la coleccin. Si la propiedad Parent apunta a la coleccin, tendr que usar dos niveles de direccionamiento para obtener el Parent real es decir, obj.parent.parent en vez de Employee Object obj.parent. Propiedades Parent, referencias circulares, y Object TearDown Uno de los problemas ms grandes con las Employee objects Parent property holds a propiedades Parent es que ellas crean referencias circulares. El objeto reference to the SmallBusiness object. ms largo contiene una referencia al objeto que contiene, y el objeto contenido tiene una referencia a travs de su propiedad Parent, creando un bucle como el que se muestra a continuacin:
SmallBusiness Object SmallBusiness Object Employee Collections holds a reference to each Employee object

Qu es lo que est malo en esta figura? La forma para desembarazarse de los objetos una vez que ya no se necesitan es liberar todas las referencias que existan hacia ellos. Asumiendo que la referencia al objeto SmallBusiness est en una variable llamada sbMain, como se vio anteriormente en este tpico, debe escribir el siguiente cdigo: Set sbMain = Nothing Desdichadamente, an existe una referencia al objeto SmallBusiness en realidad pueden existir muchas referencias, porque cada propiedad Parent del objeto Employee mantiene una referencia al objeto SmallBusiness. Dado que la coleccin Employee del objeto SmallBusiness mantiene una referencia para cada objeto Employee, ninguno de los objetos se logran destruirse. Mtodos TearDown Una solucin es darle al objeto SmallBusiness el mtodo TearDown. Este puede poner todas las propiedades objeto del objeto SmallBusiness a Nothing y tambin poner todos los objetos Collection (Employees, Customers) a Nothing. Cuando un objeto Collection es destruido, Visual Basic pone todas las referencias objetos que ha estado sosteniendo a Nothing. Si no existen otras referencias a los objetos Employee y Customer que estuvieran contenidas en las colecciones Employees y Customers, ellos sern destruidos.

261

Desde luego, si el objeto Employee se estructura de objetos finos, tendr el mismo problema de referencia circular que tiene su pariente. En este caso, tendr que dar el mtodo TearDown a la clase Employee. En vez de solamente poner el objeto Collection Employee a Nothing, el objeto SmallBusiness primero tendr que iterar dentro de la coleccin, llamando el mtodo TearDown por cada objeto Employee. An no terminamos An as no todos los objetos pueden ser destruidos. Si existen variables en cualquier lado de su programa que todava contienen referencias al objeto SmallBusiness, o hacia cualquiera de los objetos que contiene, aquellos objetos no sern destruidos. Parte de la limpieza de su programa ser asegurarse que todas las variables objetos en cualquier lado sean puestas a Nothing. Para comprobar si esto est ocurriendo, debe agregar a sus objetos cierto cdigo de rastreo. Por ejemplo, puede agregar el siguiente cdigo a un mdulo estndar: Global debug collection Public gcolDebug As New Collection global function to give each object a unique ID. Public Function DebugSerial ( ) As Long Static lngSerial As Long LngSerial = lngSerial + 1 DebugSerial = lngSerial End Function En cada mdulo de clase, puede poner el siguiente cdigo. Cada clase proporciona su propio nombre en donde aparecer Product: storage for the debug ID. Private mlngDebugID As Long Property Get DebugID ( ) As Long DebugID = mlngDebugID End Property Private Sub Class_Initialize ( ) MlngDebugID = DebugSerial add a string entry to the global collection. GcolDebug.Add Product Initialize; DebugID= _ & DebugID, Cstr (DebugID) End Sub Private Sub Class_Terminate ( ) remove the string entry, so you know the object isnt around any more. GcolDebug.Remove CStr (DebugID) End Sub A medida que cada objeto es creado, sita una cadena en la coleccin global; a medida que es destruida remueve la cadena. En cualquier momento, puede iterar en la coleccin global para ver qu objetos no han sido destruidos. Para mayor informacin: Los modelos objetos asumen nueva importancia y una nueva clase de diferentes problemas, en la creacin de componentes ActiveX. Vea Principios generales del diseo de componentes en Gua de herramientas de componentes. Creando sus propias clases Collection Existen tres accesos generales que puede implementar para contenedores objeto usando colecciones. Considere la coleccin Employee del objeto SmallBusiness descrito en Modelos objeto. Para implementar esta coleccin debe: En el mdulo de clase SmallBusiness, declare una variable Employee como As Collection, y hgala pblica. Esta es la solucin ms barata. En el mdulo de clase SmallBusiness, declare una variable mcolEmployee como As Collection, y hgala privada. D al objeto SmallBusiness un juego de mtodos para borrar y agregar objetos. Este es el mnimo del orientado-a-objetos de los tres diseos.

262

Implemente su propia clase coleccin, creando un mdulo de clase coleccin con el nombre Employees, como se describe ms adelante en este captulo. D al objeto SmallBusiness una propiedad Read-Only de la clase Employees.

Las estrategias son listadas en orden de incremento de robustez. Ellas pueden ser caracterizadas como la casa de paja, la casa de palos, y la casa de ladrillos. Ejemplo Public Collection: La Casa de Paja El objeto coleccin de mucha flexibilidad traiciona puede poner cualquier cosa en una Collection, incluyendo el lavadero de la cocina. Ejemplo Private Collection: La Casa de Palos Puede lograr cierta robustez haciendo al objeto coleccin privado, pero pierde la habilidad de usar For EachNext con la coleccin. Creacin de su propia clase Collection: La Casa de Ladrillos La creacin de su propia clase coleccin le brinda la robustez de la encapsulacin, y como bono obtiene la habilidad del uso de For EachNext. Los beneficios del buen diseo orientado-a-objetos Las clases collection conducen a un cdigo ms limpio y seguro. Ejemplo Public Collection La Casa de Paja

Add Nombre lstEmployees Delete Salario Refresh List Trouble Close


Para crear el ejemplo, abra un nuevo proyecto e inserte dos mdulos de clases. Dibuje cinco botones de comando, un ListBox, dos TextBox, y dos Label, en un formulario, como se muestra en la siguiente figura: La siguiente tabla lista los valores de propiedades que necesita establecer para este ejemplo: Objeto Propiedad Valor Class Module Name Employee Class Module Name SmallBusiness Form Caption Employees Collection Command1 Caption Add Name CmdAddEmployee Command2 Caption Delete Name CmdDeleteEmployees Command3 Caption Refresh List Name CmdListEmployees Command4 Caption Trouble Name CmdTrouble Command5 Caption Close Name CmdClose Label1 Caption Name

263

Label2 TextBox1 TextBox2 ListBox

Caption Name Text Name Text Name

Salary TxtName Blank TxtSalary Blank lstEmployees

En el mdulo de clase Employee, agregue las siguientes declaraciones y procedimientos de propiedad: Option Explicit propiedades de la clase Employee: Public Name As String Public Salary As Long datos privados para propiedad ID escrbase-una-vez: Private mstrID As String Property Get ID ( ) As String ID = mstrID End Property la primera vez que la propiedad ID es puesta, el campo booleano se activa. Las llamadas siguientes no hacen nada: (sera mejor marcar un error) Property Let ID (strNew As String) Static blnAlreadySet As Boolean If Not blnAlreadySet Then BlnAlreadySet = True MstrID = strNew End If End Property La propiedad ID es la llave para acceder o borrar el objeto Employee de la coleccin, de manera que debe ser establecido una vez y jams cambiado. Esto es llevado a efecto con la variable esttica booleana que es puesta en True la primera vez que la propiedad es establecida. La propiedad puede ser siempre leda, porque ah existe un Property Get. En el mdulo de clase SmallBusiness, agregue la siguiente declaracin. El objeto coleccin ser creado la primera vez que la variable Employee sea referida en cdigo. Option Explicit Public Employees As New Collection El formulario hace todo el trabajo Todo el cdigo restante va en el mdulo del formulario. Agregue la siguiente declaracin en la seccin de declaraciones: Option Explicit Public sbMain As New SmallBusiness El cdigo en el evento clic de cmdEmployeeAdd_Click agrega un miembro a la coleccin: Private Sub cmdEmployeeAdd_Click ( ) Dim empNew As New Employee Static intEmpNum As Integer el uso de With hace su cdigo ms rpido y ms conciso: .ID vs empNew.ID) with empNew genera un nico ID para el nuevo empleado: intEmpNum = intEmpNum + 1 .ID = E & Format$ (intEmpNum, 00000) .Name = textName.Text .Salary= CDbl (txtSalary.Text)

264

agregue la referencia objeto Employee a la coleccin, usando la propiedad ID como llave: sbMain.Employee.Add empNew, .ID End With TextName.Text = TxtSalary.Text = de clic al botn Refresh List: cmdListEmployees.Value = True End Sub El cdigo en el procedimiento de evento cmdListEmployees_Click usa una declaracin For Each Next para agregar toda la informacin de los empleados al control ListBox. Private Sub cmdListEmployees_Click ( ) Dim emp As Employee LstEmployees.Clear For Each emp In sbMain.Employees LstEmployees.AddItem emp.ID & , & emp.Name _ & , & emp.Salary Next End Sub El evento cmdEmployeeDelete_Click usa el mtodo Remove del objeto Collection para borrar el miembro de la coleccin actualmente seleccionado en el control ListBox: Private Sub cmdEmployeeDelete_Click ( ) asegurarse que existe un empleado seleccionado: if lstEmployees.ListIndex > -1 Then los primeros seis caracteres son el ID: sbMain.Employees.Remove Left (lstEmployees.Text, 6 ) End If da clic al botn Refresh List: cmdListEmployees.Value = True End Sub Agregue el siguiente cdigo al botn Trouble: Private Sub cmdTrouble_Click ( ) sabes qu? SbMain.Employees.Add Me End Sub El evento cmdClose_Click cierra la aplicacin. Cuando cierra proyectos que usan objetos, hgalo descargando todos los formularios, para asegurar que ningn procedimiento de evento Terminate en sus mdulos de clases ser ejecutado. Por contraste, usando la declaracin End detiene el programa en forma abrupta, sin ejecutar los eventos Terminate. Private Sub cmdClose_Click Unload Me End Sub Para agregar empleados al ejemplo, ejecute la aplicacin, entre valores en los dos TextBox, y luego ejecute el botn Add. Agregue algunos empleados, y experimente con los botones Delete y List. Robusta como una casa de paja Esta simple implementacin no es muy robusta. Porque la propiedad Employees es justamente un objeto Collection pblico, puede inadvertidamente accederlo a partir de cualquier parte del programa. Adems, el mtodo Add del objeto Collection no hace ningn tipo de chequeo. Por ejemplo, el cdigo en el evento Click del Botn Trouble graciosamente inserta una referencia objeto al formulario dentro de la coleccin de los empleados.

265

D click al botn Trouble, ver que no ocurre error. Ahora d click al botn Refresh List. Cuando el bucle For Each Next encuentra un tipo de objeto no esperado, causa el error 13, Type Mismatch. Este es un ejemplo del tipo de error al cual se expone cuando construye modelos objeto con objetos Collection pblicos. Los objetos pueden ser agregados desde cualquier parte del proyecto, y no existe garanta de que ellos sern apropiadamente inicializados. Si un programador copia el cdigo de agregar un empleado, y el cdigo original es cambiado con posterioridad, los errores resultantes sern muy difciles de rastrear. Para mayor informacin: El ejemplo comenzado en este captulos es continuado en Ejemplo Private Collection: La Casa de Palos. Ejemplo Private Collection La Casa de Palos Este tpico contina el cdigo ejemplo iniciado en Ejemplo Public Collection: La Casa de Paja. Lea este tpico antes de iniciar el presente. Una forma de hacer ms robusto el medio de enlazar los objetos Employee con el objeto SmallBusiness es hacer el objeto Collection privado. Para este ejemplo, usar el formulario y la mayora del cdigo usado en el ejemplo Public Collection. El mdulo de clase Employee no sufre cambio. Sin embargo, el mdulo de clase SmallBusiness se modifica enteramente. Sustituya la declaracin del objeto Collection pblico con la siguiente declaracin, y agregue los siguientes procedimientos Sub y de funcin descritos en los siguientes prrafos. Option Explicit Private mcolEmployees As New Collection Como antes, el cdigo que agrega un empleado hace la mayora del trabajo. Puede tomar el bloque de cdigo entre las lneas con guiones y extraerlas del evento cmdEmployeeAdd_Click del ejemplo previo). El cambio importante es que el mtodo Add del objeto Collection no podr ser llamado de cualquier lugar del programa porque colEmployees es privado. Puede solamente agregar un objeto Employee usando el mtodo EmployeeAdd, el cual correctamente inicializa el nuevo objeto: mtodo de la clase SmallBusiness: Public Function EmployeeAdd (ByVal Name As String, _ ByVal Salary As Double) As Employee ----------------------------------------------------Dim empNew As New Employee Static intEmpNum As Integer usando With hace que su cdigo sea ms rpido y ms conciso: (.ID vs. EmpNew.ID). With empNew genera un nico ID para el nuevo empleado: intEmpNum = intEmpNum + 1 .ID = E & Format$ ( intEmpNum, 00000) .Name = Name .Salary = Salary agrega la referencia objeto Employee a la coleccin, usando la propiedad ID como llave: ---------------------------------------------------------mcolEmployees.Add empNew, .ID End With retorna una referencia al nuevo Employee: Set EmployeeAdd = empNew End Function

266

El mtodo EmployeeAdd retorna una referencia al recin agregado objeto Employee. Esta es una buena prctica, porque tan pronto como crea un objeto casi siempre desear hacer algo con l. Los mtodos EmployeeCount, EmployeeDelete, y Employees, delegan a los mtodos correspondientes del objeto Collection. Delegacin significa que el objeto Collection har todo el trabajo. mtodos de la clase SmallBusiness: Public Function EmployeeCount ( ) As Long EmployeeCount = mcolEmployees.Count End Function Public Sub EmployeeDelete (ByVal Index As Variant) McolEmployees.Remove Index End Sub Public Function Employees (ByVal Index As Variant) As Employee Set Employees = mcolEmployees.Item (Index) End Function Nota: Puede agregar funcionalidad extra a estos mtodos. Por ejemplo, puede generar sus propios errores si un ndice es invlido. El ltimo mtodo es Trouble. Este mtodo atenta agregar un objeto Employee no inicializado a la coleccin. Sabe qu suceder? mtodo de la clase SmallBusiness: Public Sub Trouble ( ) Dim x As New Employee McolEmployees.Add x End Sub Cambios al formulario Tendr que hacer unos pocos cambios al mdulo de formulario. Puede usar las mismas declaraciones a nivel de mdulo usadas en el ejemplo previo, el evento Click del botn Close es el mismo, pero los otros procedimientos de eventos tienen cambios el cdigo del botn Add es ms corto, mientras que el cdigo de los botones Delete y List Employees han cambiado un poco pero en forma significativa: Private Sub cmdEmployeeAdd_Click ( ) SbMain.EmployeeAdd textName.Text, txtSalary.Text TxtName.Text = TxtSalary.Text = CmdListEmployees.Value = True End Sub Private Sub cmdEmployeeDelete_Click ( ) asegurarse de que exista un empleado seleccionado: If lstEmployees.ListIndex > -1 Then los primeros seis caracteres son el ID: sbMain.EmployeeDelete Left (lstEmployees.Text, 6) End If CmdListEmployees.Value = True End Sub Private Sub cmdListEmployees_Click ( ) Dim lngCt As Long LstEmployees.Clear For lngCt = 1 To sbMain.EmployeeCount With sbMain.Employees(lngCt) LstEmployees.AddItem .ID & , & .Name _ & , & .Salary End With Next End Sub

267

Pero qu es todo este cdigo extra en cmdEmployees_Click? Desafortunadamente, en pago de la robustez ha tenido que entregar la habilidad del uso de For Each Next para iterar a travs de los elementos en la coleccin, porque el objeto Collection es ahora declarado privado. Si agrega el siguiente cdigo obtendr un error: no trabajar porque Employees no es realmente una coleccin: For Each emp in sbMain.Employees Afortunadamente, el mtodo EmployeeCount puede ser usado para delimitar el rango de la iteracin. El botn Trouble cambia un poco, tambin, pero todava sigue siendo un problema. Private Sub cmdTrouble_Click ( ) SbMain.Trouble End Sub Ejecute el proyecto y experimente con los botones Add, Delete y Refresh List. Todo trabaja como antes. Cuando da click al botn Trouble, de nuevo no se genera un error. Sin embargo, si ahora da click al botn Refresh List, podr ver que un objeto Employee no inicializado ha sido agregado a la coleccin de cierta forma. Cmo puede ser esto? Haciendo que el objeto Collection sea privado, lo protege de todo el cdigo en su programa que se encuentre fuera del objeto SmallBusiness, pero no del cdigo dentro. El objeto SmallBusiness podr ser largo y complejo, con una gran porcin de cdigo en l. Por ejemplo, podra tener mtodos tales como CustomerAdd, ProductAdd, y dems. Un error de codificacin, o la creacin de un duplicado del mtodo EmployeeAdd, puede an resultar en datos errneos an de objetos invlidos siendo insertados dentro de la coleccin, porque la variable privada es visible a travs del mdulo de clase. Para mayor informacin: Este ejemplo es continuado en Creacin de su propia clase Collection: La Casa de Ladrillos. Creacin de su propia clase Collection La Casa de Ladrillos Este tpico contina el cdigo ejemplo iniciado en Ejemplo Public Collection: La Casa de Paja y Ejemplo Private Collection: La Casa de Palos. Se sugiere leer estos tpicos antes de comenzar ste. La forma ms robusta para implementar una coleccin es hacerlo a travs de un mdulo de clase. En contraste con los ejemplos precedentes, mover todo el cdigo para la creacin de objeto dentro de la clase coleccin observa buenos principios en el diseo de objetos. Este ejemplo usa el mismo formulario y el mismo mdulo de clase Employee como los ejemplos precedentes. Inserte un nuevo mdulo de clase y establezca su propiedad Name a Employees. Inserte las siguientes declaraciones y cdigo dentro del nuevo mdulo de clase. Option Explicit Private mcolEmployees As New Collection Los mtodos Add, Count, y Delete, de la clase Employee son esencialmente los mismos de la vieja clase SmallBusiness. Puede removerlos del mdulo de clase SmallBusiness y copiarlo dentro del mdulo de clase Employees, y cambiar sus nombres. Los nombres deben cambiarse porque no ser necesario distinguir entre EmployeeAdd y CustomerAdd. Cada clase coleccin que implementa tiene sus propio mtodo Add. mtodo de la clase Collection Employee: Public Function Add(ByVal Name As String, _ ByVal Salary As Double) As Employee Dim empNew As New Employee

268

Static intEmpNum As Integer el uso de With hace su cdigo ms rpido y ms conciso. (.ID vs. EmpNew.ID). With empNew generar ID nico para el nuevo empleado: intEmpNum = intEmpNum + 1 .ID = E & Format$(intEmpNum, 00000) .Name = Name .Salary = Salary agregue la referencia objeto Employee a la coleccin usando la propiedad ID como llave. McolEmployees.Add empNew, .ID End With retornar una referencia al nuevo Employee. Set Add = empNew End Function Public Function Count ( ) As Long Count = mcolEmployees.Count End Function Public Sub Delete (ByVal Index As Variant) McolEmployees.Remove Index End Sub El mtodo Employees del objeto SmallBusiness se convierte en el mtodo Item de la clase Collection. Este delega al objeto Collection, con el objeto de recuperar miembros por ndice o por llave. Traduccin: Derechos de Autor: RBsoftware (2001) Mircoles, 30 de mayo del 2001. 10:43pm. Archivo: Traduccin VB31. Respondiendo a eventos del ratn y del teclado Sus aplicaciones Visual Basic pueden responder a una variedad de eventos del ratn y del teclado. Por ejemplo, formularios y controles PictureBox e Image, pueden detectar la ubicacin del apuntador del ratn, pueden determinar si el botn derecho o izquierdo del ratn est siendo presionado, y pueden responder a diferentes combinaciones de botones del ratn y de las teclas SHIFT, CTRL, o ALT. Usando eventos de teclado puede programar controles y formularios para responder a varias acciones de teclado o interpretar y procesar caracteres ASCII. Adicionalmente, las aplicaciones Visual Basic pueden soportar tanto event-driven drag-and-drop como las caractersticas OLE drag-and-drop. Puede usar el mtodo Drag con ciertas propiedades y eventos para permitir operaciones tales como controles para dragging and dropping. OLE drag and drop le otorga a sus aplicaciones todo el poder que necesita para intercambiar datos a travs del ambiente Windows y mucho de esta tecnologa est disponible sin escribir cdigo. Puede tambin usar el ratn o el teclado para manejar el procesamiento de largas tareas, lo que permite al usuario cambiarse en el nterin a otras aplicaciones o interrumpir el procesamiento. Otras acciones y eventos que involucran al ratn y al teclado (los eventos Click y DblClick, los eventos Focus y el evento Scroll) no son cubiertos en este captulo. Para mayor informacin de los eventos Click y DblClick, vea los tpicos Dndole clic a los botones para ejecutar acciones y Entendiendo el enfoque en Formularios, controles y mens, y vea El evento Click y El evento DblClick en Language Reference en Books Online. Tambin vea El evento Scroll. Tpicos Respondiendo a los eventos del ratn Cmo usar los eventos MouseDown, MouseUp, MouseMove, para controlar o mejorar las acciones del ratn.

269

Detectando los botones del ratn Cmo detectar los estados del botn del ratn usando el argumento button. Detectando los estados SHIFT, CTRL, ALT Cmo detectar los varios botones del ratn y los estados de las teclas SHIFT, CTRL, ALT, usando el argumento Shift. Dragging and Dropping Permitir event-driven drag-and-drop dentro de su aplicacin Visual Basic. OLE Drag and Drop Cmo usar esta poderosa tecnologa Windows para mover o copiar datos de un control a otro dentro de Visual Basic o desde Visual Basic hacia otras aplicaciones Windows o viceversa. Personalizando el apuntador del ratn Cambiar el apuntador del ratn para informar al usuario acerca del estado y funcionalidad de su aplicacin. Respondiendo a los eventos del teclado Cmo usar los eventos KeyDown, KeyUp y KeyPress para responder a varias acciones del teclado o interpretar y procesar caracteres ASCII. Interrumpir el procesamiento Manejo de tareas largas e intermitentes.

Respondiendo a los eventos del ratn Puede usar los eventos MouseDown, MouseUp, y MouseMove para permitir que su aplicacin responda tanto por el estado del ratn como por su ubicacin. (Esta lista excluye los eventos Drag, que son introducidos en Dragging and Dropping ms adelante en este captulo. Estos eventos del ratn son reconocidos por la mayora de los controles. Evento Descripcin MouseDown Ocurre cuando el usuario presiona cualquier botn del ratn. MouseUp Ocurre cuando el usuario suelta cualquier botn del ratn. MouseMove Ocurre cada vez que el apuntador del ratn es movido a un nuevo punto en la pantalla. Un formulario puede reconocer un evento de ratn cuando el apuntador est sobre una parte del formulario en donde no existen controles. Un control puede reconocer un evento de ratn cuando el apuntador est sobre el control. Cuando el usuario mantiene presionado el botn del ratn, el objeto contina reconociendo todos los eventos del ratn hasta que el usuario suelta el botn. Esto as es an cuando el apuntador es movido ms all del objeto. Los tres eventos del ratn usan los siguientes argumentos: Argumento Descripcin Button Un argumento de bit de campo en el cual los tres bits menos significativos muestran el estado de los botones del ratn. Shift Un argumento de bit de campo en el cual lo tres bits menos significativos muestran el estado de las teclas SHIFT, CTRL, ALT. X, y Ubicacin del apuntador del ratn, usando el sistema de coordenadas del objeto que recibe el evento del ratn. Un argumento de bit de campo retorna informacin en bits individuales, cada uno indicando si cierta condicin est encendida o apagada. Usando la notacin binaria, los tres bits de la izquierda se conocen como los ms significativos y los tres bits de la derecha se conocen como los menos significativos. Las tcnicas para programar con estos argumentos son descritas en Detectando los botones del ratn y Detectando los estados de SHIFT, CTRL, ALT ms adelante en este captulo. El evento MouseDown MouseDown es el evento ms frecuentemente usado de los tres eventos del ratn. Puede ser usado para, por ejemplo, restablecer los controles en un formulario, o para crear efectos grficos. El evento MouseDown es disparado cuando el botn del ratn es presionado. Nota: Los eventos del ratn son usados para reconocer y responder a los varios estados del ratn como eventos separados y no deben ser confundidos con los eventos Click y DblClick. El evento Click es cuando el botn del ratn ha sido presionado y soltado, pero solamente como una sola accin un clic. Los eventos del

270

ratn tambin se diferencian de los eventos Click y DblClick en que ellos le permiten distinguir entre los botones del ratn izquierdo, derecho y medio y entre las teclas SHIFT, CTLR, ALT. Usando MouseDown con el mtodo Move El evento MouseDown es combinado con el mtodo Move para mover un botn de comando a una diferente ubicacin en un formulario. La nueva ubicacin es determinada por la posicin del apuntado del ratn: Cuando el usuario da clic en cualquier parte del formulario (excepto sobre el control), el control se mueve hacia la ubicacin del cursor. Un solo procedimiento, Form_MouseDown, ejecuta esta accin: Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Command1.Move X, Y End Sub El mtodo Move sita la esquina superior izquierda del control del botn de comando en la ubicacin del apuntador del ratn, indicado por los argumentos X y Y. Puede mejorar este procedimiento ubicando el centro del control a donde indique el apuntador del ratn: Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Comman1.Move (X Commnad1.Width / 2 ), _ (Y Command1.Height / 2) End Sub Usando MouseDown con el mtodo Line La aplicacin ejemplo Click-A-Line responde a un clic del ratn dibujando una lnea desde la ubicacin previa hasta la nueva ubicacin del apuntador del ratn. Esta aplicacin usa el evento MouseDown en el mtodo Line. Usando la siguiente sintaxis, el mtodo Line dibujar una lnea desde el ltimo punto dibujado hasta el punto (X2, Y2): Line (x2, y2). Click-A-Line usa un formulario en blanco con un procedimiento, Form_MouseDown: Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Line (X, Y) End Sub La primera lnea se inicia en la esquina superior izquierda, la cual es el origen por defecto. Despus, siempre que el botn del ratn sea presionado, la aplicacin dibuja una lnea recta extendindose desde la lnea previa hasta la ubicacin presente del apuntador del ratn. El resultado es una serie de lneas conectadas. El evento MouseMove El evento MouseMove ocurre cuando el apuntador del ratn es movido a travs de la pantalla. Ambos, formularios y controles, reconocen el evento MouseMove mientras el apuntador se encuentre dentro de sus fronteras. Usando MouseMove con el mtodo Line Los mtodos grficos pueden producir efectos muy diferentes cuando son usados en un procedimiento MouseMove en vez de un procedimiento MouseDown. Por ejemplo, en el tpico El evento MouseDown visto anteriormente en este captulo, el mtodo Line dibuj segmentos de lneas conectadas. En la aplicacin Scribble (garabato) descrita a continuacin, el mismo mtodo es usado en un procedimiento Form_MouseMove para producir una lnea curvada continua en vez de segmentos conectados. En la aplicacin Scribble, el evento MouseMove es reconocido cada vez que el apuntador del ratn cambia de posicin. El siguiente cdigo dibuja una lnea entre la ubicacin actual y la previa ubicacin.

271

Private Sub Form_MouseMove (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Line (X, Y) End Sub A como el procedimiento MouseDown, la lnea creada por el procedimiento MouseMove se inicia en la esquina superior izquierda. Cmo trabaja MouseMove Cuntas veces el evento MouseMove es invocado a la vez que el usuario mueve el apuntador a travs de la pantalla? O, puesto de otra forma, cuando mueve el apuntador desde la parte superior de la pantalla hasta la parte inferior de la misma, cuntas ubicaciones son involucradas? Visual Basic no necesariamente genera un evento MouseMove por cada pixel por donde pasa el ratn. El ambiente operativo genera un limitado nmero de mensajes de ratn por segundo. Para ver cun a menudo los eventos del ratn son en realidad reconocidos, puede mejorar la aplicacin Scribble con el siguiente cdigo de forma que esta dibuja un pequeo crculo en cada ubicacin en donde un evento MouseMove es reconocido. Private Sub Form_MouseMove (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Line (X, Y) Circle (X, Y), 50 End Sub Si ejecuta el cdigo anterior notar que si mueve con mayor rapidez el ratn, menos eventos MouseMove son reconocidos entre cualquiera de dos puntos. Cuando el usuario mueve el ratn con menos rapidez, los crculos se dibujan ms cercas unos de otros. El evento MouseUp El evento MouseUp ocurre cuando el usuario suelta el botn del ratn. MouseUp es un til compaero de los eventos MouseDown y MouseMove. El ejemplo que sigue ilustra cmo estos tres eventos pueden ser usados en conjunto. La aplicacin Scribble puede ser ms til si permite dibujar solamente cuando el botn del ratn es sostenido y pare de dibujar cuando se suelte el botn. Para lograr esto, la aplicacin tiene que responder a tres acciones: El usuario presiona el botn del ratn (MouseDown). El usuario mueve el apuntador del ratn (MouseMove). El usuario suelta el botn del ratn (MouseUp). MouseDown y MouseUp le dirn a la aplicacin que inicie y detenga el dibujo. Especifica esto creando una variable a nivel de formulario que representa el estado del dibujo. Teclee la siguiente declaracin en la seccin de declaraciones del mdulo de cdigo de formulario: Dim DrawNow As Boolean DrawNow representar dos valores: Verdadero para significar dibuje una lnea y Falso para significar no dibuje una lnea. Ya inicialmente las variables por defecto tienen valor cero (falso), la aplicacin se inicia con el dibujo apagado. Despus la primera lnea de los procedimientos MouseDown y MouseUp encienden y apagan el dibujo a travs de establecer el valor de la variable a nivel de formulario DrawNow:

272

Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) DrawNow = True CurrentX = X CurrentY = Y End Sub Private Sub Form_MouseUp (Button As Integer, _ Shift As Integer, X As Single, Y As Single) DrawNow = False End Sub El procedimiento MouseMove dibuja una lnea slo si DrawNow es verdadero. De otra forma, no toma ninguna accin: Private Sub Form_MouseMove (Button As Integer _ Shift As Integer, X As Single, Y As Single) If DrawNow Then Line (X, Y) End Sub Cada vez que el usuario presiona el botn del ratn, el procedimiento del evento MouseDown es ejecutado y el dibujo se enciende. Entonces como el usuario mantiene presionado el botn del ratn, el procedimiento de evento MouseMove es ejecutado en forma repetida en los puntos en que es arrastrado a travs de la pantalla. Observe que el mtodo Line omite el primer punto final (por ello se escribe el guin), lo que ocasiona que Visual Basic inicie la escritura en las actuales coordinadas del apuntador del ratn. Por defecto, las coordenadas de escritura corresponden al ltimo punto dibujado; las propiedades CurrentX y CurrentY del formulario sern borradas en el procedimiento Form_MouseDown. Detectando los botones del ratn Puede hacer sus aplicaciones ms poderosas escribiendo cdigo que responda en forma diferente a los eventos del ratn, dependiendo de qu botn es usado o cuando las teclas SHIFT, CTRL, ALT, sean pulsadas. Para proporcionar estas opciones, usa los argumentos Button y Shift con los procedimientos de eventos MouseDown, MouseUp, y MouseMove. Los eventos MouseDown, MouseUp, y MouseMove usan el argumento Button para determinar qu botn o botones estn presionados. El argumento Button es un argumento de bit de campo un valor en el cual cada bit representa un estado o condicin. Estos valores son expresados como enteros. Los tres bits menos significativos representan los botones izquierdo, derecho y medio del ratn. El valor por defecto de cada bit es cero (falso). Si ningn botn est presionado, el valor binario de los tres bits es 000. Si presiona el botn izquierdo, el valor binario, o modelo, cambia a 001. El valor del bit del botn izquierdo cambia de 0 (falso) a 1 (verdadero). El argumento Button usa un valor decimal o una constante para representar estos modelos binarios. La siguiente tabla lista los valores binarios de los bits, el equivalente decimal, y la constante Visual Basic: Valor Valor Constante Significado Bin Deci ario mal 001 1 VbLeftButton El botn izquierdo est presionado. 010 2 VbRightButton El botn derecho est presionado. 100 4 vbMiddleButton El botn medio est presionado. Nota: Visual Basic proporciona constantes que representan los valores binarios de los argumentos Button y Shift. Estas constantes pueden ser usadas en forma intercambiable con sus valores decimales equivalentes. Sin embargo, no todos los valores tienen sus correspondientes constantes. Los valores de algunos botones y combinaciones de teclas derivan simplemente de sumar los valores decimales. Al botn medio se le asigna el valor decimal 4. Presionar en forma simultnea los botones izquierdo y derecho producen el valor de dgito nico 3 (1 + 2). En un ratn de tres botones, presionar simultneamente

273

los tres botones producen el valor decimal de 7 (1 + 2 + 4). La siguiente tabla lista los valores de los botones que restan derivados de las posibles combinaciones de botones: Valor Valor Constante Significado Bina Decim rio al 000 0 Ningn botn presionado. 011 3 VbLeftButton + Los botones izquierdo y derecho presionados. vbRightButton 101 5 VbLeftButton+vbMid Los botones izquierdo y medio presionados. dleButton 110 6 VbRightButton+ Los botones derecho y medio presionados. vbMiddleButton 111 7 VbRightButton + Los tres botones presionados. vbMiddleButton + vbLeftButton Usando Button con MouseDown y MouseUp Usa el argumento Button con MouseDown para determinar cul botn est siendo presionado y con MouseUp para determinar cul botn ha sido soltado. En vista de que slo un bit es activado por cada evento, no puede comprobar si dos o ms botones estn siendo usados al mismo tiempo. En otras palabras, MouseDown y MouseUp solamente reconocen un botn a la vez. Nota: En cambio, puede usar el evento MouseMove para probar si dos o ms botones estn siendo presionados en forma simultnea. Puede incluso usar MouseMove para probar si un botn en particular est siendo presionado, an cuando otro botn est siendo presionado al mismo tiempo. Puede especificar cul botn causa el evento MouseDown o MouseUp con un simple cdigo. El siguiente procedimiento prueba si Button es igual que 1, 2, o 4. Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = 1 Then Print Ha Presionado el Botn Izquierdo. If Button = 2 Then Print Ha Presionado el Botn Derecho. If Button = 4 Then Print Ha Presionado el Botn Medio. End Sub Si presiona ms de un botn, Visual Basic interpreta esa accin como dos o ms eventos MouseDown separados. Activa el bit para el primer botn presionado, escribe el mensaje para ese botn, y despus hace lo mismo para el siguiente botn. De forma similar, Visual Basic interpreta la soltada de los dos o ms botones como eventos MouseUp separados. El siguiente procedimiento imprime un mensaje cuando un botn presionado es soltado: Private Sub Form_MouseUp (Button As Integer, _ Shif As Integer, X As Single, Y As Single) If Button = 1 Then Print Solt el Botn Izquierdo. If Button = 2 Then Print Solt el Botn Derecho. If Button = 4 Then Print Solt el Botn Medio. End Sub Usando Button con MouseMove Para el evento MouseMove, Button indica el estado completo de los botones del ratn no solamente cul botn ha causado el evento, como ocurre con MouseDown y MouseUp. Esta informacin adicional es proporcionada porque todos, algunos, o ninguno de los bits deben existir. En cambio, en los eventos MouseDown y MouseUp, la comprobacin es solamente de un bit.

274

Probando un botn Si compara MouseMove contra 001 (decimal 1), est probando para ver si solamente el botn izquierdo del ratn est siendo presionado mientras el ratn est siendo movido. Si otro botn es presionado con el botn izquierdo, el siguiente cdigo no imprime nada: Private Sub Form_MouseMove (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = 1 Then Print Est presionando solo el botn izquierdo. End Sub Para comprobar cuando un botn en particular est presionado use el operador And. El siguiente cdigo imprime un mensaje por cada botn presionado, sin importar si otro botn es presionado: Private Sub Form_MouseMove (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button And 1 Then Print Est presionando el botn izquierdo. If Button And 2 Then Print Est presionando el botn derecho. End Sub Si presiona ambos botones en forma simultnea, se imprimen ambos mensajes en el formulario. El evento MouseMove reconoce los mltiples estados del ratn. Probando mltiples botones En la mayora de los casos, para aislar qu botn o botones han sido presionados, use el evento MouseMove. Puede usar las declaraciones If Then Else para determinar si los botones izquierdo, derecho y medio estn siendo presionados. El siguiente ejemplo prueba los tres estados de los botones (botn izquierdo presionado, botn derecho presionado, y ambos botones presionados) e imprime el mensaje correspondiente: Private Sub Form_MouseMove (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = 1 Then Print Est presionando el botn izquierdo. ElseIf Button =2 Then Print Est presionando el botn derecho. ElseIf Button = 3 Then Print Est presionando ambos botones. End If End Sub Puede usar el operador And con la declaracin Select Case para determinar los estados de Button y de Shift. El operador And combinado con la declaracin Select Case aslan los posibles estados del botn en un ratn de tres botones e imprimen el correspondiente mensaje: esto va en la seccin de declaraciones generales: Dim ButtonTest As Integer

esto va en el evento MouseMove:


Private Sub Form_MouseMove (Button As Integer, _ Shift As Integer, X As Single, Y As Single) ButtonTest = Button And 7 Select Case ButtonTest Case 1 or vbLeftButton Print Est presionando el botn izquierdo. Case 2 or vbRightButton Print Est presionando el botn derecho. Case 4 or vbMiddleButton Print Est presionando el botn medio. Case 7 Print Est presionando los tres botones. End Select End Sub

275

Usando Button para mejorar las aplicaciones de ratn grficas Puede usar el argumento Button para mejorar la aplicacin Scribble descrita en El Evento MouseMove anteriormente en este captulo. Adems de dibujar una lnea continua cuando el botn izquierdo es presionado y detener el dibujo cuando el botn es soltado, la aplicacin puede dibujar una lnea recta desde el ltimo punto dibujado cuando presion el botn derecho. Cuando escriba el cdigo, a menudo es til anotar cada evento relevante y la respuesta deseada. Aqu los tres eventos relevantes son los eventos del ratn: Form_MouseDown: Este evento ejecuta una accin diferente en dependencia del estado de los botones del ratn: Si el botn izquierdo es presionado, establezca DrawNow a verdadero y borre las coordenadas del dibujo; si el botn derecho est presionado, dibuje una lnea. Form_MouseUp: Si el botn izquierdo del ratn no est presionado, ponga DrawNow a falso. Form_MouseMove: Si DrawNow es verdadero, dibuje una lnea. la variable DrawNow es declarada en la seccin de Declaraciones: Dim DrawNow As Boolean el procedimiento MouseDown tiene que tomar una accin diferente, en dependencia de si los botones derecho o izquierdo disparan el evento: Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then DrawNow = True CurrentX = X CurrentY = Y ElseIf Button = vbRightButton Then Line (X, Y) End If End Sub el siguiente procedimiento MouseUp apaga el dibujo solamente cuando el botn izquierdo es soltado: Private Sub Form_MouseUp (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then DrawNow = False End Sub Note que dentro del procedimiento MouseUp, el bit 1 (vbLeftButton) indica que el correspondiente botn del ratn ha sido soltado y el dibujo es desactivado. El siguiente procedimiento MouseMove es idntico al de la aplicacin Scribble que se encuentra en El evento MouseMove, ya vista en este captulo: Private Sub Form_MouseMove (Button As Integer, _ Shift As Integer, X As Single, Y As Single) If DrawNow Then Line (X, Y) End Sub Detectando los estados SHIFT, CTRL, ALT Los eventos del ratn y del teclado usan el argumento Shift para determinar si las teclas SHIFT, CTRL, ALT estn siendo presionadas y en qu clase de combinaciones. Si la tecla SHIFT es presionada, Shift equivale a 1; si la tecla CTRL es presionada, Shift equivale a 2; y si la tecla ALT es presionada, Shift equivale a 4. Para determinar combinaciones de estas teclas, use el total de sus valores. Por ejemplo, si SHIFT y ALT estn siendo presionadas, Shift ser igual que 5 (4 +1). Los tres bits menos significativos en Shift corresponden al estado de las teclas SHIFT, CTRL, ALT. Cualquiera, o todos, los bits en Shift puede ser activados, en dependencia del estado de las teclas SHIFT, CTRL, ALT. Estos valores y constantes son descritos en la siguiente tabla: Valor Valor Constante Significado Binario Decimal

276

001 010 100 011 101 110 111

1 2 4 3 5 6 7

VbShiftMask VbCtlrMask VbAltMask VbShiftMask vbCtrlMask VbShiftMask vbAltMask VbCtrlMask vbAltMask VbCtrlMask vbAltMask vbShiftMask

La tecla SHIFT est presionada. La tecla CTRL est presionada. La tecla ALT est presionada. + Las teclas SHIFT y CTRL estn presionadas. + Las teclas SHIFT y ALT estn presionadas. + Las teclas CTRL y ALT estn presionadas. + Las teclas SHIFT, CTRL, ALT estn presionadas. +

As como con el argumento Button del evento del ratn, puede usar la declaracin If Then Else o el operador And combinado con la declaracin Select Case para determinar si las teclas SHIFT, CTRL, ALT estn siendo presionadas, y en qu, si es aplicable, combinaciones: esta variable ShiftTest va en la seccin de declaraciones. Dim ShiftTest As Integer agregue el siguiente cdigo en el evento MouseDown: Private Sub Form_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) ShiftTest = Shift And 7 Select Case Shift Test Case 1 o vbShiftMask Print Presion la tecla SHIFT. Case 2 o vbCtrlMask print Presion la tecla CTRL. Case 4 o vbAltMask Print Presion la tecla ALT. Case 3 Print Presion las teclas SHIFT y CTRL. Case 5 Print Presion las teclas SHIFT y ALT. Case 6 Print Presion las teclas CTRL y ALT. Case 7 Print Presion las teclas SHIFT, CTRL, ALT. End Select End Sub Arrastrando y soltando Cuando disea aplicaciones Visual Basic a menudo arrastra controles dentro del formulario. Las caractersticas de arrastrar y soltar en Visual Basic le permiten extender esta habilidad al usuario en tiempo de ejecucin. La accin de mantener presionado el botn del ratn al mismo tiempo que se mueve el control se llama arrastrando, y la accin de soltar el botn del ratn es llamada soltando. Nota: Arrastrar un control en tiempo de ejecucin no significa que ste cambia en forma automtica de ubicacin Usted debe programar la ubicacin, como se describe en Cambiando la posicin de un control. A menudo el arrastre es usado solamente para indicar que cierta accin ser ejecutada; el control retiene su posicin original despus que el usuario ha soltado el botn del ratn. Usando las siguientes propiedades, mtodos y eventos de drag and drop puede especificar el significado de una operacin de arrastre y cmo el arrastre ser iniciado para un control determinado. Categora Item Descripcin Propiedades DragMode Activa el arrastre manual o automtico de un control.

277

DragIcon Eventos Mtodos DragDrop DragOver Drag

Especifica qu icono es desplegado cuando el control es arrastrado. Reconoce cuando un control es soltado dentro de un objeto. Reconoce cuando un control es arrastrado sobre el objeto. Inicia o detiene el arrastre manual.

Todos los controles, excepto Mens, Timer, Line, y Shape, aceptan las propiedades DragMode y DragIcon y el mtodo Drag. Los formularios reconocen los eventos DragDrop y DragOver, pero no reconocen las propiedades DragMode y DragIcon o el mtodo Drag. Nota: Los controles pueden ser arrastrados solamente cuando ellos no tienen el enfoque. Para prevenir que un control pueda recibir enfoque establezca su propiedad TabStop a False. Activando DragMode automtico Para permitir que el usuario arrastre un control, establezca su propiedad DragMode a 1 Automtico. Cuando el usuario pone el arrastre en automtico, el arrastre est siempre on. Para obtener mayor control sobre las operaciones de arrastre, use la opcin 0 Manual, que se describe en Controlando cuando el arrastre inicia y termina ms adelante en este captulo. Nota: Mientras transcurra una operacin de arrastre automtico, el control que est siendo arrastrado no reconoce ningn otro evento de ratn. Cambiando el icono del arrastre Cuando se arrastra un control, Visual Basic usa imagen gris del control como el icono por defecto del arrastre. Puede sustituirlo por otras imgenes estableciendo la propiedad DragIcon. Esta propiedad contiene el objeto Picture que corresponde a una imagen grfica. La forma ms fcil para establecer la propiedad DragIcon es usar la ventana de propiedades. Seleccione la propiedad DragIcon y despus d clic al botn Properties para seleccionar un archivo que contenga una imagen grfica de la caja de dilogo Load Icon. Puede asignar iconos a la propiedad DragIcon de la librera Icon incluida con Visual Basic. (Los iconos estn contenidos en el directorio \Program Files\Microsoft Visual Basic\Icons). Usted puede tambin crear sus propios iconos de arrastre con un programa grfico. En tiempo de ejecucin puede seleccionar una imagen de icono de arrastre a travs de la asignacin de la propiedad DragIcon de un control a la misma propiedad de otro control: Set Image1.DragIcon = Image2.DragIcon Puede tambin establecer la propiedad DragIcon en tiempo de ejecucin asignando la propiedad Picture de un control a la propiedad DragIcon de otro control: Set Image1.DragIcon = Image3.Picture O puede usar la funcin LoadPicture: Set Image1.DragIcon = LoadPicture (c:\Program _ Files\Microsoft Visual Basic\Icons _ \Computer\Disk04.ico) Para mayor informacin sobre la propiedad Picture y la funcin LoadPicture, vea Trabajando con texto y grficos. Tambin vea Picture Property y LoadPicture Function en Language Reference en Books Online. Respondiendo cuando el usuario deja caer el objeto Cuando el usuario suelta el botn despus de haber arrastrado un control, Visual Basic genera un evento DragDrop. Puede responder a este evento de diferentes maneras. Recuerde que el control no se mueve automticamente a la nueva ubicacin, pero puede escribir cdigo para ubicar el control en el nuevo lugar (indicado por la ltima posicin de la figura gris). Vea Cambiando la posicin del control para mayor aclaracin.

278

Dos trminos son importantes cuando se discute sobre las operaciones drag and drop: source y target. Trmino Significado Source El control que est siendo arrastrado. Este control puede ser cualquier objeto, excepto Men, Timer, Line, o Shape. Target El objeto dentro del cual el usuario deja caer el control. Este objeto, que puede ser un formulario o un control, reconoce el evento DragDrop. Un control se convierte en Target si el apuntador del ratn est dentro de sus fronteras cuando el botn es soltado. Un formulario es el Target si el apuntador del ratn est en una posicin en blanco en el formulario. El evento DragDrop proporciona tres argumentos: Source, X y Y. El argumento Source es una referencia al control que ser dejado caer dentro del Target. En vista de que Source es declarado As Control, puede usarlo como lo hara con cualquier control puede referirse a sus propiedades o invocar uno de sus mtodos. El siguiente ejemplo muestra cmo interactan Source y Target. El Source es un control con una imagen con su propiedad Picture establecida para cargar un icono de archivo de ejemplo que representa unos pocos folders. Su propiedad DragMode ha sido puesta en 1 - Automtico y su propiedad DragIcon ha sido puesta a un ejemplo de archivo de icono drag and drop. El Target, tambin un control con una imagen, contiene la figura de un archivador de archivos abierto. Agregue el siguiente procedimiento al evento DragDrop del segundo control que tiene una imagen: Private Sub Image2_DragDrop (Source As Control, _ X As Single, Y As Single) Source.Visible = False Image2.Picture = LoadPicture (c:\Program _ Files\Microsoft Visual _ Basic\Icons\Office\Files03a.ico) End Sub Arrastrar y soltar Image1 dentro de Image2 ocasiona que Image1 se desvanezca y que Image2 cambie su imagen por la de un archivador de archivos cerrado. Usando el argumento Source, la propiedad Visible de Image1 ha sido cambiada a False. Nota: Use el argumento Source con cuidado. Aunque sabe que este siempre se refiere a un control, no necesariamente conoce el tipo del control. Por ejemplo, si el control es un TextBox e intenta referirse a su propiedad Source, el resultado ser un error en tiempo de ejecucin, porque los TextBox no tienen propiedad Value. Puede usar la declaracin IfThen Else con la palabra reservada TypeOf que tipo de control ha sido dejado caer. Controlando cuando el arrastre se inicia y se detiene Visual Basic tiene la opcin Manual para la propiedad DragMode que le brinda ms control que la opcin Automtica. La opcin Manual le permite especificar cundo un control puede o no puede ser arrastrado. (Cuando DragMode es puesto en Automtico, puede arrastrar el control mientras esta propiedad no sea cambiada). Por ejemplo, puede desear activar el arrastre en respuesta a los eventos MouseDown y MouseUp, o en respuesta a comandos del teclado o del men. La opcin Manual tambin le permite reconocer el evento MouseDown antes de que el arrastre se inicie, de esta forma puede conocer la posicin original del apuntador del ratn. Para permitir el arrastre a travs de cdigo, deje DragMode a su opcin por defecto (0 Manual). Despus use el mtodo Drag cuando desee iniciar o detener el arrastre de un objeto. Use las siguientes constantes Visual Basic para especificar la accin del argumento Drag.

279

Constante VbCancel VbBeginDrag VbEndDrag

Valor 0 1 2

Significado Cancela la operacin de arrastre. Inicia la operacin de arrastre. Finaliza la operacin de arrastre.

La sintaxis del mtodo Drag es la siguiente: [object.] Drag action Si action es puesta en vbBeginDrag, el mtodo Drag inicia el arrastre del control. Si action es puesta en vbEndDrag, el control es soltado, causando el evento DragDrop. Si action es puesto a vbCancel, el arrastre es cancelado. El efecto es similar al valor vbEndDrag, excepto que el evento DragDrop no ocurre. Construido sobre el ejemplo dado en Respondiendo cuando el usuario deja caer el objeto ya visto en este captulo, puede agregar el evento MouseDown a Image1 que ilustra el mtodo Drag. Establezca la propiedad DragMode de Image1 a 0 Manual, y agregue el siguiente procedimiento: Private Sub Image1_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Image1.Drag vbBeginDrag Set Image1.DragIcon = LoadPicture (c:\Program _ Files\Microsoft Visual _ Basic\Icons\Dragdrop\Dragfldr.ico) End Sub Agregar a Image2 el procedimiento de evento DragOver permite finalizar el arrastre cuando Source entra al Target. Este ejemplo cierra el archivador de archivos cuando Image1 pasa sobre Image2. Private Sub Image2_DragOver(Source As Control, _ X As Single, Y As Single, State As Integer) Source.Drag vbEndDrag Source.Visible = False Image2.Picture = LoadPicture (c:\Program _ Files\Microsoft Visual _ Basic\Icons\Office\Files03a.ico) End Sub Agregando un tercer control de imagen al formulario demuestra la cancelacin de la operacin de arrastre. En este ejemplo, la propiedad Picture de Image3 contiene un icono de una lata de basura. Usando el evento DragOver y el argumento Source, el arrastre de los archivos sobre Image3 cancela la operacin de arrastre. Private Sub Image3_DragOver (Source As Control, _ X As Single, Y As Single, State As Integer) Source.Drag vbCancel End Sub Cambiando la ubicacin de un control Puede desear que el control Source cambie de posicin una vez que el usuario suelta el botn del ratn. Para mover un control a la nueva ubicacin sealada por el apuntador del ratn, use el mtodo Move con cualquier control que tenga activa la opcin de arrastre. Puede ubicar un control cuando es arrastrado y soltado a cualquier lugar dentro del formulario siempre que este sitio no est ocupado por otro control. Para ilustrar esto, inicie un nuevo proyecto Visual Basic, agregue un control al formulario, agregue una imagen, icono o bitmap, al control estableciendo su propiedad Picture, y despus cambie la propiedad DragMode del control que tiene la imagen a 1 Automtico. Agregue el siguiente procedimiento al evento DragDrop del formulario:

280

Private Sub Form_DragDrop (Source As Control, _ X As Single, Y As Single) Source.Move X, Y End Sub Puede que este cdigo no produzca los efectos precisos que desee, porque la esquina superior izquierda del control es ubicada en la posicin del apuntador del ratn. El siguiente cdigo ubica el centro del control en la posicin del apuntador del ratn: Private Sub Form_DragDrop (Source As Control, _ X As Single, Y As Single) Source.Move (X Source.Width / 2 ), _ (Y Source.Height / 2 ) End Sub Este cdigo funciona mejor cuando al propiedad DragIcon es puesta a un valor que no sea el valor por defecto (el rectngulo gris). Cuando el rectngulo gris es usado, usualmente se desea que el control se mueva precisamente dentro de la posicin final del rectngulo gris. Para hacer esto, guarde la posicin inicial del ratn dentro del control Source. Despus use esta posicin como la inicial cuando el control es movido. Para guardar la posicin inicial del ratn: Especificar arrastre manual al control. Declarar dos variables a nivel de formulario, DragX y DragY. Active el arrastre cuando ocurra el evento MouseDown. Almacene los vales de X y Y en las variables a nivel de formulario en este evento. El siguiente ejemplo ilustra como causar que el movimiento de arrastre de un control que tiene una imagen llamado Image1. La propiedad DragMode del control debe ser puesta a 0 Manual en tiempo de diseo. La seccin de declaraciones contiene las variables a nivel de formulario DragX y DragY, que guardan la posicin inicial del ratn dentro del control que tiene la imagen: Dim DragX As Single, DragY As Single Los procedimientos MouseDown y MouseUp del control encienden el arrastre y sueltan el control, respectivamente. Adems, el procedimiento MouseDown guarda la posicin del ratn dentro del control en el momento en que el arrastre da inicio: Private Sub Image1_MouseDown (Button As Integer, _ Shift As Integer, X As Single, Y As Single) Image1.Drag 1 DragX = X DragY = Y End Sub El procedimiento Form_DragDrop antes explicado mueve el control. Para simplificar este ejemplo, asuma que Image1 es el nico control en el formulario. El Target por tanto puede ser solamente el formulario. El procedimiento Form_DragDrop re ubica el control, usando los valores iniciales DragX y DragY: Private Sub Form_DragDrop (Source As Control, _ X As Single, Y As Single) Source.Move (X DragX), (Y DragY) End Sub Note que este ejemplo asume que Image1 y el formulario usan las mismas unidades en sus respectivos sistemas de coordenadas. Si no es as, tendr que hacer la conversin entre unidades. OLE Drag and Drop Una de las ms poderosas y tiles caractersticas que puede agregar a sus aplicaciones Visual Basic es la habilidad para arrastrar texto o grficos de un control hacia otro, o de un control hacia otra aplicacin Windows, y viceversa. OLE drag and drop le permite agregar este funcionamiento a sus aplicaciones. Con OLE drag and drop no est arrastrando un control hacia otro para invocar algn cdigo (como el drag and drop abordado previamente); Usted est moviendo datos de un control o aplicacin hacia otro control o

281

aplicacin. Por ejemplo, selecciona y arrastra un rango de celdas en Excel, despus deja caer este rango de celdas en un control DataBoundGrid en su aplicacin. Casi todos los controles Visual Basic son aptos para acceder a las caractersticas OLE drag and drop en cierto grado. Los siguientes controles estndar y controles ActiveX proporcionan acceso automtico para OLE drag and drop, lo que significa que no se necesita escribir ni un cdigo sea para arrastrar un control o dejar caer sobre el control: Apex Data-Bound Grid Picture Box RichTextBox Image TextBox MaskedEdit box Para activar la caracterstica automtica OLE drag and drop para estos controles selecciona las propiedades OLEDragMode y OLEDropMode y las pone en automtico. Algunos controles solo proporcionan soporte automtico para la operacin OLE drag. Para permitir el arrastre automtico de estos controles pone en automtico la propiedad OLEDragMode. ComboBox Data-BoundListBox FileListBox Data-Bound ComboBox DirectoryListBox ListBox TreeView ListView Los siguientes controles solamente soportan eventos OLE drag and drop, significando esto que puede programarlos con cdigo para que acten sea como Source o Target en operaciones OLE drag and drop. CheckBox Frame OptionButton CommandButton Label DriveListBox Data Nota: Para comprobar si otros controles ActiveX soportan OLE drag and drop, cargue el control dentro de Visual Basic y verifique si existen las propiedades OLEDragMode y OLEDropMode, o el mtodo OLEDrag. Un control que no tiene automtico soporte para OLE drag no tendr la propiedad OLEDragMode, pero tendr un mtodo OLEDrag si soporta OLEDrag a travs de cdigo. Nota: Los formularios, los formularios MDI, los objetos Document, User Controls y Property Pages contienen la propiedad OLEDropMode y proporcionan soporte para arrastre y soltado manual solamente. Usando las siguientes propiedades OLE drag and drop, eventos y mtodos, puede especificar cmo determinado control responder a arrastre y soltado. Categora Item Descripcin Propiedades OLEDragMode Activa el arrastre automtico o manual de un control ( si el control soporta OLE drag manual pero no automtica, no contendr esta propiedad pero soportar el mtodo OLEDrag y los eventos OLE drag and drop. OLEDropMode Especifica cmo responder un control a una cada. Eventos OLEDragDrop Reconoce cundo un objeto Source es dejado caer dentro de un control. OLEDragOver Reconoce cuando un objeto Source es arrastrado sobre un control OLEGiveFeedback Proporcionan herramientas para personalizar el icono de arrastre que se presentar al usuario, en base al objeto Source. OLEStartDrag Especifica los formatos de datos y efectos de soltado (copiar, mover, o denegar datos) que soporta Source cuando es iniciado el arrastre. OLESetData Proporciona datos cuando el objeto Source es soltado. OLECompleteDrag Informa a Source de la accin que fue ejecutada cuando el objeto fue dejado caer dentro del target.

282

Mtodo

OLEDrag

Inicia arrastre manual.

Arrastre y soltado automtico versus manual Es de gran ayuda pensar sobre el tipo de implementacin OLE drag and drop que se debe hacer, sea automtica o manual. El arrastre y soltado automtico significan, por ejemplo, que puede arrastrar texto de un control caja de texto a otro simplemente activando las propiedades OLEDragMode y OLEDropMode a automtico de estos controles: No necesita escribir ningn cdigo para que responda a cualquiera de los eventos OLE drag and drop. Cuando arrastra un grupo de celdas de Excel y las deposita en un documento Word, se est efectuando una operacin automtica drag and drop. En dependencia de cmo determinado control o aplicacin soporta OLE drag and drop y que tipos de datos estn siendo arrastrados, el arrastre y soltado automtico de datos puede ser el mejor y el mtodo ms simple. El arrastre y soltado manual significa que ha elegido (o se ha visto forzado a hacerlo) manejar manualmente uno o ms eventos OLE drag and drop. La implementacin manual de OLE drag and drop puede ser el mejor mtodo cuando desea controlar cada uno de los pasos del proceso para proporcionar al usuario con accin interactiva visual personalizada, para crear su propio formato de datos. La implementacin manual es la nica opcin cuando un control no soporta arrastre y soltado automtico. Es tambin til definir el modelo completo de la operacin OLE drag and drop. En una operacin drag and drop, el objeto cuyos datos son arrastrados se llama Source. El objeto dentro del cual los datos son soltados se llama Target. Visual Basic proporciona las propiedades, eventos y mtodos para controlar y responder a acciones afectando tanto a Source como a Target. Es tambin til reconocer que Source y Target pueden estar en diferentes aplicaciones, en la misma aplicacin, y an en el mismo control. En dependencia de lo que muestre este escenario, puede necesitar escribir cdigo para Source o para Target, o para ambos. Permitiendo OLE drag and drop automtico Si sus controles soportan arrastre y soltado automtico podr arrastrar datos desde y/o soltar datos dentro de un control Visual Basic poniendo en automtico las propiedades OLEDragMode y OLEDropMode. Por ejemplo, puede arrastrar texto de un control TextBox a un documento de Word de Windows, o permitir que el control TextBox acepte datos arrastrados desde un documento de Word de Windows. Para permitir el arrastre desde el control TextBox, ponga en automtico la propiedad OLEDragMode. En tiempo de ejecucin podr seleccionar texto escrito en el control TextBox y arrastrarlo hasta un documento de Word de Windows abierto. Cuando arrastra texto desde un control TextBox hacia un documento de Word, por defecto es movido en vez de ser copiado dentro del documento. Si presiona la tecla CTRL mientras deja caer el texto, este ser copiado en vez de movido. Este es el comportamiento por defecto de todos los objetos o aplicaciones que soportan OLE drag and drop. Para restringir esta operacin que permita que los datos slo sean movidos o que slo sean copiados necesitar modificar el comportamiento automtico usando las tcnicas de arrastre y soltado manual. Para mayor informacin vea Usando el ratn y el teclado para modificar los efectos de soltado e interaccin con el usuario. Para permitir que el control TextBox automticamente recuperar datos en una operacin OLE drag and drop, ponga en automtico su propiedad OLEDropMode. En tiempo de ejecucin, los datos arrastrados desde una aplicacin OLE compatible dentro del TextBox sern movidos en vez de copiado a no ser que se mantenga presionada la tecla CTRL durante el soltado, o alterar el comportamiento por defecto a travs de cdigo. El soporte automtico para el arrastre y soltado de datos tiene sus limitaciones; algunas de estas limitaciones se desprenden de la propia funcionalidad de los controles. Por ejemplo, mueve texto desde un documento de Word hacia un control TextBox, todo el formato de texto enriquecido en el documento de Word ser cortado en vista de que un control TextBox no soporta formato de datos. Limitaciones similares existen para la mayora de los controles. Otras limitaciones de las operaciones automticas son que no tiene un control completo sobre el tipo de datos que se arrastra o se suelta.

283

Nota: Cuando arrastra datos notar que el apuntador del ratn indica si el objeto sobre el que est pasando soporta OLE drag and drop del tipo de datos que est arrastrando. Si el objeto soporta OLE drag and drop para el tipo de datos, el apuntador drop es desplegado. Si el objeto no soporta OLE, un apuntador de no drop es desplegado. El objeto DataObject OLE drag and drop OLE drag and drop usa el mismo modelo de Source y Target usado en las tcnicas drag and drop descritas en Arrastrando y soltando. En este caso, sin embargo, no arrastra un control sobre el otro para invocar cierto cdigo; ahora est moviendo datos desde un control o aplicacin hacia otro control o aplicacin. Por ejemplo, el usuario selecciona y arrastra un grupo de celdas en Excel (Source) y entonces deja caer este grupo de celdas dentro de un control DBGrid (Target) en su aplicacin. En Visual Basic, el vehculo, o almacn, de estos datos es el objeto DataObject es el conducto a travs del cual los datos son movidos desde Source hacia Target. Esto lo logra a travs de proporcionar los mtodos necesarios para almacenar, recuperar y analizar datos. La siguiente tabla lista las propiedades y mtodos usados por el objeto DataObject: Categora Item Descripcin Propiedad Files Contiene los nombres de los archivos arrastrados desde o hacia el explorador de Windows. Mtodos Clear Borra el contenido del objeto DataObject. GetData Recupera datos del objeto DataObject. GetFormat Determina si un especfico formato de datos est disponible en el objeto DataObject. SetData Sita datos dentro del objeto DataObject o indica que un formato especificado est disponible solo de solicitarlo. Usados con los eventos OLE drag and drop, estos mtodos permiten manejar datos en el objeto DataObject tanto en Source como en Target (si ambos se encuentran dentro de su aplicacin Visual Basic). Por ejemplo, puede situar datos dentro del objeto DataObject del lado del Source usando el mtodo SetData, y despus usar el mtodo GetData para aceptar los datos en el lado del Target. El mtodo Clear es usado para borrar el contenido del objeto DataObject en el lado Source cuando el evento OLEStartDrag es disparado. Cuando los datos de un control son arrastrados en una operacin automtica de arrastre, sus formatos de datos son ubicados en el objeto DataObject antes de que el evento OLEStartDrag sea disparado. Si no desea usar los formatos por defecto use el mtodo Clear. Si desea agregar formato de datos por defecto no use el mtodo Clear. La propiedad Files le permite almacenar los nombres de un juego de archivos que sern arrastrados hacia un objeto Target. Vea Arrastrando archivos desde el explorador de Windows para obtener mayor informacin sobre esta propiedad. Puede especificar el formato de los datos que estn siendo transferidos. Los mtodos SetData y GetData usan los siguientes argumentos para situar o recuperar datos del objeto DataObject: Argumento Descripcin Data Permite especificar el tipo de datos que ser situado dentro del objeto DataObject (es un argumento opcional si se usa el argumento format, de lo contrario es requerido). Format Permite poner diferentes formatos que el objeto DataObject pueda soportar, sin tener que cargar los datos para cada uno (argumento opcional si el argumento data se ha usado o si Visual Basic entiende el formato; de otra forma es requerido. Cuando los datos son soltados dentro del Target y no ha sido especificado format, Visual Basic est apto para detectar si es bitmap, metafile, enhanced metafile, o texto. Todos los restantes formatos debern ser especificados en forma explcita o se generar un error. El argumento format usa las siguientes constantes o valores para especificar el formato de los datos:

284

Constante VbCFText VbCFBitmap VbCFMetafile VbCFEMetafile VbCFDIB VbCFPalette VbCFFiles VbCFRTF

Valor 1 2 3 14 8 9 15 -16639

Significado Texto Bitmap (.bmp) Metafile (.wmf) Metafile mejorado (.emf) Bitmap independiente de dispositivo (.dib o .bmp) Paleta de colores Lista de Archivos Formato de texto enriquecido (.rtf)

Los mtodos SetData, GetData y GetFormat usan los argumentos data y format para regresar ya sea el tipo de datos en el objeto DataObject o para recuperar el dato si el formato es compatible con el Target. Por ejemplo: Private Sub txtSource_OLEStartDrag (Data As _ VB.DataObject, AllowedEffects As Long) Data.SetData txtSource.SelText, vbCFText End Sub En este ejemplo, data es el texto seleccionado en un TextBox y format ha sido especificado como texto (vbCFText). Nota: Debera de usar el formato de datos vbCFDIB en vez de vbCFBitmap y vbCFPalette, en la mayora de los casos. El formato vbCFDIB contiene tanto bitmap y palette y es en consecuencia el mtodo preferido para transferir imgenes de mapas de bits. Puede, sin embargo, tambin especificar vbCFBitmap y vbCFPalette por aclaracin. Si elige no usar el formato vbCFDIB, deber especificar tanto el formato vbCFBitmap y vbCFPalette para que el bitmap y la palette sean correctamente situados en el objeto DataObject. Para mayor informacin vea Creacin de un formato de datos de cliente con el objeto de definir su propio formato de datos. Como trabaja OLE drag and drop Cuando una operacin OLE drag and drop es ejecutada, ciertos eventos son generados en los lados Source y Target. Los eventos asociados con el objeto Source son siempre generados, sea automtica o manual la operacin drag and drop. Sin embargo, los eventos del lado Target, son generados en una operacin manual de soltado. La siguiente ilustracin muestra los eventos que ocurren y que pueden ser respondidos en la fuente de arrastre, y los que ocurren y que pueden ser respondidos en el objetivo de soltado. OLE Drag Source OLE Drop Target

Los eventos que necesitar para responder son dependientes de la funcionalidad drag and drop que haya Eventos del lado Source Eventos del lado Target OLEStartDrag OLEDragDrop OLESetData OLEDragOver OLEGiveFeedback OLECompleteDrag

elegido implementar. Por ejemplo, puede haber creado una aplicacin con un TextBox que permita que acepte en forma automtica datos arrastradas desde otra aplicacin. En este caso, simplemente establece la propiedad OLEDropMode a automtico. Si desea que los datos puedan ser arrastrados desde el control TextBox, establece la propiedad OLEDragMode a automtico. Sin embargo, si desea cambiar los cursores por defecto que tiene el ratn o mejorar la funcionalidad para botones de estado y teclas shift, necesita manualmente responder a los eventos del lado fuente y del lado objetivo. De igual forma, si desea analizar los datos antes de que sean soltados sobre un control (por ejemplo para verificar que los datos son compatibles), o para retardar cuando los datos son cargados dentro del objeto

285

DataObject (as mltiples formatos no necesitan ser cargados en el inicio), necesitar usar las operaciones manuales OLE drag and drop. En vista de que arrastrar y soltar datos dentro de numerosos controles Visual Basic y aplicaciones Windows con limitaciones y requerimientos variados la implementacin de OLE drag and drop puede oscilar entre la ms simple hasta la ms compleja. Desde luego la implementacin ms simple sera arrastrar y soltar entre dos objetos automticos, en donde objeto puede ser un documento de Word, una hoja electrnica de Excel, o un control en su aplicacin que haya sido puesto en automtico. Especificar mltiples formatos de datos que sean aceptables para el objeto de soltado Target podra ser ms complicado. Iniciando el arrastre Qu ocurre dentro de su aplicacin Visual Basic en una operacin OLE drag and drop bsica? Cuando el usuario arrastra datos desde un OLE drag source (por ejemplo un TextBox) seleccionado y sosteniendo presionado el botn izquierdo del ratn, el evento OLEStartDrag es disparado y puede, almacenar los datos, o simplemente especificar los formatos que el source soporta. Tambin necesitar especificar copiado o movido de datos, o ambos, que pueda permitir source. Vea Iniciando una operacin OLE Drag para mayor informacin sobre el mtodo OLE drag, el evento OLEStartDrag, el uso del mtodo SetData para especificar los formatos de datos soportados y situar los datos dentro del DataObject. Arrastrando sobre el Target En cuanto el usuario arrastra sobre el Target, el evento OLEDragOver del Target es disparado, indicando que el Source est dentro de sus fronteras. Despus especifica qu har el Target si los datos son ah depositados sea copiados, movidos, o rechazados. Por convencin, el valor por defecto usualmente es mover, pero puede ser tambin copiar. Cuando el Target especifica que efecto de soltado ser ejecutado si el source es descargado ah, el evento OLEGiveFeedback es disparado. El evento OLEGiveFeedback es usado para proporcionar interaccin visual con el usuario sobre el tipo de accin que ser tomada cuando la seleccin sea depositada por ejemplo, el apuntador del ratn cambiar para indicar una accin de copiado, movido, o de no drop. En el momento en que el source es movido dentro de las fronteras del target o si el usuario tiene presionada la tecla SHIFT, o CTRL, o ALT, y al mismo tiempo mantiene presionado el botn del ratn el efecto soltado puede ser cambiado. Por ejemplo, en vez de permitir copiar o mover, los datos pueden ser rechazados. Por ejemplo, si el usuario pasa ms all del target o presiona la tecla escape, entonces la operacin de arrastre puede ser cancelada o modificada (el apuntador del ratn puede ser cambiado para indicar que el objeto que est pasando encima actualmente no aceptar los datos. Para mayor informacin vea Arrastrando el OLE Drag Source sobre el OLE Drop Target en donde se presenta informacin sobre los eventos OLEDragOver y OLEGiveFeedback. Completando el arrastre Cuando el usuario suelta el source dentro del target, el evento OLEDragDrop del target es disparado. El target pregunta al source sobre el formato de datos que contiene (o soporta, si el dato no fue situado dentro del source cuando el arrastre fue iniciado) y despus recupera o rechaza los datos. Si los datos fueron almacenados cuando el arrastre dio inicio, el target recupera los datos a travs del uso del mtodo GetData. Si los datos no fueron almacenados cuando dio inicio el arrastre, los datos son recuperados a travs de disparar el evento OLESetData del source y despus usando el mtodo SetData. Cuando los datos son aceptados o rechazados, el evento OLECompleteDrag es disparado y el source puede despus tomar la accin apropiada: si el dato es aceptado y movido como fue especificado, por ejemplo, el source borra los datos.

286

Para mayor informacin vea Depositando el OLEDragSource dentro del OLEDropTarget, en donde se muestran los tpicos para los eventos OLEDragDrop y OLECompleteDrag, y los mtodos GetFormat y GetData para recuperar datos del objeto DataObject. Iniciando la operacin de arrastre OLE Si desea especificar que tipos de datos o efectos de soltado (copiar, mover, o no drop) son soportados, o si el control del cual desea arrastrar datos no soporta arrastre automtico, necesitar convertir a manual su operacin de arrastre OLE. La primer fase en una operacin manual de arrastre y soltado en llamar al mtodo OLEDrag, activar los efectos de soltado permitidos, especificar los formatos de datos soportados, y, opcionalmente, situar datos en el objeto DataObject. Usa el mtodo OLEDrag para manualmente dar inicio a una operacin de arrastre y el evento OLEStartDrag para especificar los efectos de las acciones de soltado permitidos y los formatos de datos soportados. El mtodo OLEDrag Generalmente, el mtodo OLEDrag es llamado desde el evento MouseMove del objeto cuando el dato ha sido seleccionado, el botn izquierdo del ratn ha sido presionado y mantenido presionado, y el ratn es movido. El mtodo OLEDrag no proporciona ningn argumento. Su propsito principal es dar inicio al arrastre manual y despus permitir al evento OLEStartDrag que active as condiciones de la operacin de arrastre (por ejemplo especificando que ocurrir cuando los datos sean arrastrados dentro de otro control). Si el control source soporta la propiedad OLEDragMode, para mantener control manual sobre la operacin de arrastre debe activar esta propiedad a Manual y despus usar el mtodo OLEDrag sobre el control. Si el control soporta arrastre OLE manual pero no automtico, no tendr la propiedad OLEDragMode, pero soportar el mtodo OLEDrag y los eventos OLE drag and drop. Nota: El mtodo OLEDrag tambin trabajar si la propiedad OLEDragMode del control source es puesta en automtica. Especificando efectos de soltado y formatos de datos En una operacin de arrastre OLE manual, cuando el usuario comienza a arrastrar el source y el mtodo OLEDrag es llamado, el evento OLEStartDrag se dispara. Use este evento para especificar qu efectos de soltado y formato de datos soporta source. El evento OLEStartDrag usa dos argumentos para especificar formatos de datos soportados y si los datos pueden ser copiados o movidos cuando los datos sean depositados (efectos de soltado). Nota: Si en el evento OLEStartDrag no son especificados efectos de soltado y de formatos de datos, no dar inicio el arrastre manual. El argumento AllowedEffects Dl argumento allowedeffects especifica los efectos de soltado que soporta el arrastre source. Por ejemplo: Private Sub txtSource_OLEStartDrag (Data As _ Vb.DataObject, AllowedEffects As Long) AllowedEffects = vbDropEffectMove Or _ VbDropEffectCopy End Sub El target podr despus inquirir a la fuente del arrastre sobre esta informacin y responder adecuadamente. El argumento allowedeffects usa los siguientes valores para especificar efectos de soltado: Constante Valor Descripcin VbDropEffectNone 0 El drop target no acepta los datos. VbDropEffectCopy 1 El soltado resulta un copiado. Los datos originales permanecen

287

VbDropEffectMove

intocables por el drag source. El drag source borra los datos.

El argumento Format Especifica los formatos de datos que el objeto soporta usando el argumento format del evento OLEStartDrag. Para hacer esto usa el mtodo SetData. Por ejemplo, es un escenario que use un control RichTextBox como source y un control TextBox como target, debe especificar los siguientes formatos soportados: Private Sub rtbSource_OLEStartDrag (Data As _ VbDataObject, AllowedEffects As Long) AllowedEffects = vbDropEffectMove Or _ VbDropEffectCopy Data.SetData, vbCFText Data.SetData, vbCFRTF End Sub El target podr inquirir al source para determinar que formatos de datos son soportados y despus responder adecuadamente por ejemplo, si el formato del dato descargado no es soportado por el target rechazar los datos depositados. En este caso, los nicos formatos de datos que son soportados por el source son formatos de texto y de texto enriquecido. Para mayor informacin vea El objeto DataObject de OLE drag and drop en donde se explica sobre el mtodo SetData. Ubicando datos en el objeto DataObject En muchos casos, especialmente si el source soporta ms de un formato de datos, o si consume mucho tiempo para crear los datos, puede situar los datos dentro del objeto DataObject solamente cuando sea requerido por el target. Sin embargo, tambin puede situar los datos en el objeto DataObject cuando da inicio la operacin de arrastre a travs del uso del mtodo SetData en el evento OLEStartDrag. Por ejemplo: Private Sub txtSource_OLEStartDrag (Data As _ Vb.DataObject, AllowedEffects As Long) Data.Clear Data.SetData txtSource.SelText, vbCFText End Sub Este ejemplo limpia el formato de datos por defecto del objeto DataObject usando el mtodo Clear, especifica el formato de datos (text) del dato seleccionado, y despus sita el dato seleccionado dentro del objeto DataObject con el mtodo SetData. Arrastrando el OLE Drag Source sobre el OLE Drop Target Con un Target manual, puede determinar y responder a la posicin de los datos fuente dentro del target y responder a los estados de los botones del ratn y de las teclas SHIFT, CTRL, ALT. Si el source y el target son manuales, puede modificar el comportamiento visual por defecto del ratn. Para Use el Determinar y responder a la posicin del objeto Argumento State del evento OLEDragOver. source. Responder al estado de los botones del ratn. Argumento Button de los eventos OLEDragDrop y OLEDragOver. Responder al estado de las teclas SHIFT, CTRL, Argumento Shift de los eventos OLEDragDrop y ALT. OLEDragOver. Modificar el comportamiento visual por defecto Argumento Effect del evento OLEDragOver y el del ratn. argumento Effect del evento OLEGiveFeedback. Para mayor informacin acerca de cambiar el cursor del ratn vea Arrastrando el OLE Drag Source sobre el OLE Drop Target, y para mayor informacin sobre los argumentos Button y Shift, vea Usando el ratn y el teclado para modificar los efectos de soltado e interaccin con el usuario. El argumento estado del evento de OLEDragOver

288

En dependencia de su posicin, el argumento effect puede ser cambiado para indicar en el momento el efecto de soltado aceptable. El argumento State en el evento OLEDragOver le permite responder a los datos fuentes que estn entrando, que estn pasando encima o que estn abandonando el control target. Por ejemplo, cuando los datos fuentes entra en el control target, el argumento State es puesto a vbEnter. Cuando el drag source es movido dentro de las fronteras del drop target, el argumento State es puesto en vbOver. En dependencia de la posicin del ratn (argumentos X y Y), puede cambiar el efecto del arrastre. Note que el evento OLEDragOver es generado varias veces por segundo, an cuando el ratn no est movindose. El argumento State del evento OLEDragOver especifica cuando los datos entran, pasan por encima, o abandonan el control target a travs del uso de las siguientes constantes: Constante Valor Significado VbEnter 0 Los datos han sido arrastrados dentro del rango del target. VbLeave 1 Los datos han sido arrastrados fuera del rango del target. VbOver 2 Los datos todava estn dentro del rango del target, el ratn se ha movido, o algunos de sus botones han sido presionados, o se han presionado las teclas, o ha pasado determinada cantidad de tiempo estimada por el sistema. Proveyendo al usuario con alimentacin visual personalizada Si desea modificar el comportamiento visual por defecto del ratn en una operacin OLE drag and drop, puede manipular el evento OLEDragOver en el lado del target y el evento OLEGiveFeedback en el lado del source. OLE drag and drop proporciona alimentacin visual automtica durante una operacin OLE drag and drop. Por ejemplo, cuando inicia el arrastre, el apuntador del ratn es cambiado para indicar que un arrastre ha sido iniciado. Cuando pasa sobre los objetos que no soportan OLE drop, el apuntador del ratn es cambiado al cursor no drop. La modificacin del apuntador del ratn para indicar como un control responder si los datos son soltados sobre l, involucra dos pasos: determinar que tipo de datos est en el objeto DataObject usando el mtodo GetFormat, y despus poniendo el argumento Effect del evento OLEDragOver para informar al source que efectos de soltado son permitidos por este control. El evento OLEDragOver Cuando la propiedad OLEDropMode del control target es puesta a manual, el evento OLEDragOver es disparado siempre que los datos arrastrados pasen sobre el control. El argumento Effect del evento OLEDragOver es usado para especificar que accin ser tomada si el objeto es soltado. Cuando este valor es puesto, el evento OLEGiveFeedback del source es disparado. El evento OLEGiveFeedback contiene su propio argumento Effect, que es usado para proporcionar alimentacin visual al usuario sobre la accin que ser tomada cuando la seleccin es arrastrada por ejemplo, el apuntador del ratn es cambiado para indicar si se trata de una accin de copiado, movido, o de no drop. El argumento Effect del evento OLEDragOver usa las siguientes constantes para indicar una accin de soltado: Constante Valor Descripcin VbDropEffectNone 0 El target drop no puede aceptar los datos. VbDropEffectCopy 1 El soltado resulta en un copiado. Los datos originales se mantienen intocables en el drag source. VbDropEffectMove 2 Se eliminan los datos del Drag source.

289

Nota: El argumento Effect de los eventos OLEDragOver y OLEGiveFeedback expresan los mismos efectos de soltado (Copy, Move, no drop) que el argumento AllowedEffects del evento OLEStartDrag. Ellos solamente se diferencian en que el evento OLEStartDrag especifica que efectos son permitidos, y OLEDragOver y OLEGiveFeedback usan el argumento Effect para indicar a la fuente cual de estas acciones ser tomada. El siguiente ejemplo de cdigo inquiere al objeto DataObject por un formato de dato compatible para el control target. Si el dato es compatible, el argumento Effect informa al source que el movimiento ser efectuado si el dato es soltado. Si el dato no es compatible, el source ser informado y el apuntador no drop del ratn ser desplegado. Private Sub txtTarget_OLEDragOver(Data As _ Vb.DataObject, Effect As Long, Button As _ Integer, Shift As Integer, X As Single, _ Y As Single, State As Integer) If Data.GetFormat (vbCFText) Then Effect = vbDropEffectMove And Effect Else Effect = vbDropEffectNone End If End Sub Cuando los datos del source son arrastrados sobre el target, y el evento OLEDragOver es disparado, el source le dice al target que efectos este permite (mover, copiar, no drop). Despus debe Usted seleccionar solo un efecto que ocurrir si el dato es soltado. El argumento Effect del evento OLEDragOver, informa al source que accin de soltado este soporta, y el source despus informa al usuario a travs del uso del evento OLEGiveFeedback para modificar el apuntador del ratn. El evento OLEGiveFeedback Para cambiar el comportamiento por defecto del apuntador del ratn basado en el argumento Effect del evento OLEDragOver, necesita especificar manualmente los nuevos valores del apuntador del ratn usando el evento OLEGiveFeedback. El evento OLEGiveFeedback del source es disparado automticamente cuando es puesto el argumento Effect del evento OLEDragOver. El evento OLEGiveFeedback contiene dos argumentos (Effect y DefaultCursors) que le permiten modificar los apuntadores del ratn por defecto en una operacin OLE drag and drop. El argumento Effect, al igual que los otros eventos OLE drag and drop, especifica si los datos sern copiados, movidos o rechazados. Sin embargo, el propsito de este argumento en el evento OLEGiveFeedback es permitirle proporcionar alimentacin visual personalizada al usuario cambiando el apuntador del ratn para indicar estas acciones. Constante Valor Descripcin VbDropEffectNone 0 El Drop Target no puede aceptar los datos. VbDropEffectCopy 1 El soltado resulta en un copiado. Los datos originales permanecen inalterables en el drag source. VbDrofEffectMove 2 Se borran los datos del drag source. VbDropEffectScroll &H80000000& El scrolling est por dar inicio o est ocurriendo en este momento. El valor es usado adicionalmente de los otros valores. Nota: El valor vbDropEffectScroll puede ser usado para algunas aplicaciones o controles para indicar que el usuario est causando scrolling moviendo el apuntador del ratn cerca de la orilla de una ventana de la aplicacin. El scrolling es soportado en forma automtica por algunos controles estndar Visual Basic. Podra necesitar programar el efecto scroll si arrastra datos dentro de un programa que contiene barras scroll por ejemplo, Word.

290

El argumento defaultcursors especifica si el juego de cursor OLE por defecto ser usado. Si este argumento se pone en falso le permite especificar sus propios cursores usando la propiedad ScreenMousePointer del objeto Screen. En la mayora de los casos, especificar apuntadores de ratn personalizados es innecesario porque el comportamiento por defecto del ratn es manipulado por OLE. Si decide especificar apuntadores de ratn personales usando el evento OLEGiveFeedback, necesitar agregar cada efecto posible, incluyendo scrolling. Es una buena idea programar efectos que puedan ser agregados ms adelante a travs de la creacin que otorgue el control del apuntador del ratn de regreso a OLE si un efecto desconocido es encontrado. El siguiente cdigo ejemplo describe los argumentos Effect y DefaultCursors y especifica los cursores personales (archivos .ico o .cur) para los efectos de copiado, movido y scroll a travs de establecer las propiedades MousePointer y MouseIcon del objeto Screen. Tambin regresa el control del apuntador del ratn de regreso a OLE si un efecto desconocido es encontrado. Private Sub txtSource_OLEGiveFeedback (Effect As Long, _ DefaultCursors As Boolean) DefaultCursors = False If Effect = vbDropEffectNone Then Screen.MousePointer = vbNoDrop ElseIf Effect = vbDropEffectCopy Then Screen.MousePointer = vbCustom Screen.MouseIcon = LoadPicture (c:\copy.ico) ElseIf Effect = (vbDropEffectCopy Or _ VbDropEffectScroll) Then Screen.MousePointer = vbCustom Screen.MouseIcon = _ LoadPicture (c:\copyscrl.ico) ElseIf Effect = vbDropEffectMove Then Screen.MousePointer = vbCustom Screen.MouseIcon = LoadPicture (c:\move.ico) ElseIf Effect = (vbDropEffectMove Or _ VbDropEffectScroll) Then Screen.MousePointer = vbCustom Screen.MouseIcon = _ LoadPicture (c:\movescrl.ico) Else si algn nuevo formato es agregado que no entendemos, permita que OLE lo maneje con los correctos atributos por defecto: DefaultCursors = True End If End Sub Nota: Siembre debe inicializar el apuntador del ratn en el evento OLECompleteDrag si especifica un apuntador de ratn personal en el evento OLEGiveFeedback. Para mayor informacin acerca de informar al source cuando los datos son soltados vea Soltando el OLE Drag Source dentro del OLE Drag Target. Para establecer las propiedades MousePointer y MouseIcon vea Personalizando el apuntador del ratn. Soltando el OLE Drag Source dentro del OLE Drop Target Si su target soporta operaciones manuales OLE drag and drop, puede controlar lo que sucede cuando el cursor es movido dentro del target y puede especificar qu tipo de datos aceptar el target. Cuando se suelta el objeto source dentro del control target, el evento OLEDragDrop es usado para requerir al objeto DataObject por un formato de dato compatible, y despus recupera los datos. El evento OLEDragDrop tambin informa al source de la accin del drop, permitiendo, por ejemplo, borrar los datos originales si el movido de datos ha sido especificado.

291

Recuperando los datos El evento OLEDragDrop es disparado cuando el usuario suelta el source dentro del target. Si se han depositado datos dentro del objeto DataObject cuando la operacin de arrastre fue iniciada, estos pueden ser recuperados cuando el evento OLEDragDrop es disparado, usando el mtodo GetData. Sin embargo, si solamente los formatos source soportados fueron declarados cuando la operacin de arrastre fue iniciada, entonces el mtodo GetData automticamente dispara el evento OLESetData en el source para situar los datos dentro de l, y despus recupera los datos del objeto DataObject. El siguiente ejemplo recupera los datos que fueron situados en el objeto DataObject cuando la operacin de arrastre fue iniciada. La operacin de arrastre puede haber sido iniciada manualmente (usando el mtodo drag en el source) o automticamente (estableciendo la propiedad OLEDragMode del source a automtico). Los datos arrastrados son recuperados usando el mtodo GetData del objeto DataObject. El mtodo GetData le provee de constantes que representan los tipos de datos que soporta el objeto DataObject. En este caso se recuperan los datos como texto: Private Sub txtTarget_OLEDragDrop (Data As _ Vb.DataObject, Effect As Long, Button As _ Integer, Shift As Integer, X As Single, _ Y As Single) TxtTarget.Text = Data.GetData (vbCFText) End Sub Para una lista completa de constantes del formato GetData vea El objeto DataObject OLE drag and drop ya visto en este captulo. Interpelando al objeto DataObject Puede necesitar interpelar al objeto DataObject por los tipos de datos que estn siendo soltados dentro del target. Usa el mtodo GetFormat y la declaracin If Then para especificar los tipos de datos que el control del target puede aceptar. Si los datos dentro del objeto DataObject son compatibles, la accin del drop ser completada: Private Sub txtTarget_OLEDragDrop (Data As _ Vb.DataObject, Effect As Long, Button As _ Integer, Shift As Integer, X As Single, _ Y As Single) If Data.GetFormat (vbCFText) Then TxtTarget.Text = Data.GetData (vbCFText) End If End Sub Situando los datos dentro del objeto DataObject Cuando el target usa el mtodo GetData para recuperar los datos del source, el evento OLESetData es disparado si los datos no fueron situados dentro del source cuando la operacin de arrastre haya sido iniciada. En muchos casos, especialmente si el source soporta ms de un formato, o si el tiempo est transcurriendo para la creacin de los datos, puede situar los datos dentro del objeto DataObject solamente cuando es requerido por el target. El evento OLESetData permite al source responder solamente una vez por un determinado formato de datos. Por ejemplo, si los formatos de datos soportados fueron especificados usando el evento OLEStartDrag cuando la operacin de arrastre fue iniciada, pero los datos no fueron situados en el objeto DataObject, el evento OLESetData es usado para situar un especfico formato de datos dentro del objeto DataObject. Private Sub txtSource_OLESetData (Data As _ Vb.DataObject, DataFormat As Integer) If DataFormat = vbCFText Then Data.SetData txtSource.SelText, vbCFText End If

292

End Sub Informando al source cuando los datos son soltados El argumento effect del evento OLEDragDrop especifica como los datos fueron incorporados dentro del target cuando los datos fueron soltados. Cuando este argumento es establecido, el evento OLECompleteDrag es disparado en el source con este argumento effect puesto en este valor. El source puede despus tomar la accin adecuada: por ejemplo, si ha sido especificado mover, el source borra los datos. El argumento effect del evento OLEDragDrop usa las mismas constantes del argumento effect del evento OLEDragOver para indicar la accin de soltado. La siguiente tabla lista estas constantes: Constante Valor Descripcin VbDropEffectNone 0 El target drop no acepta los datos. VbDropEffectCopy 1 El soltado resulta en un copiado. Los datos originales permanecen inalterables en el source drag. VbDropEffectMove 2 El drag source remueve los datos. El siguiente ejemplo establece el argumento effect para indicar la accin de soltado: Private Sub txtTarget_OLEDragDrop (Data As _ Vb.DataObject, Effect As Long, Button As _ Integer, Shift As Integer, X As Single, _ Y As Single) If Data.GetFormat (vbCFText) Then TxtTarget.Text = Data.GetData (vbCFText) End If Effect = vbDropEffectMove End Sub En el lado source, es disparado el evento OLECompleteDrag cuando el source es depositado en el target, o cuando la operacin OLE drag and drop es cancelada. El OLECompleteDrag es el ultimo evento en la operacin OLE drag and drop. El evento OLECompleteDrag contiene solamente un argumento (effect), el cual es usado para informar al source de la accin que fue tomada cuando los datos son soltados dentro del target. El argumento effect regresa los mismos valores que son usados por el argumento effect de los otros eventos OLE drag and drop: vbDropEffectNone, vbDropEffectCopy y vbDropEffectMove. Por ejemplo, estableciendo este argumento despus que un movimiento ha sido especificado por el target y el source ha sido soltado dentro del target, el source borrar los datos originales en el control. Puede usar el evento OLECompleteDrag para borrar el apuntador del ratn si especific un apuntador de ratn personal en el evento OLEGiveFeedback. Por ejemplo: Private Sub txtSource_OLECompleteDrag (Effect As Long) If Effect = vbDropEffectMove Then TxtSource.SelText = End If Screen.MousePointer = vbDefault End Sub Usando el ratn y el teclado para modificar los efectos de soltado y respuestas del usuario Puede mejorar los eventos OLEDragDrop y OLEDragOver usando los argumentos button y shift para responder a los estados de los botones del ratn y de las teclas SHIFT, CTRL, ALT. Por ejemplo, cuando arrastre datos dentro de un control, puede permitir al usuario elegir entre un copiado de datos, presionando la tecla CTRL, y un movido de datos, presionando la tecla SHIFT.

293

En el siguiente ejemplo, el argumento shift del evento OLEDragDrop es usado para determinar si la tecla SHIFT est presionada cuando los datos son soltados. Si as es, un movimiento de datos es ejecutado. Si no lo es, un copiado de datos es ejecutado. Private Sub txtTarget_OLEDragDrop (Data As _ Vb.DataObject, Effect As Long, Button As _ Integer, Shift As Integer, X As Single, _ Y As Single) If Shift And vbCtrlMask Then TxtTarget.Text = Data.GetData(vbCFText) Effect = vbDropEffectCopy Else TxtTarget.Text = Data.GetData (vbCFText) Effect = vbDropEffectMove End If End Sub El argumento button puede ser usado para aislar y responder a los diversos estados del botn del ratn. Por ejemplo, puede desear permitir al usuario mover los datos presionando simultneamente los botones derecho e izquierdo del ratn. Para indicar al usuario qu accin ser tomada cuando el objeto source es arrastrado sobre el target y es presionado el botn del ratn o las teclas SHIFT, CTRL, ALT, puede establecer los argumentos shift y button del evento OLEDragOver. Por ejemplo, para informar al usuario que accin ser tomada cuando la tecla SHIFT es presionada durante una operacin de arrastre, puede agregar el siguiente cdigo al evento OLEDragOver: Private Sub txtTarget_OLEDragOver (Data As _ Vb.DataObject, Effect As Long, Button As _ Integer, Shift As Integer, X As Single, _ Y As Single, State As Integer) If Shift And vbCtrlMask Then Effect = vbDropEffectCopy Else Effect = vbDropEffectMove End If End Sub Vea Detectando los botones del ratn y Detectando los estados de las teclas CTRL, SHIFT, ALT para mayor informacin acerca de responder sobre los estados del teclado y de los botones del ratn. Arrastrando archivos desde el explorador de windows Puede usar OLE drag and drop para arrastrar archivos desde el explorador de windows dentro de un control Visual Basic apropiado o viceversa. Por ejemplo, puede seleccionar una serie de archivos con el explorador de windows, y abrirlos todos en un control TextBox a travs de arrastrarlos y soltarlos todos ellos dentro del control. Para ilustrar esto, el siguiente procedimiento usa un control TextBox y los eventos OLEDragOver y OLEDragDrop para abrir una serie de archivos de texto usando la propiedad Files y el formato de datos vbCFFiles del objeto DataObject. 1. 2. Para arrastrar archivos de texto dentro de un control TextBox desde el explorador de windows: Inicie un nuevo proyecto en Visual Basic. Agregue un control TextBox al formulario. Establezca su propiedad OLEDropMode a Manual. Establezca su propiedad MultiLine a True, y borre la propiedad Text. Agregue una funcin para seleccionar e indexar una serie de archivos. Por ejemplo: Sub DropFile (ByVal txt As TextBox, ByVal strFN$) Dim iFile As Integer

3.

294

iFile = FreeFile open strFN For Input Access Read Lock Read _ Write As #iFile Dim Str$, strLine$ While Not EOF (iFile) And Len (Str) <= 32000 Line Input #iFile, strLine$ If Str<> Then Str = Str & vbCrLf Str = Str & strLine Wend Close #iFile txt.SelStart = Len(txt) txt.SelLength = 0 txt.SelText = Str End Sub

4. Agregue el siguiente procedimiento al evento OLEDragOver. El mtodo GetFormat es usado para


comprobar por un formato de datos compatible (vbCFFiles). Private Sub Text1_OLEDragOver (Data As _ vb.DataObject, Effect As Long, Button As Integer, _ Shift As Integer, X As Single, Y As Single, State _ As Integer) If Data.GetFormat (vbCFFiles) Then si los datos estn en el formato apropiado, informe al source sobre la accin que ser tomada. Effect = vbDropEffectCopy And Effect Exit Sub End If si los datos no estn en el formato deseado, no soltar. Effect = vbDropEffectNone End Sub

5. Finalmente, agregue el siguiente procedimiento al evento OLEDragDrop:


Private Sub Text1_OLEDragDrop (Data As _ vbDataObject, Effect As Long, Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Data.GetFormat (vbCFFiles) Then Dim vFN For Each vFN In Data.Files DropFile Text1, vFN Next vFN End If End Sub 6. Corra la aplicacin, abra el explorador de windows, seleccione diversos archivos, y arrstrelos dentro del control TextBox. Cada uno de los archivos de texto ser abierto dentro del TextBox.

Personalizando el apuntador del ratn Puede usar las propiedades MousePointer y MouseIcon para desplegar un icono personal, un cursor, o cualquiera de una variedad de apuntadores de ratn predefinidos. Por ejemplo, cambiar el apuntador del ratn le otorga un medio para informar al usuario de que se estn desarrollando extensas tareas, que un control o ventana pueden ser modificados de tamao, o que determinado control no soporta drag and drop. El uso de iconos personales o apuntadores de ratn le permite expresar un interminable rango de informacin visual acerca del estado y funcionalidad de su aplicacin.

295

Con la propiedad MousePointer puede seleccionar cualquiera de los diecisis apuntadores predefinidos. Estos apuntadores representan varios eventos de sistema y procedimientos. La siguiente tabla describe algunos de estos apuntadores y sus usos posibles en su aplicacin. Apuntador Constante Descripcin VbHourglass El despliegue del reloj de arena dice al usuario que espere. VbSizePointer El despliegue de una flecha que seala en dos sentidos dice al usuario que puede modificar el tamao de una ventana. VbNoDrop El despliegue de un crculo con una raya transversal indica al usuario que no puede soltar un archivo en este sitio. Cada opcin de apuntador es representada por un valor entero. El valor por defecto es 0 Default y usualmente es desplegado como el apuntador flecha windows estndar. Sin embargo, este valor por defecto es controlado por el sistema operativo y puede cambiar si los valores de ratn del sistema han sido cambiados por el usuario. Para controlar el apuntador del ratn en su aplicacin establece la propiedad MousePointer al valor apropiado. Una lista completa de apuntadores de ratn est disponible seleccionando la propiedad MousePointer de un control o formulario y explorar la lista de valores que aqu se presentan, o a travs del uso del Object Browser y buscar por MousePointerConstants. Cuando establece la propiedad MousePointer para un control, el apuntador aparece cuando el ratn est sobre el correspondiente control. Cuando establece la propiedad MousePointer para un formulario, el apuntador seleccionado aparece tanto cuando el ratn se encuentra en reas en blanco en el formulario y cuando el ratn est sobre los controles cuya propiedad MousePointer haya sido puesta en 0 Default. En tiempo de ejecucin puede establecer los valores de los apuntadores del ratn ya sea usando los valores enteros o las constantes de los apuntadores de ratn Visual Basic. Por ejemplo: Form1.MousePointer = 11 o vbHourGlass Para una lista completa de los apuntadores de ratn vea MousePointer Constants en Language Reference en Books Online. Iconos y cursores Puede establecer el apuntador del ratn para desplegar un icono personal o un cursor. El uso de los iconos personales o cursores le permite modificar la apariencia o funcionalidad de su aplicacin. Los iconos son simplemente archivos .ico, igual a los que son embarcados con Visual Basic. Los cursores son archivos .cur y, al igual que los iconos, son esencialmente mapas de bits. Sin embargo, los cursores son creados especficamente para mostrar al usuario donde las acciones iniciadas por el ratn se llevarn a efecto ellos pueden representar el estado del ratn y la ubicacin actual de entrada de datos. Los cursores tambin contienen informacin punto caliente. El punto caliente es un pixel que rastrea la ubicacin del cursor las coordenadas x, y. Tpicamente el punto caliente es ubicado en el centro del cursor. Los iconos, cuando son cargados dentro de Visual Basic a travs de la propiedad MouseIcon, son convertidos al formato cursor y el punto caliente es establecido en el pixel central. Ambos difieren en que la ubicacin del punto caliente de un archivo .cur puede ser cambiado, mientras que un archivo .ico no lo puede ser. Los archivos cursor pueden ser editados con un editor de imgenes (Image Editor), el cual est disponible en Windows SDK. Nota: Visual Basic no soporta cursores de color; ellos son desplegados en blanco y negro. Sin embargo, cuando use la propiedad MouseIcon para crear un apuntador de ratn personal, considere qu es ms importante: el color, o la ubicacin de rastreo. Si es el color, use un icono de color. Si necesita de rastreo de precisin, use un cursor. Para usar un icono personal o cursor, establece tanto la propiedad MousePointer como la propiedad MouseIcon. Para usar un archivo .ico como apuntador de ratn:

296

1. Seleccione un formulario o control y establezca la propiedad MousePointer a 99 Custom. 2. Cargue un archivo .ico dentro de la propiedad MouseIcon. Por ejemplo, para un formulario: Form1.MouseIcon = LoadPicture (c:\Program _ Files\Microsoft Visual _ Basic\Icons\Computer\Disk04.ico) Ambas propiedades deben ser establecidas apropiadamente para un icono para aparecer como un apuntador de ratn. Si el icono no es cargado en el MouseIcon cuando la propiedad MousePointer es puesta en 99 Custom, se usar el apuntador de ratn por defecto. De igual forma, si la propiedad MousePointer no es puesta a 99 Custom, el valor MouseIcon es ignorado. Nota: Visual Basic no soporta archivos de cursores animados (.ani). Vea MouseIcon Property y MousePointer Property en Language Reference en Books Online. Respondiendo a eventos del teclado Los eventos del teclado, junto con los eventos del ratn, son los elementos primarios de la interaccin del usuario con su programa. Las presiones de clic y teclas disparan eventos y proporcionan los medios para la entrada de datos y las formas bsicas de ventana y navegacin de mens. Aunque el sistema operativo proporciona en forma invisible el control de estas acciones, a veces es til o necesario modificar o mejorarlas. Los eventos KeyPress, KeyUp, y KeyDown le permiten hacer estas modificaciones y mejoras. Programar su aplicacin para que responda a eventos de teclado se conoce como escribir manejadores de teclado. Un manejador de teclado puede trabajar en dos niveles: a nivel de control y a nivel de formulario. El manejador a nivel de control (bajo nivel) permite a su programa control especfico. Por ejemplo, puede desear convertir todo el texto escrito en un control TextBox a maysculas. Un manejador a nivel de formulario permite al formulario a primero reaccionar a los eventos de teclado. El enfoque puede entonces ser orientado a un control o controles en el formulario, y los eventos pueden ser repetidos o iniciados. Con estos eventos de teclado puede escribir cdigo para manejar la mayora de las teclas de un teclado estndar. Escribiendo manejadores de teclado de bajo nivel Visual Basic proporciona tres eventos que son reconocidos por formularios y por cualquier control que acepte entrada por teclado. Ellos son descritos en la siguiente tabla: Evento de teclado Ocurre KeyPress Cuando una tecla que corresponde a un carcter ASCII es presionada. KeyDown Cuando cualquier tecla en el teclado es presionada. KeyUp Cuando cualquier tecla en el teclado es soltada. Solamente el objeto que tiene el enfoque puede recibir el evento del teclado. Para eventos de teclado, un formulario tiene el enfoque solamente si est activo y ningn control en ese formulario tiene el enfoque. Esto ocurre solamente en formularios en blanco y en formularios en donde todos los controles han sido deshabilitados. Sin embargo, si establece la propiedad KeyPreview de un formulario a True, el formulario recibe todos los eventos de teclado de cada control en el formulario antes de que el control los reconozca. Esto es til cuando desea ejecutar la misma accin si determinada tecla es presionada, independientemente del control que tenga el foco en ese momento. Los eventos KeyDown y KeyUp proporcionan el nivel ms bajo de respuesta de teclado. Use estos eventos para detectar una condicin que el evento KeyPress no est apto para reconocer, por ejemplo: Combinaciones especiales de teclas SHIFT, CTRL., ALT. Flechas de direccin. Note que algunos controles (botones de comandos, botones de opcin, y CheckBox) no reciben los eventos de las flechas de direccin. Las flechas de direccin se usan para moverse a otro control. PageUp y PageDown

297

Poder distinguir, entre las teclas del cuadro numrico tipo calculadora, de las teclas de nmero del tipo mquina de escribir que se muestran a lo largo del teclado. Poder responder a una tecla que est siendo soltada as como est siendo presionada (el evento KeyPress responde solamente cuando la tecla est siendo presionada). Teclas de funcin no incluidas en los comandos de men.

Los eventos de comandos no son mutuamente exclusivos. Cuando el usuario presiona una tecla, ambos eventos KeyDown y KeyPress son generados, seguido del evento KeyUp cuando el usuario suelta la tecla. Cuando se presiona una de las teclas que KeyPress no detecta, solamente ocurre el evento KeyDown, seguido del evento KeyUp. Antes de usar los eventos KeyUp y KeyDown, asegrese de que el evento KeyPress no es suficiente. Este evento detecta las teclas que corresponden a todos los caracteres ASCII estndar: letras, dgitos y puntuaciones de un teclado estndar, as como las teclas Enter, Backspace y Tab. Generalmente es ms fcil escribir cdigo para el evento KeyPress. Tambin debe considerar el uso de shortcut y teclas de acceso, que son descritas en Men Bsico en Formas, controles y mens. Las teclas shortcut puede ser adheridas a comandos de men, pero ellas pueden incluir teclas de funcin (incluyendo algunas combinaciones de teclas de funcin y SHIFT). Puede asignar teclas shortcut sin necesidad de escribir ningn cdigo. Nota: El juego de caracteres ANSI (American National Standard Institute) corresponden a los 256 caracteres que incluyen el alfabeto latino, marcas de publicidad (tales como el smbolo de derechos de autor, em dash, ellipsis), as como muchas alternas y letras acentuadas. Estos caracteres son representados por un nico valor numrico de un byte (0 255). El juego de caracteres de caracteres ASCII (American Standard Code for Information Interchange) es esencialmente un sub juego (0 127) del juego de caracteres ANSI y representa las letras estndar, los dgitos y puntuaciones de una mquina de escribir estndar. Los dos juegos de caracteres a menudo son referidos en forma intercambiable. El evento KeyPress El evento KeyPress ocurre cuando es presionada cualquier tecla que corresponda a un carcter ASCII. El juego de caracteres ASCII representa no solamente las letras, dgitos y puntuaciones de una mquina de escribir estndar sino la mayora de las teclas de control. Sin embargo, el evento KeyPress solamente reconoce las teclas ENTER, TAB y Backspace. Las otras teclas de funcin, edicin y navegacin pueden ser detectadas por los eventos KeyDown y KeyUp. Use el evento KeyPress siempre que desee procesar los caracteres ASCII estndar. Por ejemplo, si desea forzar que todos los caracteres de un TextBox sean maysculas, puede usar este evento para hacer este cambio a medida que son tecleadas las letras: Private Sub Text1_KeyPress (KeyAscci As Integer) KeyAscii = Asc (Ucase(chr(KeyAscii))) End Sub El argumento KeyAscii retorna un valor entero correspondiente a un cdigo carcter ASCII. El procedimiento anterior usa CHR para convertir el cdigo de carcter ASCII dentro de su correspondiente carcter, usa Ucase para convertir este carcter a mayscula, y ASC para retornar el resultado de regreso al cdigo de carcter. Usando los mismos cdigos de carcter ASCII, puede probar si una tecla reconocida por el evento KeyPress est siendo presionada. Por ejemplo, el siguiente procedimiento de evento usa KeyPress para detectar si el usuario est presionando la tecla Backspace: Private Sub Text1_KeyPress (KeyAscii As Integer) If KeyAscii = 8 Then MsgBox Ha presionado la tecla backspace. End Sub

298

Tambin puede usar las constantes reservadas de Visual Basic en lugar de cdigos de caracteres. La tecla Backspace en el ejemplo anterior tiene 8 como valor ASCII. La constante reservada para la tecla Backspace es vbKeyBack. Para ver una lista completa de los cdigos de carcter, vea Character Set (0 127) y Character Set (128255) en Language Reference en Books Online. Para ver la lista completa de constantes reservadas Visual Basic vea Key Code Constants o use el Object Browser y busque KeyCodeConstants. Tambin puede usar el evento KeyPress para alterar el comportamiento por defecto de ciertas teclas. Por ejemplo, si presiona Enter cuando no existe botn por defecto ocasiona un sonido. Puede anular este sonido interceptando la tecla Enter (cdigo de carcter 13) en el evento KeyPress: Private Sub Text1_KeyPress (KeyAscii As Integer) If KeyAscii = 13 Then KeyAscii = 0 End Sub Los eventos KeyDown y KeyUp Los eventos KeyUp y KeyDown reportan el exacto estado fsico del teclado: Una tecla es presionada (KeyDown) y una tecla es soltada (KeyUp). En contraste, el evento KeyPress no reporta el estado del teclado en forma directa este no reconoce el estado de la tecla presionada o soltada, este solamente suministra el carcter que la tecla representa. Un ejemplo que se presentar ilustra esta diferencia. Cuando se teclea la letra A mayscula, el evento KeyDown obtiene el cdigo ASCII para la A. El evento KeyDown obtiene el mismo cdigo cuando el usuario teclea la letra a minscula. Para poder determinar si el carcter es mayscula o minscula, estos eventos usan el argumento SHIFT. En contraste, el evento KeyPress trata las formas maysculas y minsculas como dos caracteres ASCII separados. Los eventos KeyDown y KeyUp regresan informacin sobre el carcter tecleado si se proporcionan los siguientes dos argumentos: Argumento Descripcin KeyCode Indica la tecla fsica presionada. En este caso, A y a retornan la misma tecla. Ellas tienen idntico valor de cdigo de tecla. Sin embargo, tenga presente que el 1 que est a lo largo del teclado y el 1 que est en el cuadro numrico tipo calculadora regresan diferentes teclas, an cuando ellas generen el mismo carcter. Shift Indica el estado de las teclas SHIFT, CTRL., ALT. Solamente examinando este argumento podr determinar cundo ha sido tecleada una letra mayscula y minscula. El argumento KeyCode El argumento KeyCode identifica una tecla a travs del valor ASCII o a travs de la constante del cdigo de tecla. Los cdigos de teclas para las teclas de letras son los mismos cdigos ASCII para las letras maysculas. De manera que, el cdigo de tecla tanto para A como para a es el valor retornado por Asc(A). El siguiente ejemplo usa el evento KeyDown para determinar si la tecla A ha sido presionada: Private Sub Text1_KeyDown (KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyA Then MsgBox Presion la tecla A. End Sub Presionando Shift + A y A sin la tecla Shift despliega el mensaje es decir, el argumento es verdadero en cada caso. Para poder determinar si la forma mayscula o minscula de la letra ha sido presionada necesita usar el argumento Shift. Vea el tpico El argumento Shift ms adelante en este captulo. Los cdigos de teclas para las teclas de nmeros y puntuaciones son el mismo carcter ASCII del nmero sobre la tecla. As el cdigo de tecla tanto para 1 y ! es el valor retornado por Asc(1). De nuevo, para probar por el carcter ! necesita usar el argumento Shift.

299

Los eventos KeyDown y KeyUp pueden reconocer la mayora de las teclas de control de un teclado estndar. Esto incluye las teclas de funcin (F1 F16), las teclas de edicin (Home, PageUp, PageDown, Delete, End, Insert), las teclas de navegacin (flecha derecha, flecha izquierda, flecha arriba y flecha abajo) y el teclado tipo calculadora. Estas teclas pueden ser probadas a travs del uso de las constantes de cdigos de teclas o el valor ASCII equivalente. Por ejemplo: Prvate Sub Text1_KeyDown (KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyHome Then MsgBox Presion la tecla Home. End Sub El argumento Shift Los eventos de teclado usan el argumento Shift de la misma forma que lo hacen los eventos del ratn como valores constantes y enteros que representan las teclas Shift, CTRL., ALT. Puede usar el argumento Shift con los eventos KeyDown y KeyUp para hacer una distincin entre los caracteres maysculas y minsculas, o para probar los diversos estados de los botones del ratn. A continuacin se muestra un ejemplo que determina si la forma de mayscula de una letra ha sido tecleada: Private Sub Text1_KeyDown (KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyA And Shift =1 Then MsgBox Presion la tecla A mayscula. End Sub Al igual que los eventos del ratn, los eventos KeyUp y KeyDown pueden detectar Shift, CTRL., ALT, en forma individual o sus combinaciones. El siguiente ejemplo prueba los estados especficos de la tecla Shift. Abra un nuevo proyecto y agregue la variable ShiftKey a la seccin de declaraciones del formulario: Dim ShiftKey As Integer Agregue un control TextBox al formulario y este procedimiento al evento KeyDown: Private Sub Text1_KeyDown (KeyCode As Integer, Shift As Integer) ShiftKey = Shift And 7 Select Case ShiftKey Case 1 o vbShiftMask Print Presion la tecla Shift. Case 2 o vbCtrlMask Print Presion la tecla Ctrl. Case 4 o vbAltMask Print Presion la tecla Alt. Case 3 Print Presion Shift y Ctrl. Case 5 Print Presion Shift y Alt. Case 6 Print Presion Ctrl y Alt. Case 7 Print Presion Shift, Ctrl, y Alt. End Select End Sub Mientras el control TextBox tenga el enfoque, cada tecla o combinacin de teclas imprime el mensaje correspondiente en el formulario cuando son presionadas. Vea Detectando los estados de Shift, CTRL., ALT ya visto anteriormente en este captulo. Escribiendo manejadores de teclado a nivel de formulario Cada evento KeyDown y KeyUp es adherido a un objeto especfico. Para escribir un manejador de teclado que se aplique a todos los objetos del formulario, establezca la propiedad KeyPreview del formulario a True. Cuando la propiedad KeyPreview es puesta en True, el formulario reconoce los eventos KeyPress, KeyUp y

300

KeyDown de todos los controles en el formulario antes de que los propios controles reconozcan los eventos. Esto hace que sea muy fcil proporcionar una respuesta comn a la presin de una tecla en particular. Puede establecer la propiedad KeyPreview del formulario a True a travs de la ventana de propiedades o a partir de cdigo en el procedimiento Form_Load: Private Sub Form_Load Form1.KeyPreview = True End Sub Puede probar los diversos estados de las teclas en el formulario declarando la variable ShiftKey y usando la declaracin Select Case. El siguiente procedimiento imprimir el mensaje en el formulario independientemente del control que tenga el enfoque. Abra un nuevo proyecto y agregue la variable ShiftKey a la seccin de declaraciones del formulario: Dim ShiftKey As Integer Agregue un TextBox y un CommandButton al formulario. Agregue el siguiente procedimiento al evento KeyDown del formulario: Private Sub Form_KeyDown (KeyCode As Integer, Shift As Integer) ShiftKey = Shift And 7 Select Case ShiftKey Case 1 o vbShiftMask Print Presion la tecla Shift. Case 2 o vbCtrlMask Print Presion la tecla Ctrl. Case 4 o vbAltMask Print Presion la tecla Alt. End Select End Sub Si ha definido una tecla shortcut para un control de men, el evento clic para ese control de men ocurre automticamente cuando el usuario pulsa esa tecla, pero no ocurre el evento de tecla. De manera similar, si existe un botn de comando en el formulario con su propiedad Default puesta en True, la tecla Enter ocasiona que el evento clic de ese botn de comando ocurra en vez del evento de tecla. Si existe un botn de comando con la propiedad Cancel puesta en True, la tecla ESC ocasiona que el evento clic de ese botn de comando ocurra en vez del evento de tecla. Por ejemplo, si agrega un procedimiento de evento clic al botn de comando y despus establece ya sea la propiedad Default o Cancel a True, al presionar las teclas Enter o ESC se anula el evento KeyDown. El siguiente procedimiento cierra la aplicacin: Private Sub Command1_Click () End End Sub Note que la tecla Tab mueve el enfoque de un control a otro y no ocasiona el evento de tecla a no ser que cada uno de los controles en el formulario estn deshabilitados o que tengan todos la propiedad TabStop en False. Cuando la propiedad KeyPreview del formulario est en True, el formulario reconoce los eventos de teclado antes que los controles, pero los eventos an ocurren para los controles. Para prevenir esto, pone el keyascii o los argumentos de cdigo de tecla en los procedimientos de eventos de teclas del formulario a cero. Por ejemplo, si no existe botn por defecto en el formulario, puede usar la tecla Enter para mover el enfoque de un control a otro: Private Sub Form_KeyPress (KeyAscii As Integer) Dim NextTabIndex As Integer, i As Integer) If KeyAscii = 13 Then If Screen.ActiveControl.TabIndex = Count-1 Then

301

NextTabIndex = 0 Else NextTabIndex = Screen.ActiveControl.TabIndex + 1 End If For i = 0 To Count 1 If Me.Controls(i).TabIndex = NextTabIndex Then Me.Controls(i).SetFocus Exit For End If Next i KeyAscii = 0 End If End Sub En vista de que este cdigo pone keyascii a cero cuando este es 13, los controles nunca reconocen cuando la tecla Enter es presionada, y sus procedimientos de eventos de teclas jams son llamados. Traduccin: Derechos de Autor: RBsoftware (2001) Sbado, 30 de junio del 2001. 08:49am. Archivo: Traduccin VB32.

Trabajando con texto y grficos Visual Basic incluye sofisticadas capacidades grficas y de texto para ser usadas en su aplicacin. Si piensa que el texto es un elemento visual, podr ver que el tamao, la forma y el color pueden ser usados para resaltar la informacin presentada. Al igual que un peridico usa los encabezados, columnas y vietas para agrupar las palabras, las propiedades de texto le pueden ayudar para dar nfasis a conceptos importantes y detalles de inters. Visual Basic tambin proporciona capacidades grficas permitindole gran flexibilidad en el diseo, incluyendo adicionalmente de animacin a travs del despliegue de una secuencia de imgenes. Este captulo describe los medios para situar y manipular texto y grficos. Los detalles sobre formato, fuentes, paletas de color, e impresin son incluidos. A travs de la combinacin de estas capacidades con buenos conceptos de diseo, puede optimizar el atractivo y facilidad de uso de su aplicacin. Tpicos

Trabajando con fuentes Explica cmo elegir fuentes para su aplicacin y establecer las caractersticas de las fuentes. Desplegar texto en formularios y PictureBox Describe el uso del mtodo Print para imprimir mensajes en formularios, PictureBox o Printer. Formatear nmeros, fechas y horas Cmo desplegar nmeros, fechas y horas en diferentes formatos. Trabajando con texto seleccionado Seleccin y manipulacin de texto en un TextBox o en un ComboBox. Transferir texto y grficos con Clipboard Object Cmo cortar, copiar y pegar elementos al Clipboard. Entendiendo el sistema de coordenadas Cmo definir la ubicacin de los controles y formularios. Uso de controles grficos Cubre las propiedades que se aplican a todos los controles grficos.

302

Uso de mtodos grficos Cmo usar mtodos grficos para crear lneas y figuras. Trabajando con color Todo sobre desde lo bsico del color hasta el manejo de paletas de color mltiples. Uso del Picture Object Cmo manejar grficos con el objeto Picture o un arreglo de objectos Picture. Impresin Cubre las consideraciones para la impresin de texto y grficos desde su aplicacin.

Trabajando con fuentes El texto es desplegado usando una fuente un juego de caractersticas del mismo tipo, disponible en un tamao particular, estilo y talla. El sistema operativo Windows le proporciona un juego completo de fuentes estndar. Las fuentes TrueType son escalables, lo que significa que ellas pueden reproducir un carcter de cualquier tamao. Cuando selecciona una fuente TrueType, esta es convertida dentro del tamao de puntos seleccionados y desplegada como un mapa de bits en la pantalla. Cuando se imprime, la fuente seleccionada TrueType es convertida dentro de su tamao apropiado y despus es enviada a la impresora. En consecuencia, no hay necesidad para separar las fuentes de pantalla e impresora. Sin embargo, las fuentes de impresin sern sustituidas por fuentes TrueType si se encuentra disponible una fuente equivalente, lo cual incrementa la velocidad de impresin. Eligiendo fuentes para su aplicacin Recuerde que el usuario de su aplicacin puede que no tenga las mismas fuentes que us para crear la aplicacin. Si selecciona una fuente TrueType que no tiene el usuario, Windows selecciona la fuente que ms se asemeje en el sistema del usuario. Dependiendo del diseo de su aplicacin, esto puede causar problemas al usuario. Por ejemplo, puede que la fuente seleccionada por Windows alargue el texto de manera las etiquetas vayan ms all del ancho que tenga la pantalla. Una forma de eliminar los problemas de fuentes es distribuir las fuentes necesarias con su aplicacin. Puede tambin programa su aplicacin para ver las fuentes disponibles en el sistema operativo para ver si existen las fuentes que usa. Si la fuente no reside en el sistema operativo, puede programar la aplicacin para que elija una fuente diferente de la lista. Otra forma para evitar problemas de fuentes es usar fuentes que la mayora de usuarios tendrn en sus sistemas. Si usa fuentes de una versin especfica de Windows, tendr que especificar que esa versin es un requerimiento de sistema en su aplicacin. Viendo las fuentes disponibles Su programa puede con facilidad determinar si existen fuentes equivalentes tanto en el sistema del usuario y la impresora. La propiedad Fonts se aplica a los objetos Printer y Screen. Un arreglo retornado por la propiedad Fonts es una lista de todas las fuentes disponibles para impresora o pantalla. Puede iterar dentro del arreglo y buscar los nombres de cadenas equivalentes. El ejemplo de cdigo que sigue a continuacin determina si el sistema tiene en la impresora una fuente que equivalga a la fuente seleccionada en el formulario: Private Sub Form_Click ( ) Dim I As Integer, Flag As Boolean For I = 0 To Printer.FontCount 1 Flag = StrComp (Font.Name, Printer.Fonts(I),1) If Flag = True Then Debug.Print Existe una fuente equivalente. Exit For End If Next I

303

End Sub Estableciendo las caractersticas de las Fuentes Los formularios, los controles que despliegan texto (como texto o ttulos), y el objeto Printer soportan la propiedad Font, que determinan la caracterstica visual del texto, incluyendo: Nombre de la fuente (typeface). Tamao de la fuente (en puntos). Caractersticas especiales (negrita, cursiva, subrayada, sobre escrita). Estableciendo las propiedades de las fuentes Puede establecer cualquiera de las propiedades de las fuentes en tiempo de diseo dndole doble clic a Font en la ventana de propiedades y estableciendo las propiedades en la caja de dilogo Font. En tiempo de ejecucin, establece las caractersticas de las fuentes poniendo las propiedades del objeto Font para cada formulario y control. La siguiente tabla describe las propiedades para el objeto Font. Propiedad Tipo Descripcin Name String Especifica el nombre de la fuente, tales como Arial o Courier. Size Single Especifica el tamao de la fuente en puntos (una pulgada equivale a 72 puntos cuando se imprime). Bold Bolean Si es True, el texto es en negrita. Italic Bolean Si es True, el texto es en cursiva. StrikeThrough Bolean Si es True, Visual Basic sobre escribe el texto. Underline Bolean Si es True, el texto es subrayado. Weight Integer Regresa o establece la talla de la fuente. Ms all de cierta talla, la propiedad Bold es forzada a True. Por ejemplo, las siguientes declaraciones establecen diversas propiedades de fuente para una etiqueta llamada lblYearToDate: UIT lblYearToDate.Font .Name = Arial cambia la fuente a Arial. .Bold = True convierte la fuente en negrita. End With El orden en que selecciona las propiedades de la fuente es importante porque no todas las fuentes soportan todas las variaciones de fuentes. Primero establezca la propiedad Name. Despus puede poner las propiedades booleanas, tales como negrita y cursiva, a True o False. Puede tambin almacenar un juego de propiedades de fuentes en el objeto Font. Puede declarar el objeto Font tal a como lo hara con cualquier otro objeto, usando la clase StdFont: Dim MyFont As New StdFont With MyFont .Name = Arial .Size = 10 .Bold = True End With Nota: Antes de que pueda crear un nuevo objeto Font, debe usar la caja de dilogo References (disponible a travs del men Proyect) para crear una referencia a los Standard OLE Types. Puede despus con facilidad cambiar de un juego de propiedades de fuentes a otro, a travs de establecer el objeto Font del control o del formulario al del nuevo objeto: Set lblYearToDate.Font = MyFont Para mayor informacin vea Font Object en Language Reference en Books Online.

304

Trabajando con Small Fonts Algunas fuentes no soportan los tamaos menores que ocho puntos. Cuando pone la propiedad Size para una de estas fuentes a un tamao menor que ocho puntos, ya sea la propiedad Name o la propiedad Size automticamente cambian a una fuente diferente o a un tamao diferente. Para evitar resultados impredecibles, cada vez que establezca la propiedad Size a un tamao menor que ocho puntos, examine los valores de la propiedad Name y de la propiedad Size de nuevo despus de haberlos puesto. Aplicando las propiedades de fuentes a objetos especficos El efecto de establecer las propiedades de fuentes vara dependiendo de las tcnicas usadas para desplegar texto. Si el texto es especificado por una propiedad (tales como Text o Caption), entonces el cambio de una propiedad fuente se aplica a todo el texto en ese control. Los Label, TextBox, Frame, Button, CheckBox, y todos lo controles del sistema de archivos usan una propiedad para especificar el texto. Si la aplicacin muestra el texto con el mtodo Print, entonces cambiar la propiedad de la fuente afecta a todos los usos de Print despus de haber cambiado la propiedad. El texto impreso antes de haber cambiado la propiedad no es afectado. Solamente los formularios, PictureBox, y los objetos Debug y Printer soportan los mtodos Print. En vista de que los cambios en las propiedades de las fuentes se aplican a todo el texto en los TextBox y Label, no puede mezclar fuentes en estos controles. Si necesita mezclar fuentes (por ejemplo, hacer algunas palabras en negritas y dejar el resto en normal), entonces debe crear un PictureBox y usar el mtodo Print para desplegar el texto. La propiedad FontTransparent Los formularios y PictureBox tienen una propiedad de fuente adicional, FontTransparent. Cuando FontTransparent es True, el fondo se muestra a travs del texto desplegado en el formulario o en el PictureBox. Desplegando texto en formularios y PictureBox Para desplegar texto en un formulario o PictureBox use el mtodo Print, precedido por el nombre del formulario o del PictureBox. Para enviar el texto de salida a una impresora, use el mtodo Print del objeto Printer. Usando el mtodo Print La sintaxis del mtodo Print es: [Object.]Print[outputlist][{;|,}] El argumento Object es opcional; si es omitido, el mtodo Print se aplica al formulario actual. Por ejemplo, las siguientes declaraciones imprimen mensajes a: Un formulario llamado MyForm: MyForm.Print Este es un formulario. Un PictureBox llamado picMiniMsg: picMiniMsg.Print Este es un PictureBox. El formulario actual: Print Este es el formulario actual. El objeto Printer: Printer.Print Este texto va hacia la impresora. El argumento outputlist es el texto que aparece en el formulario o PictureBox. Los elementos mltiples en el argumento outputlist deben ser separados por comas, por puntos y comas, o por ambos. Texto truncado

305

Si el formulario o PictureBox es muy pequeo para desplegar el texto, el texto es cortado. En donde el formulario o PictureBox corta el texto depende de las coordenadas de la ubicacin en la cual se dio inicio la impresin del texto. No puede navegar dentro de un formulario o PictureBox. Layering Cuando imprime texto en un formulario, el texto aparece en una capa detrs de cualquier control que haya sido situado en el formulario. De forma que imprimir en un formulario usualmente funciona mejor en un formulario especficamente creado para desplegar el texto. Desplegando diferentes elementos en una sola lnea Los elementos que despliega o imprime incluyen valores de propiedad, constantes y variables (sean de cadena o numricas). Los valores de nmeros positivos imprimen un espacio a la izquierda. Los valores de nmeros negativos sustituyen este espacio por su signo. Use un punto y coma (;) o una coma (,) para separar un elemento del siguiente. Si usa un punto y coma, Visual Basic imprime un elemento detrs del otro, sin dejar espacio entre los mismos. Si usa una coma, Visual Basic salta a la siguiente columna de la tabulacin. Por ejemplo, la siguiente declaracin imprime sobre el formulario actual: Print El valor de X es ; X; y el valor de Y es ; Y Si X contiene el valor 2 y Y contiene el valor 7, la declaracin produce la siguiente salida: El valor de X es 2 y el valor de Y es 7 Por defecto, cada mtodo Print imprime el texto y se mueve a la siguiente lnea. Si no existen elementos, Print simplemente hace avanzar una lnea. Una serie de declaraciones Print (en el siguiente ejemplo, para un PictureBox llamado picLineCount) automticamente usa lneas separadas: PicLineCount.Print Esta es la lnea 1. PicLineCount.Print Esta es la lnea 2. Sin embargo, situando un punto y coma o una coma al final de la primer declaracin, ocasiona que la siguiente salida de la declaracin Print aparezca en la misma lnea: PicLineCount.Print Todo esto aparece ; PicLineCount.Print en la misma lnea. Desplegando la salida de impresin a una ubicacin especfica Puede controlar la ubicacin de la salida de Print especificando las coordenadas de dibujo, usando una o ambas tcnicas: Use el mtodo CLS (Clear) para borrar un formulario o PictureBox y ubicarlas en las coordenadas de origen (0,0). Establecer las coordenadas de dibujo con las propiedades CurrentX y CurrentY. El mtodo CLS Todo el texto y los grficos en el objeto que fueron creados con los mtodos Print y grficos pueden ser borrados con el mtodo CLS. El mtodo Cls tambin borra las coordenadas de dibujo a su origen (0,0), la cual es por defecto la esquina superior izquierda, por ejemplo, estas declaraciones borran: Un PictureBox llamado Picture1: Picture1.Cls El formulario actual: Cls Estableciendo las coordenadas de dibujo Puede establecer las coordenadas de dibujo en formularios y PictureBox directamente con las propiedades CurrentX y CurrentY. Por ejemplo, estas declaraciones borran las coordenadas de dibujo a la esquina superior izquierda para Picture1 y el formulario actual:

306

Un PictureBox llamado Picture1: Picture1.CurrentX = 0 Picture1.CurrentY = 0 El formulario actual: CurrentX = 0 CurrentY = 0

Cualquier nuevo texto que imprima aparecer encima de cualquier texto o grfico que ya exista en esa ubicacin. Para borrar texto en forma selectiva, dibuje un cuadro con el mtodo Line y llnelo con el color de fondo. Tenga presente que las coordenadas de dibujo especificadas por CurrentX y CurrentY usualmente cambian de ubicacin cuando usa mtodos grficos. Por defecto, los formularios y PictureBox usan un sistema de coordenadas en donde cada unidad corresponde a un twip (1,440 twips equivalen a una pulgada, y aproximadamente 567 twips equivale a un centmetro). Puede desear cambiar la propiedad ScaleMode del formulario, PictureBox o del objeto Printer de twips a points, en vista de que la altura del texto es medida en puntos. El uso de la misma unidad de medida para el texto y para el objeto en donde desea imprimir el texto facilita calcular la posicin para el texto. Los mtodos TextHeight y TextWidth Antes de usar el mtodo Print, puede usar los mtodos TextHeight y TextWidth para determinar dnde posicionar las propiedades CurrentX y CurrentY. TextHeight retorna la altura de una lnea de texto, tomando en cuenta el tamao de la fuente del objeto y el estilo. La sintaxis es: [Object.]TextHeight(String) Si el argumento String contiene caracteres de retorno de carro incrustados (Chr(13)), entonces el texto corresponde a lneas mltiples, y TextHeight retorna la altura del nmero de lneas de texto contenidas en la cadena. Si no existen caracteres de retorno de carro incrustados, TextHeight siempre retorna la altura de una lnea de texto. Una forma para usar el mtodo TextHeight es poner la propiedad CurrentY a una lnea en particular. Por ejemplo, las siguientes declaraciones establecen las coordenadas al inicio de la quinta lnea: CurrentY = TextHeight (ejemplo) * 4 CurrentX = 0 Asumiendo que no existe retorno de carro en el texto ejemplo, usa esta sintaxis para poner CurrentY a la lnea n: CurrentY = [Object.] TextHeight (String) * (n 1) Si object es omitido, el mtodo se aplica al formulario actual. El argumento Object puede ser un formulario, un PictureBox, o el objeto Printer. El mtodo TextWidth retorna el largo de una cadena, tomando en cuenta el tamao de la fuente del objeto y el estilo. Este mtodo es til porque muchas fuentes tienen caracteres de largo proporcional. El mtodo TextWidth ayuda para determinar si el largo de la cadena es ms largo que el formulario, el PictureBox o el objeto Printer. Por ejemplo, las siguientes declaraciones usan TextWidth y TextHeight para centrar el texto en un cuadro a travs del posicionamiento de CurrentX y CurrentY. El nombre del cuadro en este ejemplo es MealCard. CurrentX = (BoxWidth TextWidth (MealCard)) / 2 CurrentY = (BoxHeight TextHeight (MealCard)) / 2 Formateo de nmeros, fechas y horas

307

Visual Basic proporciona gran flexibilidad en el despliegue de nmeros formateados, as como fecha formateada y hora formateada. Puede con facilidad desplegar nmeros, fechas y horas en formato internacional. La funcin Format convierte el valor numrico a una cadena de texto y le brinda control sobre la apariencia de la cadena. Por ejemplo, puede especificar el nmero de posiciones decimales, despliegue de ceros a la izquierda o a la derecha, y formatos de moneda. La sintaxis es: Format (expression[,format[,firstdayofweek[,firstweekofyear]]]) El argumento expression especifica un nmero a convertir, y el argumento format es una cadena hecha de smbolos que muestra cmo formatear el nmero. Los smbolos ms comnmente usados se muestra en la siguiente lista: Smbolo Descripcin 0 Guardador de dgito; imprime cero a la izquierda en esta posicin, si es apropiado. # Guardador de dgito; nunca imprime cero a la izquierda en esta posicin. . Guardador del punto decimal. , Separador de miles. -+( ) space Carcter literal; los caracteres son desplegados exactamente como son escritos en la cadena de formateo. El argumento firstdayofweek es una constante que especifica el primer da de la semana; el argumento firstweekofyear es una constante que especifica la primera semana del ao. Ambos argumentos son opcionales. Nombres de formatos Visual Basic proporciona diversos formatos estndar a ser usados con la funcin Format. En vez de designar smbolos en el argumento format, especifica estos formatos por su nombre en el argumento format de la funcin Format. Siempre encierre el nombre del formato en doble comillas (). El cuadro siguiente muestra los nombres de formato que puede usar: Nombre del formato Descripcin General Number Despliega los nmeros sin separador de miles. Currency Despliega los nmeros con separador de miles, si es apropiado; despliega dos dgitos a la derecha del separador de decimales. La salida es basada en la configuracin del sistema. Fixed Despliega al menos un dgito a la izquierda y dos dgitos a la derecha del separador de decimales. Standard Despliega nmeros con separadores de millar, al menos un dgito a la izquierda y dos dgitos al separador de la derecha. Percent Multiplica el valor por 100 y agrega un signo de porcentaje al final. Scientific Usa notacin cientfica estndar. General Date Muestra la fecha y el tiempo si expresin contiene ambas. Si expresin es solo fecha o tiempo, la informacin que falte no es desplegada. La fecha que se despliega depende de la configuracin del sistema. Long Date Usa el formato Long Date especificado por la configuracin del sistema. Mdium Date Usa el formato dd-mmm-yy (por ejemplo, 03-Apr-93). La fecha que se despliega depende de la configuracin del sistema. Short Date Usa el formato Short Date especificado por la configuracin del sistema. Long Time Despliega la hora usando el formato long-time de la configuracin del sistema; incluye horas, minutos, segundos. Mdium Time Muestra hora, minuto y am o pm usando el formato hh:mm am/pm. Short Time Muestra la hora y minuto usando el formato hh:mm. Yes/No Cualquier valor numrico no cero (usualmente 1) es Yes. Cero es No. True/False Cualquier valor numrico no cero (usualmente 1) es True. Cero es False. On/Off Cualquier valor numrico no cero (usualmente 1) es On. Cero es Off.

308

La funcin Format soporta otros caracteres especiales, tales como porcentaje y exponentes. Formateo de nmeros Las siguientes conversiones numricas asumen que el pas en el panel de control de Windows es English (United States). Sintaxis de Format Resultado Format (8315.4, 00000.00) 08315.40 Format (8315.4, #####.##) 8315.4 Format (8315.4, ##,##0.00) 8,315.40 Format (315.4,$##0.00) $315.40 El smbolo para el separador de decimales es un punto (.), y el smbolo para el separador de los millares es una coma (,). Sin embargo, este carcter separador en realidad depende del pas especificado en el panel de control de Windows. Imprimiendo fechas y horas formateadas Para imprimir fechas y horas formateadas, use la funcin Format con smbolos que representen la fecha y la hora. Estos ejemplos usan las funciones Now y Format para formatear e identificar la fecha y hora actual. Los siguientes ejemplos asumen que la caja de dilogo Regional Settings del panel de control de Windows est establecida en English (United States). Sintaxis del Format Resultado Format (Now, m/d/yy) 1/27/93 Format (Now, dddd, mmmm dd, yyyy) Wednesday, January 27, 1993. Format (Now, d-mmmm) 27-Jan Format (Now, mmmm-yy) January-93 Format (Now, hh:mm am/pm) 07:18 am Format (Now, h:mm:ss a/p) 7:18:00 a Format (Now, d-mmmm h:mm) 3-January 7:18 Trabajando con texto seleccionado Los TextBox y ComboBox tienen una serie de propiedades para el texto seleccionado que son especialmente tiles cuando se trabaja con el Clipboard. Estas propiedades, que se refieren al texto seleccionado (resaltado) dentro del control, le permiten crear funciones de cortado, pegado, copiado, para el usuario. Todas las siguientes propiedades pueden ser cambiadas en tiempo de ejecucin. Propiedad Descripcin SelStart Un entero largo que especifica la posicin de inicio del texto seleccionado. Si no existe texto seleccionado, esta propiedad indica el punto de insercin. Un valor de cero indica la posicin justamente antes del primer carcter del TextBox o del ComboBox. Un valor igual a la longitud del texto en el TextBox o en el ComboBox indica la posicin justamente despus del ltimo carcter dentro del control. SelLength Un entero largo que especifica el nmero de caracteres seleccionados. SelText Una cadena conteniendo los caracteres seleccionados (o una cadena vaca, si no existen caracteres seleccionados). Puede controlar qu texto seleccionar estableciendo las propiedades SelStart y SelLength. Por ejemplo, estas declaraciones resaltan todo el texto en un TextBox: Text1.SetFocus inicie el resaltado antes del primer carcter: Text1.SelStart = 0 resaltar hasta el final del texto: Text1.SelLength = Len (Text1.Text)

309

Si asigna una nueva cadena a SelText, esta cadena sustituye el texto seleccionado, y el punto de insercin es situado justamente despus del final del nuevo texto insertado. Por ejemplo, la siguiente declaracin sustituye el texto seleccionado con la cadena !Acabo de ser insertado!: Text1.SelText = !Acabo de ser insertado! Si no existe texto seleccionado, la cadena simplemente es pegada dentro de la caja de texto en el punto de insercin. Transfiriendo texto y grficos con el objeto Clipboard El objeto Clipboard no tiene propiedades o eventos, pero tiene diversos mtodos que le permiten transferir datos desde y hacia el ambiente del Clipboard. Los mtodos Clipboard caen dentro de tres categoras. Los mtodos GetText y SelText son usados para transferir texto. Los mtodos GetData y SetData transfieren grficos. Los mtodos GetFormat y Clear trabajan con formatos de texto y grficos. Para aprender acerca del Clipboard, vea los siguientes tpicos: Cortado, copiado y pegado de texto con el Clipboard Describe los mtodos GetText y SelText. Trabajando con mltiples formatos en el Clipboard Cubre los mtodos que trabajan con formato de datos que no sean de texto. Chequeando los formatos de datos en el Clipboard Describe el uso del mtodo GetFormat para determinar el formato de datos en el Clipboard.

Traduccin: Derechos de Autor: RBsoftware (2001) Martes, 3 de julio del 2001. 07:54am. Archivo: Traduccin VB33.

Impresin La impresin es una de las tareas ms complejas que lleva a efecto una aplicacin basada en Windows. Los buenos resultados dependen en que todas las partes del proceso trabajen en conjunto. Los resultados pobres pueden originarse de problemas de su aplicacin, variaciones en los controladores de impresora, o capacidades limitadas de la impresora. Aunque es una buena idea probar su aplicacin con las impresoras comnmente usadas, no podr hacer pruebas con todas las posibles combinaciones de impresoras y controladores que puedan existir. La impresin desde su aplicacin involucra estos tres componentes: El cdigo de su aplicacin que inicia el proceso de impresin. Los controladores de impresora instalados en su sistema y en los sistemas que usen su aplicacin. Las capacidades de las impresoras disponibles para los usuarios de su aplicacin. El cdigo en su aplicacin determina el tipo y cualidad de la salida de impresin disponible desde su aplicacin. Pero los controladores de la impresora y las impresoras de los usuarios tambin tienen impacto en la cualidad de la impresin. Imprimiendo desde una aplicacin Visual Basic proporciona tres tcnicas para impresin de texto y grficos. Puede producir la salida que desea en un formulario y despus imprimir el formulario usando el mtodo PrintForm.

310

Puede enviar texto y grficos a la impresora estableciendo la impresora por defecto a un miembro de la coleccin Printers. Puede enviar texto y grficos al objeto Printer y despus imprimirlos usando los mtodos NewPage y EndDoc.

Esta seccin examina las ventajas y desventajas de estos tres puntos de vista. Usando el mtodo PrintForm El mtodo PrintForm enva una imagen del formulario especificado a la impresora. Para imprimir informacin desde su aplicacin con PrintForm, primero despliega la informacin en un formulario y despus imprime ese formulario con el mtodo PrintForm. La sintaxis es la siguiente: [form.]PrintForm Si omite el nombre del formulario, Visual Basic imprime el formulario actual. PrintForm imprime el formulario completo, an cuando parte del formulario no sea visible en la pantalla. Sin embargo, si el formulario contiene grficos, los grficos se imprimen solamente si la propiedad AutoRedraw del formulario est en True. Cuando la impresin finaliza, PrintForm llama al mtodo EndDoc para limpiar la impresora. Por ejemplo, puede enviar texto a la impresora imprimindolo en un formulario y despus llamar a PrintForm con las siguientes instrucciones: Print Aqu hay un texto. PrintForm El mtodo PrintForm es el medio ms fcil para imprimir desde su aplicacin. En vista de que se enva la informacin a la impresora en la resolucin que tenga la pantalla del usuario (tpicamente 96 dots por pulgada), los resultados pueden ser desagradables en impresoras con resoluciones mayores (tpicamente 300 dots por pulgadas en impresoras lser). Los resultados pueden variar en dependencia de los objetos que estn en el formulario. Usando la coleccin Printers La coleccin Printers es un objeto que contiene todas las impresoras que estn disponibles en el sistema operativo. La lista de las impresoras es la misma que est disponible en la caja de dilogo Print Setup o en el panel de control de Windows. Cada impresora en la coleccin tiene un ndice nico para su identificacin. Inicindose desde cero, cada impresora en la coleccin puede ser referenciada por este nmero. Sin importar el mtodo de impresin que use, toda la salida de impresin de una aplicacin Visual Basic se dirige hacia el objeto Printer, que inicialmente est representada por la impresora por defecto especificada en el panel de control de Windows. Sin embargo, puede poner por defecto a cualquier impresora de los miembros que existan en la coleccin Printers. Para seleccionar una impresora de la coleccin, use la siguiente sintaxis: Set Printer = Printers (n) Las siguientes instrucciones imprimen los nombres de los dispositivos de todas las impresoras que tenga el sistema operativo en la ventana inmediata: Private Sub Command1_Click ( ) Dim x As Printer For Each x In Printers Debug.Print x.DeviceName Next End Sub Nota: No puede crear nuevas instancias del objeto Printer en cdigo, y no puede directamente agregar o remover impresoras de la coleccin Printers. Para agregar o remover impresoras en su sistema use el panel de control de Windows.

311

Usando el objeto Printer El objeto Printer es un dispositivo independiente de espacio de escritura que soporta los mtodos Print, Pset, Line, PaintPicture y Circle, para crear texto y grficos. Usa estos mtodos en el objeto Printer tal a como lo hara en un formulario o en un PictureBox. El objeto Printer tambin tiene todas las propiedades de fuentes descritas anteriormente en este captulo. Cuando finaliza situando la informacin en el objeto Printer, usa el mtodo EndDoc para enviar la salida a la impresora. Cuando la aplicacin se cierra, automticamente usa el mtodo EndDoc para enviar cualquier informacin pendiente al objeto Printer. El objeto Printer proporciona la mejor calidad de impresin a travs de una variedad de impresoras en vista de que Windows convierte texto y grficos del dispositivo independiente de espacio de escritura del objeto Printer al que mejor equivalga a la resolucin y habilidad de la impresora. Puede imprimir documentos de mltiples pginas usando el mtodo NewPage en el objeto Printer. La principal desventaja del uso del objeto Printer es la cantidad de cdigo requerida para obtener los mejores resultados. La impresin de mapas de bits en el objeto Printer tambin toma tiempo y puede en consecuencia disminuir el tiempo de ejecucin de la aplicacin. Imprimiendo con el objeto Printer Existen diversos medios para situar texto y grficos en el objeto Printer. Para imprimir con el objeto Printer, haga una de las siguientes opciones: Asigne el miembro especfico de la coleccin Printers al objeto Printer si desea imprimir hacia una impresora que no es la impresora por defecto. Site el texto y grficos en el objeto Printer. Imprima el contenido del objeto Printer con los mtodos NewPage y EndDoc. Propiedades del objeto Printer Las propiedades del objeto Printer inicialmente coinciden con los de la impresora por defecto establecida en el panel de control de Windows. En tiempo de ejecucin, puede establecer las propiedades del objeto Printer, que incluyen: PaperSize, Height, Width, Orientation, ColorMode, Duplex, TrackDefault, Zoom, DriverName, DeviceName, Port, Copies, PaperBin, y PrintQuality. Si la propiedad TrackDefault est en True y cambia la impresora por defecto en el panel de control de Windows, los valores de la propiedad del objeto Printer reflejarn las propiedades de la nueva impresora por defecto. No podr cambiar algunas propiedades en medio de una pgina una vez que las propiedades hayan sido establecidas. Los cambios a estas propiedades solamente afectarn a las pginas subsecuentes. Las siguientes instrucciones muestran cmo puede imprimir cada pgina usando diferentes cualidades de impresin: For pageno = 1 To 4 Printer.PrintQuality = - 1 * pageno Printer.Print La Cualidad de esta pgina es; pageno Printer.NewPage Next Los valores de la cualidad de impresin van de 4 a 1, o un entero positivo correspondiente a la resolucin de impresin en dots por pulgada (DPI). Por ejemplo, el siguiente cdigo establecer la resolucin de la impresora a 300 DPI: Printer.PrintQuality = 300 Nota: El efecto de los valores de la propiedad Printer depende del controlador suministrado por el fabricante de la impresora. Algunos valores de propiedad pueden que no tengan efecto, o diferentes valores de propiedad puede que tengan todos el mismo efecto. Los valores fuera del rango aceptado puede o no puede que produzcan errores.

312

Propiedades Scale El objeto Printer tiene estas propiedades Scale: ScaleMode ScaleLeft y ScaleTop ScaleWidth y ScaleHeight Zoom Las propiedades ScaleLeft y ScaleTop definen las coordenadas X, Y, respectivamente, de la esquina superior izquierda de una pgina a imprimir. A travs del cambio de los valores de ScaleLeft y de ScaleTop, puede crear los mrgenes izquierdo y superior de una pgina impresa. Por ejemplo, puede usar ScaleLeft y ScaleTop para centrar un formulario impreso (PFrm) en la pgina usando estas declaraciones: Printer.ScaleLeft = - ((Printer.Width PFrm.Width) / 2 ) Printer.ScaleTop = - ((Printer.Height PFrm.Height) / 2 ) Muchas impresoras soportan la propiedad Zoom. Esta propiedad define el porcentaje a travs del cual la salida es escalada. El valor por defecto de la propiedad Zoom es de 100, indicando que la salida ser impresa al cien por ciento de su tamao (tamao actual). Puede usar la propiedad Zoom para hacer la pgina que imprime ms pequea o ms grande que la pgina de papel actual. Por ejemplo, poner Zoom a 50 hace que su pgina impresa aparezca la mitad del ancho y la mitad del largo de la pgina de papel. La siguiente sintaxis establece la propiedad Zoom a la mitad del tamao del objeto Printer por defecto: Printer.Zoom = 50 Posicionando texto y grficos Puede poner las propiedades CurrentX y CurrentY del objeto Printer, igual a como lo hace con formularios y PictureBox. Con el objeto Printer, estas propiedades determinan dnde ubicar la salida en la pgina actual. Las siguientes instrucciones ponen las coordenadas de escritura en la esquina superior izquierda de la pgina actual: Printer.CurrentX = 0 Printer.CurrentY = 0 Puede usar los mtodos TextHeight y TextWidth para posicionar el texto en el objeto Printer, tal a como lo describe el siguiente tpico. Desplegando la salida de impresin a una ubicacin especfica Puede controlar la ubicacin de la salida de Print especificando las coordenadas de dibujo, usando una o ambas tcnicas: Use el mtodo CLS (Clear) para borrar un formulario o PictureBox y ubicarlas en las coordenadas de origen (0,0). Establecer las coordenadas de dibujo con las propiedades CurrentX y CurrentY.

El mtodo CLS Todo el texto y los grficos en el objeto que fueron creados con los mtodos Print y grficos pueden ser borrados con el mtodo CLS. El mtodo Cls tambin borra las coordenadas de dibujo a su origen (0,0), la cual es por defecto la esquina superior izquierda, por ejemplo, estas declaraciones borran: Un PictureBox llamado Picture1: Picture1.Cls El formulario actual: Cls Estableciendo las coordenadas de dibujo Puede establecer las coordenadas de dibujo en formularios y PictureBox directamente con las propiedades CurrentX y CurrentY. Por ejemplo, estas declaraciones borran las coordenadas de dibujo a la esquina superior izquierda para Picture1 y el formulario actual:

313

Un PictureBox llamado Picture1: Picture1.CurrentX = 0 Picture1.CurrentY = 0 El formulario actual: CurrentX = 0 CurrentY = 0

Cualquier nuevo texto que imprima aparecer encima de cualquier texto o grfico que ya exista en esa ubicacin. Para borrar texto en forma selectiva, dibuje un cuadro con el mtodo Line y llnelo con el color de fondo. Tenga presente que las coordenadas de dibujo especificadas por CurrentX y CurrentY usualmente cambian de ubicacin cuando usa mtodos grficos. Por defecto, los formularios y PictureBox usan un sistema de coordenadas en donde cada unidad corresponde a un twip (1,440 twips equivalen a una pulgada, y aproximadamente 567 twips equivale a un centmetro). Puede desear cambiar la propiedad ScaleMode del formulario, PictureBox o del objeto Printer de twips a points, en vista de que la altura del texto es medida en puntos. El uso de la misma unidad de medida para el texto y para el objeto en donde desea imprimir el texto facilita calcular la posicin para el texto. Los mtodos TextHeight y TextWidth Antes de usar el mtodo Print, puede usar los mtodos TextHeight y TextWidth para determinar dnde posicionar las propiedades CurrentX y CurrentY. TextHeight retorna la altura de una lnea de texto, tomando en cuenta el tamao de la fuente del objeto y el estilo. La sintaxis es: [Object.]TextHeight(String) Si el argumento String contiene caracteres de retorno de carro incrustados (Chr(13)), entonces el texto corresponde a lneas mltiples, y TextHeight retorna la altura del nmero de lneas de texto contenidas en la cadena. Si no existen caracteres de retorno de carro incrustados, TextHeight siempre retorna la altura de una lnea de texto. Una forma para usar el mtodo TextHeight es poner la propiedad CurrentY a una lnea en particular. Por ejemplo, las siguientes declaraciones establecen las coordenadas al inicio de la quinta lnea: CurrentY = TextHeight (ejemplo) * 4 CurrentX = 0 Asumiendo que no existe retorno de carro en el texto ejemplo, usa esta sintaxis para poner CurrentY a la lnea n: CurrentY = [Object.] TextHeight (String) * (n 1) Si object es omitido, el mtodo se aplica al formulario actual. El argumento Object puede ser un formulario, un PictureBox, o el objeto Printer. El mtodo TextWidth retorna el largo de una cadena, tomando en cuenta el tamao de la fuente del objeto y el estilo. Este mtodo es til porque muchas fuentes tienen caracteres de largo proporcional. El mtodo TextWidth ayuda para determinar si el largo de la cadena es ms largo que el formulario, el PictureBox o el objeto Printer. Por ejemplo, las siguientes declaraciones usan TextWidth y TextHeight para centrar el texto en un cuadro a travs del posicionamiento de CurrentX y CurrentY. El nombre del cuadro en este ejemplo es MealCard. CurrentX = (BoxWidth TextWidth (MealCard)) / 2 CurrentY = (BoxHeight TextHeight (MealCard)) / 2

314

Imprimir formularios en el objeto Printer Puede desear que su aplicacin imprima uno o ms formularios junto con informacin en esos formularios, especialmente si el diseo del formulario corresponde a un documento preimpreso tal como una factura o una tarjeta de tiempo. La forma ms fcil de hacerlo es usando el mtodo PrintForm. Para obtener una mejor cualidad si usa una impresora lser use los mtodos Print y graphics con el objeto Printer. Recuerde que el uso del objeto Printer toma ms planificacin, dado que debe recrear el objeto Printer antes de imprimirlo. Recrear el formulario en el objeto Printer puede tambin requerir volver a crear: El diseo del formulario, incluyendo ttulo y barra de mens. Los controles y su contenido, incluyendo texto y grficos. La salida de los mtodos grficos aplicados directamente al formulario, incluyendo el mtodo Print. La extensin de lo que tiene que recrear en el objeto Printer depende de su aplicacin y cunto de su formulario necesite imprimir. Recreacin de texto y grficos en un formulario Cuando crea texto y grficos en un formulario usando los mtodos Print, Line, Circle, PaintPicture, o Pset, puede desear tambin una copia de esta salida que aparezca en el objeto Printer. El modo ms fcil de lograr esto es escribir un procedimiento de dispositivo independiente para recrear el texto y los grficos. Por ejemplo, el siguiente procedimiento usa el mtodo PaintPicture para imprimir un formulario o los controles de la propiedad Picture a cualquier objeto de salida, tales como impresora u otro formulario: Sub PrintAnyWhere (Src As Object, Dest As Object) Dest.PaintPicture Src.Picture, Dest.Width / 2, Dest.Height / 2 If Dest Is Printer Then Printer.EndDoc End If End Sub Despus llama este procedimiento y le pasa los objetos fuente y de destino: PrintAnyWhere MyForm, Printer PrintAnyWhere MyForm, YourForm Imprimir controles en un formulario El objeto Printer puede recibir la salida del mtodo Print y de los mtodos grficos (tales como los mtodos Line o Pset). Pero no se pueden situar controles directamente en el objeto Printer. Si su aplicacin necesita imprimir controles, debe escribir procedimientos para volver a dibujar cada tipo de control que use en el objeto Printer, o usar el mtodo PrintForm. Imprimir el contenido del objeto Printer Una vez que ha situado texto y grficos en el objeto Printer, use el mtodo EndDoc para imprimir el contenido. El mtodo EndDoc avanza la pgina y enva toda la salida pendiente al spooler. Un spooler intercepta el trabajo de impresin en su camino a la impresora y lo enva al disco o a la memoria, en donde el trabajo de impresin es mantenido hasta que la impresora est lista para imprimirlo. Por ejemplo: Printer.Print Esta es la primera lnea de texto de un par de lneas. Printer.Print Esta es la segunda lnea de texto de un par de lneas. Printer.EndDoc Nota: Visual Basic automticamente llama a EndDoc si su aplicacin finaliza sin llamarlo explcitamente. Creacin de documentos de pginas mltiples Cuando se imprimen largos documentos, puede especificar en cdigo dnde desea que se inicie la nueva pgina usando el mtodo NewPage. Por ejemplo: Printer.Print Esta es la pgina 1. Printer.NewPage Printer.Print Esta es la pgina 2.

315

Printer.EndDoc Cancelando un trabajo de impresin Puede terminar el actual trabajo de impresin usando el mtodo KillDoc. Por ejemplo, puede inquirir al usuario con una caja de dilogo para determinar si imprimir o finalizar un documento: Sub PrintOrNot ( ) Printer.Print Esta es la primer lnea para demostrar el mtodo KillDoc. Printer.Print Esta es la segunda lnea para demostrar el mtodo KillDoc. Printer.Print Esta es la tercer lnea para demostrar el mtodo KillDoc. If VbNo = MsgBox (Imprimir este documento?, vbYesNo) Then Printer.KillDoc Else Printer.EndDoc End If End Sub Si el Print Manager del sistema operativo est manejando el trabajo de impresin, el mtodo KillDoc borra por completo el trabajo que envi a la impresora. Sin embargo, si el Print Manager no est controlando el trabajo de impresin, este no ser afectado por KillDoc. La cantidad de datos enviados a la impresora dependen de los controladores de impresin. Nota: No puede usar el mtodo KillDoc para terminar un trabajo de impresin que fue iniciado con el mtodo PrintForm. Traduccin: Derechos de Autor: RBsoftware (2001) Mircoles, 1 de agosto del 2001. 11:19am. Archivo: Traduccin VB34. Uso del control ImageList Puede usar el control ImageList como un recipiente de imgenes para que sean usadas por otros controles Common de Windows y por controles con una propiedad Picture. Uso de ImageList con otros controles Common de Windows El control ImageList puede ser usado para suministrar imgenes para los siguientes controles usando ciertas de sus propiedades, como se lista en la siguiente tabla: Windows Common Control ListView TreeView ToolBar TabStrip Control Object ListItem Node Button Tab Propiedades a ser activadas ImageList Propiedades SmallIcon y Icon Propiedades Image y SelectedImage Propiedad Image Propiedad Image con imgenes

Para usar ImageList con estos controles, primero debe asociar el ImageList con el otro control, y despus asignar la propiedad Key o la propiedad Index a una de las propiedades listadas en la tabla anterior. Esto puede ser logrado en tiempo de diseo y en tiempo de ejecucin. Todos los controles Common de Windows, a excepcin del control ListView (descrito en este tpico), tienen una propiedad ImageList que puede ser activada con el nombre del control ImageList que est usando. Importante: Antes debe cargar el control ImageList con imgenes para poder asociarlo con otro control. Una vez que haya asociado ImageList con un control, y asignado cualquier imagen a una propiedad del control, el control ImageList no le permitir que aada ms imgenes.

316

Para asociar el control ImageList con los controles TreeView, TabStrip y ToolBar en tiempo de diseo 1. D clic con el botn derecho del ratn sobre el control que usa las imgenes del control ImageList y d clic en Propiedades para desplegar la pgina de Propiedades. 2. En la Ceja General seleccione el nombre del control ImageList de la caja ImageList. Para asociar el control ImageList en tiempo de ejecucin, debe usar el siguiente cdigo: asociar un ImageList llamado imlImages con un control TreeView llamado tvwDB. Set tvwDB.ImageList = imlImages Una vez que haya asociado ImageList con otro control, puede establecer las propiedades para varios objetos usando la propiedad Key o la propiedad Index de una imagen en el control ImageList. Por ejemplo, el siguiente cdigo establece la propiedad Image del objeto Node del control TreeView a una imagen ImageList con la propiedad Key hoja. Private Sub Form_Load() ' The TreeView is named "tvwData." ' Add a node and set its Image property. ' The Key value of the image is "hoja." tvwData.Nodes.Add , ,"1 node","Top","hoja" End Sub Usando el control ImageList con el control ListView El control ListView puede usar dos controles ImageList de manera simultnea. En vez de tener una sola propiedad ImageList, el control ListView tiene las propiedades Icon y SmallIcons, cada una de las cuales puede ser asociada con un control ImageList. Esto pude ser logrado en tiempo de diseo y en tiempo de ejecucin. Para asociar dos controles ImageList con el control ListView en tiempo de diseo 1. D clic con el botn derecho sobre el control ListView y d clic en Propiedades para desplegar la pgina de Propiedades. 2. D clic en la Ceja Image Lists. 3. En la caja Normal seleccione un nombre de un control ImageList.. 4. En la caja Small seleccione el nombre de otro control ImageList. Puede tambin asignar controles ImageList en tiempo de ejecucin con cdigo, como el que se muestra a continuacin: ' Assuming the ListView control is named "lvwDB", the ' first ImageList is named "imlSmallImages," and the ' second is named "imlImages." Set lvwDB.SmallIcons = imlSmallImages Set lvwDB.Icons = imlImages El control ImageList usado depende del mode Display determinado por la propiedad View del control ListView. Cuando el control ListView tiene la propiedad View en Icon usa las imgenes suministradas por el ImageList nombrado en la propiedad Icons. En cualquier de las otras propiedades View (List, Report, o SmallIcon) ListView usa las imgenes del ImageList invocado en la propiedad SmallIcons. Asignando objetos ListImage por propiedad Index o por propiedad Key Despus que haya asociado el control ImageList con uno de los controles Common de Windows, puede especificar una imagen en particular usando la propiedad Index o la propiedad Key del ImageList. Por ejemplo, si est usando ImageList con el control TreeView, el siguiente cdigo asignar el tercer objeto ListImage (que tiene 3 en su valor de ndice) a una nueva propiedad Image del objeto Node:

317

' The TreeView control is named "tvwDB." ' The fifth argument of the Add method ' specifies an image by either the ListImage ' object's Index or Key property. tvwDB.Nodes.Add , , ,"node x", 3 Por otro lado, puede usar la propiedad Key para obtener igual resultado: ' Assuming the Key property is "open." tvwDB.Nodes.Add , , ,"node x", "open" En vista de que la propiedad Key del objeto ListImage debe ser una cadena nica, en tiempo de ejecucin, puede usar la propiedad Key en vez de la propiedad Index para referenciar la imagen. Esto da por resultado cdigo que es muy fcil de leer. Consejo: En vista de que la propiedad Key debe ser una cadena nica, el uso de un nombre descriptivo para cada objeto ListImage har su cdigo mucho ms fcil de leer y de explorar. Uso del control ImageList con controles que no son parte de los controles Common de Windows Puede tambin usar el ImageList como un depsito de imgenes para objetos que tienen la propiedad Picture. Estos incluyen los siguientes: CommandButton control OptionButton control Image control PictureBox control CheckBox control Form object Panel object (StatusBar control) La propiedad Picture del objeto ListImage regresa un objeto Picture que puede ser asignado a otra propiedad Picture del control. Por ejemplo, el siguiente cdigo desplegar el tercer objeto ListImage en un control PictureBox llamado picBox: Set picBox.Picture = ImageList1.ListImages(3).Picture Control ImageList Un control ImageList contiene una coleccin de objetos ListImage, cada uno de los cuales podrn ser referenciados a travs de su ndice o de una clave. El control ImageList no ha sido creado para que funcione en solitario, sino para que funcione como un depsito central de imgenes que de forma conveniente suministre a los otros controles estas imgenes. Sintaxis ImageList Puede usar el control ImageList con cualquier control que sea capaz de asignar un objeto Picture con una propiedad Picture. Por ejemplo, el siguiente cdigo asigna el primer objeto ListImage en una coleccin ListImages a la propiedad Picture de un panel StatusBar recientemente creado: Dim pnlX As Panel Set pnlX = StatusBar1.Panels.Add() ' Add a new Panel object. Set pnlX.Picture = ImageList1.ListImages(1).Picture ' Set Picture. .. Nota: Es obligatorio el uso de la declaracin SET para asignar una imagen al objeto Picture.

318

Imgenes de diferente tamao pueden ser agregadas a un control ImageList, pero internamente todas ellas son recortadas a un mismo tamao. El tamao de los objetos ListImage est determinado por una de las siguientes causas: Activar las propiedades ImageWidth e ImageHeight antes de agregar cualquier imagen. Las dimensiones de la primer imagen agregada. No est limitado a un tamao de imagen en particular, pero el nmero total de imgenes que pueden ser cargadas est limitada nicamente por la capacidad de memoria disponible. En tiempo de diseo, puede agregar imgenes usando la Ceja General de las propiedades de la caja de dilogo del control ImageList. En tiempo de ejecucin puede agregar imgenes usando el mtodo Add de la coleccin ListImages. Adems del almacenamiento de objetos Picture, el control ImageList puede ejecutar operaciones grficas sobre las imgenes antes de asignar estas a otros controles. Por ejemplo, el mtodo Overlay crea una imagen compuesta a partir de dos imgenes diferentes. Adicionalmente, puede sujetar uno o ms controles ImageList a ciertos controles Common de Windows 95 para ahorro de recursos del sistema. Estos incluyen los controles ListView, ToolBar, TabStrip, y TreeView. Para que pueda usar ImageList junto a uno de estos controles, debe asociar un ImageList en particular con el control a travs de una propiedad en particular. Para el control ListView, debe activar las propiedades Icons y SmallIcons para que enlacen los controles ImageList. Para los controles TreeView, TabStrip y ToolBar debe activar la propiedad ImageList para un control ImageList. Para estos controles, puede especificar un ImageList en tiempo de diseo, usando la caja de dilogo Custom Properties. En tiempo de ejecucin, puede tambin especificar un ImageList que activa la propiedad ImageList de un control TreeView, como lo muestra el siguiente ejemplo: TreeView1.ImageList = ImageList1 ' Specify ImageList.

Una vez que asocia un ImageList con un control, puede usar el valor de la propiedad Index o de la propiedad Key para referir un objeto ListImage en un procedimiento. El siguiente ejemplo establece la propiedad Image del objeto Node tercero del control TreeView al primer objeto ListImage en un control ImageList. ' Use the value of the Index property of ImageList1. TreeView1.Nodes(3).Image = 1 ' Or use the value of the Key property. TreeView1.Nodes(3).Image = "image 1" ' Assuming Key is "image 1." Nota de distribucin El control ImageList es parte de un grupo de controles ActiveX que son encontrados en el archivo COMCTL32.OCX. Para poder usar el control ImageList en su aplicacin, debe agregar el archivo COMCTL32.OCX a su proyecto. Al distribuir su aplicacin, instale el archivo COMCTL32.OCX en el directorio Microsoft Windows System, o en el directorio System32. Usando el control ImageList Un control ImageList contiene una coleccin de imgenes que pueden ser usadas por otros controles Common de Windows, especficamente los controles ListView, TreeView, TabStrip y ToolBar. Por

319

ejemplo, el control ImageList puede almacenar todas las imgenes que aparezcan en los botones del control ToolBar. El control ImageList puede tambin se usado con controles que asignen un objeto Picture a una propiedad Picture, tales como los controles PictureBox, Image y CommandButton. El uso del control ImageList como un simple depsito de imgenes le ahorra tiempo de desarrollo de software al permitirle que escriba cdigo que pueda referirse a un simple y consistente catlogo de imgenes. En vez de escribir cdigo que cargue mapas de bits e iconos (usando la funcin LoadPicture), puede poblar a ImageList de una vez, asignando los valores Key deseados, y escribiendo cdigo que use la propiedad Key o la propiedad Index para referirse a las imgenes. El control usa archivos de mapas de bits o iconos en una coleccin de objetos ListImage. Puede agregar o remover imgenes en tiempo de diseo o en tiempo de ejecucin. El objeto ListImage tiene las siguientes propiedades que son estndar del objeto: Key, Index, y Count. Tambin posee mtodos estndar tales como: Add, Remove y Clear. Finalmente, el control resalta las caractersticas de los mtodos Overlay, Draw y ExtractIcon, que le permiten hacer una composicin de imgenes, dibujar imgenes sobre objetos con la propiedad hDC (tales como los objetos Form y Printer) y creacin de icono a travs de un mapa de bits almacenado en el control. Usos posibles Almacenar imgenes que representen archivos abiertos, archivos cerrados y documentos. Estas imgenes pueden despus ser asignadas de forma dinmica al objeto Node del control TreeView para representar sus diferentes estados a la vez que se expande o contrae, o si es o no es un flder o un documento. Almacenar imgenes que representan operaciones comunes del computador, tales como guardar, abrir, e imprimir archivos. Estas imgenes pueden despus ser asignadas a objetos Button en un control ToolBar usado por su aplicacin. Almacenar imgenes para operaciones drag and drop, tales como los iconos MousePointer y DragIcons. Manejo de objetos ListImage y de colecciones ListImages El control ListImage contiene la coleccin ListImages de objetos ListImage, cada uno de los cuales puede ser referenciados por los valores de las propiedades Index y Key. Puede agregar o remover imgenes en el control en tiempo de diseo y en tiempo de ejecucin. Agregar objetos ListImage en tiempo de diseo Para agregar una imagen en tiempo de diseo, usa la caja de dilogo Property Pages del control ImageList. Para agregar objetos ListImage en tiempo de diseo 1. D clic con el botn derecho del ratn sobre el objeto ImageList y de clic en Propiedades. 2. De clic en la ceja Images para desplegar la pgina de propiedades del control ImageList. 3. D clic en Insert Picture para desplegar la caja de dilogo Select Picture. 4. Use la caja de dilogo para encontrar archivos de mapas de bits o de iconos, y de clic a Open. Nota: Puede seleccionar mltiples archivos de mapas de bits y de iconos. 5. Asigne una propiedad Key nica dndole clic a la caja Key a escribiendo un nombre. 6. Opcional. Asigne la propiedad Tag dndole clic a la caja Tag y escribiendo un nombre. La propiedad Tag no tiene que ser nica. 7. Repita los pasos 3 a 6 hasta que haya cargado en el control las imgenes deseadas. Agregando objetos ListImage en tiempo de ejecucin

320

Para agregar una imagen en tiempo de ejecucin use el mtodo Add de la coleccin ListImages en conjunto con la funcin LoadPicture. El siguiente ejemplo sucede en el evento Load del formulario; un control ImageList denominado imlImages es cargado con un nico mapa de bits: Private Sub Form_Load() ' Assuming the path is correct, the open.bmp ' picture will be added to the ListImages ' collection. The Key property will also be ' assigned the value "open" imlImages.ListImages. _ Add ,"open", LoadPicture("c:\bitmaps\open.bmp") End Sub La asignacin de un nico valor de propiedad Key al objeto ListImage le permite crear cdigo que es ms fcil de leer. Cuando asigne la imagen a una propiedad, puede usar el valor de Key en vez del valor de Index. De manera que, la asignacin de una imagen a una propiedad puede dar por resultado la escritura de un cdigo parecido al siguiente: ' Assign an image to a TreeView control Node object. ' The unique key of the image is "open". TreeView1.Nodes.Add , , ,"Folder1","open" Determinacin del tamao de las imgenes El control puede tambin contener imgenes .bmp o .ico de cualquier tamao, y las imgenes puede tener diferentes tamaos de archivos, pero el tamao del rea de despliegue ser igual. De manera general, el tamao de despliegue de la primer imagen insertada en el control determina el tamao de despliegue para las restantes imgenes que sern luego insertadas. Por ejemplo, si primero inserta un icono de 32 X 32 pixeles, todas las imgenes que inserte con posterioridad sern desplegadas en ese tamao en otros controles. Nota: Una excepcin es cuando usa una imagen de un control ImageList con el control Image. Estableciendo la propiedad Stretch del control Image a True causar que la imagen se ajuste a las dimensiones que tenga el control como rea de despliegue. En tiempo de diseo puede especificar la altura y anchura, en pixeles, de las imgenes en el control eligiendo un tamao de la ceja General de la caja de dilogo de la pgina de propiedades del control ImageList. Puede elegir un tamao predeterminado, o dar clic en Custom y ah establecer el tamao de la imagen escribiendo el tamao deseado en las cajas Height y Width. Esto puede ser hecho solamente cuando el control ImageList no tiene imgenes cargadas. Atentar cambiar el tamao despus que el control tenga imgenes dar por resultado un error. Mtodos que le permiten la creacin de composicin de imgenes Puede usar el control ImageList para crear una composicin de imagen (un objeto Picture) a partir de dos imgenes a travs del uso del mtodo Overlay en conjunto con la propiedad MaskColor. Por ejemplo, si tiene el no internacional, que es un crculo con una barra diagonal dentro de l, puede depositar esta imagen sobre cualquier otra imagen. La sintaxis para el mtodo Overlay requiere dos argumentos: el primer argumento especifica la imagen de fondo; el segundo argumento especifica la imagen que va sobre la imagen de fondo. Ambos argumentos pueden ser la propiedad Index o la propiedad Key de un objeto ListImage: As, el cdigo que logra el efecto anterior es el siguiente: ' The composite image appears in a PictureBox ' control named "picOver". The Index value of ' the cigarette image is 2; the index value of the ' "no" symbol is 1. ImageList1.MaskColor = vbGreen

321

Set picOver.Picture = ImageList1.Overlay(2, 1) Puede tambin usar la propiedad Key de las imgenes, lo cual da por resultado el siguiente cdigo: Assuming the first image's Key is "smokes", and the ' second is "no". Set picOver.Picture = ImageList1.Overlay("smokes","no") El ejemplo de cdigo anterior tambin ilustra cmo trabaja la propiedad MaskColor. En resumen, la propiedad MaskColor especifica el color que se convertir en transparente cuando una imagen es sobrepuesta en otra imagen. La imagen no tiene un fondo color verde. As, cuando el cdigo especifica que MaskColor ser vbGreen (una constante intrnsica), lo verde en la imagen se convierte en transparente en la imagen compuesta. Uso del control Toolbar Un control Toolbar contiene una coleccin de objetos Button usados para crear una barra de herramientas que puede asociarla a su aplicacin. Tpicamente una barra de herramientas contiene botones que corresponden a elementos en un men de la aplicacin, proporcionando una interfase grfica para el usuario para acceder a las funciones y comandos ms frecuentemente usados. El control Toolbar puede contener a otros controles, tales como los controles ComboBox y TextBox. Para crear una barra de herramientas debe agregar objetos Button a la coleccin Buttons; cada objeto Button puede tener texto opcional y / o una imagen, suministrada por un control ImageList asociado. Disponga el texto con la propiedad Caption y una imagen con la propiedad Image para cada objeto Button. En tiempo de diseo puede agregar objetos Button al control con la caja de dilogo de la pgina de propiedades del control Toolbar. En tiempo de ejecucin puede agregar o remover botones de la coleccin Buttons usando los mtodos Add y Remove. Para agregar otros controles en tiempo de diseo, simplemente dibuje los controles deseados sobre el control Toolbar. De forma alternativa, puede crear un objeto Button con un estilo Placeholder y ubicar el control deseado sobre el botn en un evento Resize. Dar doble clic sobre el Toolbar en tiempo de ejecucin invoca la caja de dilogo Customize Toolbar, que permite al usuario esconder, desplegar o reagrupar los botones de la barra de herramientas. Para activar o desactivar la caja de dilogo, establezca la propiedad AllowCustomize. Puede tambin invocar la caja de dilogo Customize Toolbar invocando el mtodo Customize. Si desea salvar o restaurar el estado de una barra de herramientas, o permitir que lo haga el usuario final, use los mtodos SaveToolbar y RestoreToolbar. Usos posibles Proporcionar una interfase consistente entre aplicaciones con barras de herramientas que se relacionen. Ubicar funciones ms comnmente usadas, tales como las operaciones con archivos, en un sitio de fcil acceso. Proporcionar una interfase grfica e intuitiva para su aplicacin. La coleccin Buttons El control Toolbar consiste en uno o ms objetos Button en una coleccin Buttons. Puede crear los objetos Button en tiempo de diseo y en tiempo de ejecucin. Cada botn puede contener una imagen, un ttulo y una sugerencia. Cada objeto Button tiene una propiedad Style (descrita ms adelante) que determina cmo se comportar el botn.

322

Asociar el control ImageList con el control Toolbar Las barras de herramientas usualmente se distinguen por iconos que representan una funcin de la aplicacin. Por ejemplo, el icono de un disquete usualmente es interpretado como la funcin salvar archivo. Para hacer que su barra de herramientas despliegue tales imgenes, debe primero asociar un control ImageList con el control Toolbar, y esto puede ser llevado a efecto en tiempo de diseo y en tiempo de ejecucin. Para asociar un control ImageList con un control Toolbar en tiempo de diseo 1. Poblar el control ImageList con las imgenes para la barra de herramientas. 2. Dar clic con el botn derecho del ratn sobre el control Toolbar y dar clic en Propiedades para abrir la pgina de propiedades. 3. En la ceja General, dar clic en la caja ImageList y seleccionar el control ImageList que haya cargado de imgenes. Para asociar un control ImageList con un control Toolbar en tiempo de ejecucin, simplemente establezca la propiedad ImageList al nombre del control ImageList, como se muestra en el ejemplo que sigue: Private Sub Form_Load() ' The Toolbar control is named "tlbTools," and the ' ImageList control is named "imlTools." tlbTools.ImageList = imlTools End Sub Crear botones en tiempo de diseo y en tiempo de ejecucin Para crear objetos Button en tiempo de diseo: 1. Dar clic con el botn derecho del ratn sobre el control Toolbar y dar clic en propiedades para desplegar la pgina de propiedades del Toolbar. 2. Dar clic en la ceja Buttons para desplegar la caja de dilogo. 3. Dar clic en InsertButton para insertar un nuevo objeto Button. 4. Establezca las propiedades apropiadas, tales como Key, Caption, Image, y ToolTipText. 5. Establezca la propiedad Style del objeto Button dndole clic a la caja Style y de ah seleccionar un estilo. Para crear una coleccin de objetos Button en tiempo de ejecucin 1. Declarar una variable objeto de tipo Button. A medida que agrega cada objeto Button, la variable contendr la referencia a los objetos creados ms recientemente. Use esta referencia para establecer diversas propiedades del nuevo objeto Button. 2. Usando la declaracin Set con el mtodo Add, establezca la variable objeto al nuevo objeto Button. 3. Usando la variable objeto, establezca las propiedades del nuevo objeto Button. El cdigo que se presenta a continuacin usa el evento Load del objeto Form para crear un objeto Button, despus establece la propiedades Key, Caption, TooltipText, y Style del nuevo objeto Button. Private Sub Form_Load() ' Declare a variable, then set using the Set ' statement with the Add method, create a new ' Button object, and set the object variable to ' the new Button. Use the reference to set ' properties. Dim myButton As Button Set myButton = tlbTools.Add() myButton.Key = "left" myButton.Caption = "Align Left" myButton.ToolTipText = "Align Left" myButton.Style = tbrSeparator End Sub

323

Consejo: Usando los argumentos del mtodo Add de la coleccin Button es ms eficiente que establecer las propiedades con la variable objeto. En este caso, el cdigo anterior podra escribirse as: tlbTools.Buttons.Add , "left", "Align Left", _ tbrSeparator La propiedad Style de Button determina el comportamiento del botn Una propiedad importante del objeto Button es la propiedad Style. La propiedad Style determina el comportamiento del botn y la funcin asignada al botn puede tener una relacin con el estilo aplicado. Los cinco estilos de botn se presentan a continuacin, con sus posibles usos: Constante TbrDefault Valor 0 Posible uso Usa el estilo de botn por defecto cuando la funcin que representa no tiene dependencia en otras funciones. Por ejemplo, la operacin Salvar Archivo puede ser ejecutada en cualquier momento. Adems, cuando el botn es presionado, ste respinga de nuevo cuando finaliza de hacer su trabajo. El estilo Check puede ser usado cuando la funcin que representa es un togle (un solo botn que se usa para dos cosas) de cierta forma, esto es, cuando el control es presionado, as permanece, hasta que es presionado de nuevo. Use el estilo BottonGroup cuando un grupo de funciones se excluyen mutuamente. Es decir, solamente una de las opciones puede estar activa dentro del grupo. Por ejemplo, el texto, en un control RichTextBox puede solamente estar alineado a la izquierda, centrado o a la derecha. Nota: aunque solamente un botn a la vez puede ser presionado, todos los botones dentro del grupo pueden estar sin presionar. El estilo Separator no tiene funcin excepto para crear un botn que es ocho pixeles de ancho. Use el estilo Separator para crear un botn que separe un botn de otro. O selo para encerrar el grupo de botones con el estilo ButtonGroup. El estilo Placeholder funciona como un botn dummy: use este botn para crear un espacio sobre el control Toolbar en donde desee hacer aparecer otro control (tales como un control ComboBox o Listbox).

TbrCheck

TbrButtonGroup

TbrSeparator

TbrPlaceholder

Ubicando los controles sobre la barra de herramientas Puede con facilidad situar otros controles, tales como ComboBox, TextBox y OptionButton, sobre el control de la barra de herramientas en tiempo de diseo. Para ubicar otros controles sobre la barra de herramientas en tiempo de diseo 1. Crear objetos Button y asignarles los valores de propiedades apropiadas. 2. Crear espacios reservados sobre la barra de herramientas en donde desea que aparezcan otros controles, en consecuencia agregue un botn con la propiedad Style en Placeholder y establezca la propiedad Width a un valor de propiedad apropiada. 3. Dibuje otros controles dentro del espacio ocupado por el placeholder. Restablecer otros controles dentro del evento Rezise Si la propiedad Wrappable es puesta en True, el control Toolbar ajusta su tamao al del formulario cuando el usuario modifica el tamao del formulario. Aunque los objetos Button se ajustan automticamente, los controles ubicados sobre ellos no lo hacen. Para permitir a que los controles ajusten su tamao, primero crear un objeto Button

324

con la propiedad Style en Placeholder y dibujar en el control sobre el espacio dibujado por el botn (como se muestra en el siguiente tpico). Entonces restablezca el control sobre el botn usando el mtodo Move en el evento Resize del objeto Form, como se muestra a continuacin: Private Sub Form_Resize() ' The Toolbar is named "tlbRTF" ' The Button object's Key is "btnFonts" ' The Combobox is named "cmbFonts" ' The ComboBox is placed over the position of the ' Button object using the Move method. With tlbRTF.Buttons("btnFonts") cmbFonts.Move .Left, .Top, .Width cmbFonts.ZOrder 0 End With End Sub Uso de la declaracin SelectCase en el evento ButtonClick para programar la funcionalidad del Button. El evento ButtonClick ocurre siempre que a un botn (excepto los botones con placeholder o que tenga la propiedad Style en Separator) se le de clic. Puede identificar al botn que se le dio clic a travs de su propiedad Index o Key. Use la declaracin SelectCase junto con una de las dos propiedades anteriormente citadas para programar la funcin del botn, como lo muestra el cdigo que se muestra a continuacin: Private Sub tlbRTF_Click(ByVal Button As Button) Select Case Button.Key Case "OpenFile" ' Call a user-defined function to open a file. OpenFile Case "Bold" ' Call a user-defined function to bold text. BoldText Case Else ' Handle other cases. End Select End Sub Uso de la propiedad MixedState para significar estados no determinados Algunas veces, una funcin en su aplicacin puede regresar un estado no deterrminado un estado que es una combinacin de dos o ms estados. Por ejemplo, si el usuario selecciona texto en un RichTextBox, y una parte del texto est en itlicas, el botn que representa el texto en itlicas no est en Check o en Unchecked sino que est en ambos estados a la vez. Para significar este estado no determinado, establezca la propiedad MixedState en True. Esto hace vibrar la imagen sobre el botn para crear un tercer estado de la imagen del botn. Establecer ToolTipText con la propiedad ToolTipText Un ToolTip es un texto que aparece sobre un botn siempre que el cursor se ubica sobre el objeto Button (sin darle clic). Puede agregar un ToolTip a cualquier botn en tiempo de diseo escribiendo el texto que desee que aparezca en la caja ToolTipText de las pginas de propiedades del control Toolbar.

325

En tiempo de ejecucin, puede cambiar en forma dinmica el ToolTip estableciendo la propioedad ToolTipText para el objeto Button. El siguiente cdigo ocurre dentro de un control CommandButton que cambia la propiedad Key y la propiedad ToolTipText de un botn: Private Sub cmdChangeButton_Click() ' The name of the toolbar is "tlbFunctions" ' Reset the Key and ToolTipText properties of ' a button with Key property value "1 funct" tlbfuncts.Buttons("1 funct"). _ ToolTipText = "Function 7" tlbfuncts.Buttons("1 funct").Key = "7 funct" End Sub Permitir al usuario que personalice la barra de herramientas Si establece la propiedad AllowCustomize en True, el usuario podr personalizar la barra de herramientas si le da un doble clic. Al dar doble clic aparece la caja de dilogo Customize Toolbar. De manera alterna, puede desplegar esta caja de dilogo invocando el mtodo Customize. Uso de los mtodos SaveToolbar y RestoreToolbar Si permite al usuario cambiar la configuracin de la barra de herramientas, puede guardar y restaurar la barra de herramientas a travs del uso de los mtodos SaveToolbar y RestoreToolbar. Por ejemplo, si diversos usuario usan la misma aplicacin, y tienen preferencias diferentes en el estilo y forma de la barra de herramientas, use el mtodo SaveToolbar para permitir que cada persona cree un barra de herramientas personal. Despus debe crear un procedimiento login para identificar a cada usuario, y usar esta identificacin para restaurar la barra de herramientas personalizada del usuario con el mtodo RestoreToolbar. El mtodo SaveToolbar guarda el estado actual del control Toolbar en el registro del sistema. El mtodo requiere tres argumentos. El primer argumento Key, debe ser un entero. El segundo y tercer argumento, Subkey y Value, deben ser cadenas. Para guardar diferentes versiones de la misma barra de herramientas dentro del mismo argumento Subkey, establezca el argumento Value a una cadena diferente. El cdigo que sigue a continuacin usa dos constantes para definir los primeros dos argumentos. En el evento Load del objeto Form, el cdigo invoca un procedimiento llamado Login que regresa el password del usuario. El cdigo despus usa este valor para restaurar una barra de herramientas previamente guardada. El botn de comando denominado cmdSaveToolbar guarda el estado actual usando los mismos tres valores. ' Declarations: SaveToolbar method constants. Const SaveKey = 1 Const SaveSubKey = "MyToolbar" Dim mSaveVal As String ' Module variable that ' identifies user. Private Sub Form_Load() ' Run a login procedure that identifies the ' user. Use the user's password to identifiy the ' user's toolbar.

326

mSaveVal = LogIn() ' Restore state of Toolbar1 using Constants. Toolbar1.RestoreToolbar SaveKey, SaveSubKey, _ mSaveVal End Sub Public Function LogIn() ' Ask the user for a password. LogIn = InputBox("Password") End Function Private Sub cmdSaveToolbar_Click() ' Save the toolbar using the same constants. Toolbar1.SaveToolbar SaveKey, SaveSubKey, mSaveVal End Sub Escenario ImageList: Agregar imgenes Open, Save y Print a un control barra de herramientas Las barras de herramientas tpicamente contienen una fila de botones, en donde cada botn, cuando es presionado, efecta una operacin que se usa con frecuencia. Los botones Toolbar a menudo ahorran espacio en pantalla a travs del uso de una imagen que representa una operacin. En este escenario, tres funciones comunes relacionadas con archivos - tales como abrir, guardar e imprimir, son representadas por imgenes asignadas a objetos Button de un control Toolbar. Estos objetos son usados en el siguiente ejemplo: Un control ImageList llamado imlTool. Un control Toolbar llamado tbrStandard. Para agregar imgenes al control Toolbar 1. Agregar imgenes a un control ImageList y asignarles valores de propiedad Key nicos para cada objeto. 2. Asociar el control ImageList con el control Toolbar. 3. Asignar imgenes a los objetos Button usando la ceja Buttons. Agregar imgenes al control ImageList y asignar un valor de propiedad Key nico Para agregar objetos ListImages en tiempo de diseo 1. Dar clic con el botn derecho del ratn sobre el control ImageList, y de clic sobre Propiedades para desplegar la caja de dilogo de la pgina de propiedades del control. 2. D clic en la ceja Images. 3. D clic en Insert Picture para desplegar la caja de dilogo Select Picture. 4. Use la caja de dilogo para encontrar archivos de mapas de bits. 5. Una vez encontrado el archivo, d clic sobre el archivo, y de clic en Open, o d doble clic sobre el archivo para insertarlo dentro del control ImageList. 6. En la ceja Images, d clic en la caja Key y teclee el valor de la propiedad Key. La siguiente tabla aclara este punto: File Open.bmp Save.bmp Key Open Save

327

Print.bmp

Print

Asociar el control ImageList con el control Toolbar Antes que pueda asignar objetos Button, primero debe asociar el control ImageList con el control Toolbar. Para asociar un control ImageList con un control Toolbar 1. D clic con el botn derecho del ratn sobre el control Toolbar y d clic en Propiedades para desplegar la pgina de propiedades del control. 2. En la ceja General, seleccione el nombre del control ImageList de la caja ImageList. Asignar imgenes a los objetos Button usando la ceja Buttons Para asignar una imagen a un objeto Button 1. D clic en la ceja Buttons (en la caja de dilogo de la pgina de propiedades del control Toolbar) para desplegar la ceja Buttons. 2. D clic en InsertButton para insertar un objeto Button nuevo. 3. D clic en la caja Image y teclee el valor Key del objeto ListImage. 4. D clic en Apply. 5. Repita los pasos dos a cuatro, para agregar ms botones, y asignar imgenes a los nuevos objetos Button. Ejemplo del control Toolbar Este ejemplo agrega objetos Button a un control Toolbar usando el mtodo Add y asigna imgenes suministradas por el control ImageList. El comportamiento de cada botn es determinado por la propiedad Style. El cdigo crea botones que pueden ser usados para abrir y salvar archivos e incluye un control ComboBox que usado para cambiar el color de fondo del formulario. Para comprobar este ejemplo, site sobre el formulario controles ImageList, Toolbar y ComboBox y copie el cdigo dentro de la seccin de declaraciones del formulario. Asegrese de insertar directamente el ComboBox sobre el control Toolbar. Ejecute el ejemplo, y d clic a los botones y haga selecciones del ComboBox para ver los efectos. Private Sub Form_Load() ' Create object variable for the ImageList. Dim imgX As ListImage ' Load pictures into the ImageList control. Set imgX = ImageList1.ListImages. _ Add(, "open", LoadPicture("Graphics\bitmaps\tlbr_w95\open.bmp")) Set imgX = ImageList1.ListImages. _ Add(, "save", LoadPicture("Graphics\bitmaps\tlbr_w95\save.bmp")) Toolbar1.ImageList = ImageList1 ' Create object variable for the Toolbar. Dim btnX As Button ' Add button objects to Buttons collection using ' the ' Add method. After creating each button, set both ' Description and ToolTipText properties. Toolbar1.Buttons.Add , , , tbrSeparator Set btnX = Toolbar1.Buttons.Add(, "open", , tbrDefault, "open") btnX.ToolTipText = "Open File" btnX.Description = btnX.ToolTipText Set btnX = Toolbar1.Buttons.Add(, "save", , tbrDefault, "save") btnX.ToolTipText = "Save File"

328

btnX.Description = btnX.ToolTipText Set btnX = Toolbar1.Buttons.Add(, , , tbrSeparator) ' The next button has the Placeholder style. A ' ComboBox control will be placed on top of this ' button. Set btnX = Toolbar1.Buttons.Add(, "combo1", , tbrPlaceholder) btnX.Width = 1500 ' Placeholder width to accommodate a combobox. Show ' Show form to continue configuring ComboBox. ' Configure ComboBox control to be at same location ' as the ' Button object with the PlaceHolder style (key = ' "combo1"). With Combo1 .Width = Toolbar1.Buttons("combo1").Width .Top = Toolbar1.Buttons("combo1").Top .Left = Toolbar1.Buttons("combo1").Left .AddItem "Black" ' Add colors for text. .AddItem "Blue" .AddItem "Red" .ListIndex = 0 End With End Sub Private Sub Form_Resize() ' Configure ComboBox control. With Combo1 .Width = Toolbar1.Buttons("combo1").Width .Top = Toolbar1.Buttons("combo1").Top .Left = Toolbar1.Buttons("combo1").Left End With End Sub Private Sub toolbar1_ButtonClick(ByVal Button As Button) ' Use the Key property with the SelectCase statement to specify ' an action. Select Case Button.Key Case Is = "open" ' Open file. MsgBox "Add code to open file here!" Case Is = "save" ' Save file. MsgBox "Add code to save file here!" End Select End Sub Private Sub Combo1_Click() ' Change backcolor of form using the ComboBox. Select Case Combo1.ListIndex Case 0 Form1.BackColor = vbBlack Case 1 Form1.BackColor = vbBlue Case 2

329

Form1.BackColor = vbRed End Select End Sub

RBsoftware (2001). COREL MOTION 3D Presentacin: Motion 3D es una herramienta para crear logotipos que vuelan que convierten a su computador en un mundo de tres dimensiones. Este mundo de tres dimensiones tiene propiedades reales: alto, ancho y profundo, y, en un sentido de animacin, tiempo. Corel Motion 3D no es un paquete de animacin complicado. Ofrece un juego especfico de caractersticas que lo especializan en la creacin de logotipos en tres dimensiones que son animados y aparentan volar y presentaciones. Archivo de Escena El documento de 3D en donde Usted crea sus animaciones es llamado una escena. Por defecto, cuando ejecuta Motion 3D, una nueva escena se abrir. Cada escena es un mundo de 3D independiente y nico en donde Usted puede construir, animar y salvar modelos. Stagehands Los Stagehands le facilitan el inicio del trabajo en un mundo de 3D. Con ellos, Usted puede crear animaciones en 3D sin necesidad de tener que crear los componentes individuales Usted mismo. Los Stagehands, que incluyen Cmaras, Luces y Propuestas, han sido diseadas especialmente para Usted, completadas con animacin (cuando es apropiado). Todo lo que tiene que hacer es seleccionar los elementos que desea, y Motion 3D los pondr en el mundo de 3D por Usted. Cameras Piense que la cmara es su ojo en un mondo 3D. Existe un nmero de cmaras preanimadas a elegir que ofrecen diversos medios para ver su mundo 3D. Estas cmaras son sus herramientas para la creacin de logotipos que vuelan. Cuando agrega una cmara StageHand, el objeto cmara existente ser reemplazado y la informacin de la animacin ser actualizada en la ventana Timelines. Puede solamente existir una cmara en el mundo 3D. Luces Un paso importante en la creacin de una animacin de calidad o una imagen es agregar el tono adecuado de luz. Las luces en Motion 3D son objetos movibles y editables que estn siendo vistos actualmente en el mundo. Las luces pueden ser manipuladas como otros objetos: puede ser puestas en otro lugar con las herramientas Move, pueden ser rotadas con las herramientas Rotate, y pueden ser escaladas con las herramientas Scale. Usted puede tener tantas fuentes de luz como lo desee, puede ajustar individualmente la

330

posicin, orientacin, y color de cada una de ellas. Si se tiene la habilidad de manipular objetos de luces en forma directa permite obtener gran control y flexibilidad en la creacin de escenas y animaciones. Los StageHands le ofrecen diversas luces de modelo para proporcionarle una variedad de efectos de iluminacin para su produccin 3D. Aunque Usted tiene la libertad de usar tantas luces como lo desee, debe estar prevenido que por cada luz que agregue se incrementan el tiempo de creacin del producto. De forma que se recomienda que limite el nmero de luces en escena y que borre las luces innecesarias. Propuestas Las propuestas son objetos pre animados que Usted puede colocar en su mundo 3D. Las propuestas son proporcionadas de forma que Usted puede comenzar trabajando en 3D sin necesidad de crear sus propios modelos animados. Desde luego, puede editar estas figuras en el Workshop y cambiar la forma en que ellas son animadas con Timelines. Usted puede agregar en su escena tantas propuestas como lo desee. Las propuestas que tienen muchas partes a menudo tienen un padre invisible. Este objeto padre le permite manipular todas las partes de la propuesta como un todo, movindola, escalndola, a un mismo tiempo. Modelos De forma ocasional, existirn veces cuando necesite un objeto especfico que no est disponible como StageHand en su paquete Motion 3D. Motion 3D incluye algunas herramientas de modelo bsico para ayudarle a Usted a crear modelos propios. La creacin de sus propios objetos le agrega flexibilidad a su trabajo Motion 3D. Existen tres tipos de objetos propios: el primero, objetos Lathed, son objetos que tienen secciones circulares o en encrucijada. Por ejemplo, una copla plateada, o una salsa voladora, pueden ser creadas con la herramientas Lathe. Otro tipo de objeto propio es llamado el objeto estrujado. Por ejemplo, pueden crear una buja industrial (I-beam) usando la herramienta Extrude en Motion 3D. El tercer tipo de objetos propios que pude Usted explorar es Text, el cual es un tipo especial de objeto estrujado. Environments En el mundo por defecto en 3D del computador no existe nada en el background ni en el espacio que lo rodea a que sirva para que sean sus objetos reflejados. Sin background una escena se ver vaca. Para dar vida a sus escenas y que los objetos reflexivos tengan algo que reflejar, hemos proporcionados los ambientes. Los ambientes, que incluyen Atmosphere, Sky, y Backdrop, ya estn diseados para Usted. Todo lo que tiene que hacer es seleccionar los elementos ambientales que desee, y Motion 3D los pondr en forma automtica en el mundo 3D por Usted. Atmosphere Atmosphere proporciona las propiedades de color de fondo, luz ambiental y neblina para su produccin 3D. Sky Sky es la imagen que reflejan los objetos en su escena. Backdrop Al igual que en el cine, los Backdrops proporcionan fondos en frente de los cuales puede Usted crear su produccin 3D. Los Backdrops pueden ser imgenes fijas o animaciones bidimensionales. Ellas son parte del fondo y permanecen sin ser afectadas por los cambios que Usted haga a otros elementos en el mundo 3D. Por ejemplo, si Usted apunta la cmara en una diferente direccin, el Backdrop no cambiar. Agregar un Backdrop a su escena har que se tome ms tiempo el proceso, dado que los Backdrops toman una buena cantidad de memoria RAM. Por esta razn es recomendable que lo agregue hasta despus que finalice su sesin de animacin. Timelines Los Timelines proporcionan una vista dinmica de todos los objetos dentro de la animacin. La informacin de un objeto puede ser accedida y manipulada desde dentro de la ventana Timelines.

331

Eventmarks Un Eventmark es una representacin grfica de un objeto en un momento en particular en el tiempo. Siempre que Usted mueva, escale, agregue una capa, o de alguna forma cambie un objeto en el mundo, Motion 3D sita un Eventmark en el Timeline de ese objeto a la posicin actual del World Time Marker. Los Eventmarks pueden ser agregados, borrados, editados, duplicados y movidos a travs del Timeline del objeto. Las animaciones son creadas simplemente agregando y manipulando Eventmarks. Move Tools Una de las cosas ms comunes que Usted estar haciendo es arrastrando objetos en el mundo 3D. Existen dos herramientas Move: la herramienta Move vertical, y la herramienta Move horizontal. Cada herramienta le permite mover un objeto a travs del mundo y a partir de un plano de movimiento en particular. La herramienta Move vertical puede ser usada para mover un objeto a la izquierda, a la derecha, arriba, o abajo, a travs de un plano vertical imaginario. Puede usar la herramienta Move horizontal para mover un objeto a la izquierda, a la derecha, adentro, afuera, a travs de un plano horizontal. En conjunto, las herramientas Move le permiten situar un objeto en cualquier parte del mundo 3D. Es importante comprender que las herramientas Move trabajan en relacin de cmo Usted los ve en pantalla. Para mover un objeto a travs de un plano vertical en una ventana View, use la herramienta Move vertical. Para mover un objeto a travs de un plano horizontal, use la herramienta Move horizontal. Cuando mueva un objeto apartndolo de Usted con la herramienta Move horizontal, en la ventana View estndar (Top, Front, o Right), Usted esperar que el objeto se haga ms pequeo como se hace en la cmara. Sin embargo, las ventanas View se encuentran en modo ortogrfico, lo que significa que no tienen perspectiva. No importa cuan distante un objeto se encuentre, este aparentar tener el mismo tamao. Cuando tiene muchos objetos en una escena, encontrar que muchos objetos se inician de la misma forma que otros objetos. Esto puede dificultar seleccionar o arrastrar objetos que estn obscurecidos. Si esto sucede, seleccione el objeto a travs de una diferente ventana View. Edit Object Si se da clic en el botn Edit Object se abrir Workshop y cargar en el objeto seleccionado actualmente. Rotate Tools Las tres herramientas Rotate son usadas para rotar un objeto alrededor del eje pasando a travs del punto central del objeto. Las herramientas Rotate, al igual que las herramientas Move, trabajan en relacin a lo que Usted ve en pantalla. Por ejemplo, la herramienta Horizontal Rotate siempre rotar un objeto alrededor del eje Y de la ventana View que Usted est usando. Las tres herramientas Rotate son: Vertical Rotate, Horizontal Rotate, y Tilt. Uniform Scale Tool Mientras est trabajando en Motion 3D desear cambiar el tamao de un objeto. Puede cambiar las dimensiones de un objeto a travs de los tres ejes de una sola vez con la herramienta Uniform Scale. La herramienta Uniform Scale expandir o contraer las dimensiones de cualquier objeto. Squash and Stretch Tool Use la herramienta Squash and Stretch para escalar un objeto a travs de una dimensin a la vez. Squasching y Stretching son particularmente tiles cuando se est creando ciertas secuencias de animaciones. Por ejemplo, una pelota saltando sobre una mesa se aplastar ligeramente por el impacto. Object Creation Tools Las herramientas Object Creation son usadas para situar objetos en 3D. La herramienta Text, sita por defecto texto en 3D. La herramienta Extrusion sita un objeto estrujado (un cubo). La herramienta Lathe sita por defecto un objeto torneado (una esfera). Sticky Tools

332

Encontrar til que Motion 3D mantenga la herramienta seleccionada en la caja de herramientas despus que Usted la haya usado. A esta caractersticas se le llaman herramientas Sticky. Usted pude activar o desactivar las herramientas Sticky en la caja de dilogo Options, disponible a partir del men Special. Con las herramientas Sticky activas, es fcil hacer cosas tales como agregar o escalar muchos objetos. Si las herramientas Sticky estn activas, Usted puede mantener la barra Space para temporalmente seleccionar la herramienta Move vertical. Cuando abandone la barra Space, la herramienta previa se mantendr seleccionada. Camera View Window Cada archivo de escena tiene su ventana Camera View. Con la cmara View Usted puede ver al mundo desde cualquier posicin y orientacin porque est conectado a un objeto Camera 3D actual que existe en el mundo 3D. Cuando el objeto Camera es movida en el mundo 3D, la ventana Camera View se actualiza de acuerdo. Usted puede tener solamente un objeto Camera en escena todo el tiempo. Las ventanas Camera View no pueden ser modificadas de tamao. Note que cuando cambia el tamao o ejecuta zoom de la Camera View, la escala relativa de los objetos que estn en escena permanecen inalterables. Alargando la Camera Window no permite que se vea ms un objeto, pero hace que la escena a la que est viendo aparezca ms lejos de la pantalla. Mantener la Camera View pequea ayuda a conservar memoria. Standard View Windows Existen tres diferentes ventanas Standard View en cada archivo de escena de 3D: Top, Front, Right. Cada uno de ellos ofrecen una perspectiva diferente del mundo 3D. Estas perspectivas estn siempre fijas a un plano. Mirar a travs de las tres ventanas Standard View es como mirar encima, enfrente y a los lados de un tanque de peces. Las Views Standard nunca giran o rotan, y por ello proporcionan una referencia de ayuda cuando se navega en el mundo 3D. En visa de que su propsito primario es para alineacin, las Views Standard no muestran objetos en perspectiva. Workshop Los objetos estrujados y achatados son editados en una parte especial del programa llamada Workshow. Usando el Workshop es fcil crear una gran variedad de objetos en tres dimensiones. Aunque las herramientas de edicin y el modo en que Usted entra en el Workshop son las mismas para estrujado y achatado, ciertos aspectos del espacio del Workshop sern diferentes. Existen dos formas para entrar al Workshop: 1. 2. Usando la herramienta Move vertical, d doble clic sobre el objeto. Una vez que el objeto est seleccionado, d clic en Edit, Objetc.

Para abrir una escena 1. Clic File, Open. 2. En la caja de lista Look, elija el dispositivo en donde el archivo est guardado. 3. Doble clic en el flder en donde el archivo est guardado. 4. Doble clic en el nombre del archivo de la escena. Puede usar wildcards (* y ?) si no est seguro del archivo a abrir. Por ejemplo, escribiendo test*.m3d como nombre de archivo y dando clic en OK lista todos los archivo M3D que comiencen con test. Para abrir una escena usando drag and drop 1. Localice el archivo M3D. 2. D clic y mantngalo presionado sobre el arhivo M3D y arrstrelo dentro del icono Corel Motion 3D ya sea en el flder de programas o en el escritorio. 3. Suelte el botn del ratn.

333

Nota: si Colrel Motion 3D est funcionando, puede abrir un archivo M3D arrastrndolo y dejndolo caer en cualquier View. Para abrir una Surface Library 1. Clic View, Surfaces. Se abre Surfaces Roll-up. 2. Clic en la lista Surfaces Library. 3. Clic en el nombre de la librera Surface que desea abrir.

Para guardar una nueva escena 1. Clic File, Save. 2. En la caja Save, elija un dispositivo y un folder en donde desea salvar su escena. 3. Teclee un nombre en la caja File. 4. Seleccione el deseado tipo preelaborado. 5. Clic Save. Para guardar un objeto como Prop (propuesta) 1. Seleccione el objeto 2. Clic Special, Stagehands. 3. Clic en la ceja Props. 4. Clic en Save. 5. Teclee un nombre en la caja Save. 6. Clic OK. 7. Clic Close. Para salvar una Camera Animation 1. Seleccione la camara. 2. Clic Special, Stagehands. 3. Clic en la ceja Camera. 4. Clic Save. 5. Teclee un nombre en la caja Save. 6. Clic OK. 7. Clic Close. Para salvar una Light Animation 1. Seleccione la Camera. 2. Clic Special, Stagehands. 3. Clic la ceja Lights. 4. Clic Save. 5. Teclee un nombre en la caja Save. 6. Clic OK. 7. Clic Close Para crear una nueva escena. 1. Clic File, New.

334

Para crear una Prop 1. Seleccione un objeto o un grupo de objetos encadenados a un objeto padre. 2. Clic Special, Stagehands. 3. Clic en la ceja Props. 4. Clic Save. 5. Teclee el nombre en la caja Save. 6. Clic en OK. 7. Clic en Close. Para crear una Movie 1. Abra o cree una animacin Corel Motion 3D. 2. Clic Animation, Make Movie. 3. En la caja Save seleccione un dispositivo y folder en donde desee guardar su movie. 4. En la caja Save As, elija un formato de archivo movie. 5. Teclee un nombre en la caja File. 6. Clic Save. Nota: Los mtodos de compresin para movies estn disponibles en la caja de dilogo File, Scene Setup. Para crear una New Surface 1. Clic Special, Surfaces. La caja Edit Surfaces se abre. 2. En el grupo Surfaces haga uno de lo siguiente: D clic en New, o d clic en una Surface existente y d clic en Duplicate. Una nueva Surface en la caja Surfaces. 3. Teclee un nombre descriptivo para la nueva Surface en la caja Surfaces Properties. 4. Ajuste las Surface Properties a los deseados atributos. 5. Clic Close. Para crear una nueva Surface Library 1. Clic Special, Surfaces. La caja Edit Surfaces aparece. 2. En el grupo Library d clic en New. 3. Teclee un nombre en la caja Library. 4. Clic OK. Para modificar el ambiente 1. Clic Special, Environment 2. Clic y edite las propiedades de ambiente apropiadas. 3. Clic OK. Para editar propiedades Eventmark 1. Clic View, Timelines. 2. Clic botn derecho del ratn sobre la Eventmark. 3. Clic Properties. Para editar un objeto 1. Clic en la herramienta Move Vertical. 2. Doble clic sobre el objeto. El editor objeto apropiado aparece o se abre una caja de dialogo. Para editar una Shape globalmente 1. Clic en la herramienta Move Vertical. 2. Doble clic sobre la Shape. Se abre el Workshop. 3. Clic Apply changes to all eventmarks para activar esta caracterstica. 4. Edite Shape. 5. Clic Done. Para rotar un objeto

335

1. 2.

Clic en Rotate Tools. Clic en cualquier lado del objeto y arrastrelo hacia la deseada rotacin.

Nota: Los objetos linked rotarn como un solo objeto alrededor del contrapunto del objeto padre. Para editar una Surface 1. Clic en la herramienta Move Vertical. 2. Clic con el botn derecho sobre el objeto y d clic en propiedades. La caja Object Properties se abre. 3. Clic en la ceja Surfaces. 4. Clic Edit. Para abrir una caja Edit Surface 1. Clic Special, Surfaces. Para metamorfosear un objeto Usando el Workshop mientras se crean animaciones le permite metamorfosear un objeto de una forma a otra. Usted puede metamorfosear entre dos objetos Lathe cualquiera o entre dos objetos Extruded cualquiera. Una correspondencia punto a punto no es necesaria entre los dos objetos. Sin embargo no puede metamorfosear de Lathe a Extruded. Para metamorfosear un objeto propio 1. Crear un objeto Lathe o Extrude. 2. Modificar el objeto con el Workshop y regrese a World. 3. Mueve el Worl Time Marker detrs en el tiempo en la ventana Timelines. 4. Reconfigure su objeto en el Workshop y regrese a World. Para metamorfosear texto La metamorfosis de texto es una caracterstica excitante en Motion 3D que le permite crear animaciones entre figuras de texto. Una palabra se puede metamorfosear en otra. Los objetos texto se pueden metamorfosear sin importar el nmero de letras al inicio o al final de las palabras. Por ejemplo, Usted puede ir desde la palabra egg a la palabra baseball sin preocuparse por la construccin de las cinco letras extra. Motion 3D automticamente las agregar. Sin embargo, la metamorfosis se mira mejor cuando va entre dos palabras de igual longitud. Para animar metamorfosis de objetos Text de un juego de letras a otro 1. Clic la herramienta Text y de clic dentro de la ventana Camera. Se abre la caja Object Properties. 2. Teclee su nombre en la caja de texto y, si lo desea, seleccione una fuente y una profundidad de arrugado. 3. D clic en OK. El texto deber aparecer en el World. 4. Clic View, Timelines. 5. Mueva el World Time Marker hacia adelante en el tiempo en la ventana Timelines. 6. Clic en le herramienta Vertical y d doble clic en el objeto texto que acaba de crear. Esto le regresar a la caja de dialogo Object Properties. 7. Clic en la ceja Tab y teclee un nuevo juego de letras o palabras (puede tambin seleccionar una nueva fuente, profundidad de arrugado y biselado). 8. Clic OK. Nota: Cuando retorna a la ceja Tab de la caja Object Properties, el campo Text y el men Font no necesariamente reflejan las propiedades del texto cuando fue creado originalmente. Esto es porque Motion 3D no puede hacer estimados acerca del texto cuando es animado, y no existe forma de representar las figuras de las letras que estn en medio entre diferentes palabras y diferentes fuentes. Para metamorfosear una Surface

336

Con Motion 3D puede metamorfosear entre dos Surfaces cualquiera. Esto le permite crear secuencias animadas mostrando una Surface y otra Surface. Las metamorfosis Surface son creadas de la misma forma que lo son todas las otras secuencias de animacin. Para metamorfosear entre tipos de Surface 1. Aplicar una Surface a un objeto. 2. Mueva el World Time Marker atrs en el tiempo. 3. Aplicar una nueva Surface al objeto.

Traducido por : Antonio Rodrguez. Fecha de finalizacin e impresin: Len, Domingo, 7 de Octubre del 2001. 11:20am.

337

Anda mungkin juga menyukai