Apuntes sobre StringGrid en DelphiColor y alineación en celdas de un StringGrid http://neftali.clubdelphi.com/?p=180 Éste ejemplo muestra cómo programar el evento OnDrawCellde un TStringGridpara modificar la alineación y color de las celdas pertenecientes a una columna completa; Además implementa los metodos de Importar desde un fichero separado por comas e interacción con el portapapeles de filas completas (Cortar/Copiar/Pegar). En este ejemplo está el código necesario para: Cambiar la alineación de las columnas del StringGrid (columnas 0, 1 2). Cambiar el color de una columna. Cambiar el color de una fila. Realizar operaciones sobre el portapapeles con una o varias filas. Cargar (Importar) datos a un StringGrid desde un fichero. http://www.formauri.es/arrobamasmas/Cursos/index.php?apdo=0402&curso=4_02_03&cap=3 Este componente, situado en la pestaña 'Additional' de la paleta decomponentes, bajo el icono nos va a permitir manipular cadenas que tengan quemostrarse en forma de grid, al estilo de las grids de Excel oAccess. Insertando un componente de este estilo, veremos que aparece asíen el form: con un número de filas y columnas predeterminado que podremoscambiar. Vamos a estudiar algunas de las propiedades másimportantes con los que cuentan estos objetos, dejando lainvestigación del resto, como siempre, de ejercicio al lector. Es un componentecon muchas posibilidades a descubrir. Algunas propiedades BorderStyle Cells Col ColCount Ctl3D FixedCols FixedRows Options Row RowCount PropertyBorderStyle: TBorderStyle; Con esta propiedad fijamos el estilo del borde de la grid. Losvalores posibles son bsSingle y bsNone. Elprimero nos pondrá una línea rodeando la grid y el segundo no. Sinembargo, la apariencia del borde depende también del valor de gracias a esta propiedad. Gracias a esta propiedad podemos acceder a la cadena que hayaalmacenada en la fila NRow. Sabiendo. Losvalores máximos vienen dados por las propiedades ColCountyRowCount. el borde del control tieneun aspecto "acolchado" típico de los controles con apariencia 3D. Lagrid tendrá columnas desde 0 hasta ColCount-1. Fijando este valor a True. Property Ctl3D: Boolean. Afortunadamente. bien para determinar qué columna ha sidoseleccionada. Si le asignamos unvalor. Hay que añadir que la primera columna es la0. columna NCol. Asignando un valor a estapropiedad produce el mismo efecto que si pulsáramos sobre esacolumna.lapropiedadCtl3D. NRow: Integer]: String. la segunda la 1. PropertyCells[NCol. lo que hace es cambiar el número de columnas de la grid. que esColCount-1. el borde es de aparienciaplana. y así hasta la última. qué columna ha sidoseleccionada. En la imagen podemos ver la misma grid de antes pero conCtl3D = False: . Property Col: Longint Se trata de una propiedad que sólo está disponible en tiempo deejecución que nos sirve. PropertyColCount: Longint Nos dice cuántas columnas tiene la grid.mientras que si se pone a False. o bien para mover el foco a la celda que esté en lafila en la que estuviera pero cambiando la columna a la queasignemos a la propiedad Col. podemos usarla como índice para acceder a uno de losCells concreto. se puede experimentar entiempo de diseño. goHorzLine. tiene una fila y una columna extra queson de color gris con apariencia 3D. puesto que no se desplazan siaparecen las barras de scroll. goColSizing. goThumbTracking ). goRowSelect. con FixedCols podemos poner lascolumnas de este estilo que queramos. TGridOptions = Set OF TGridOption. goDrawFocusSelected. simplemente asignándoles unvalor. PropertyOptions: TGridOptions. goEditing. En cuanto insertamos una grid en el form. permanecen fijas (de ahí su nombre). goRowMoving. es decir. goColMoving. vemos que. Estas columnas son especiales. goRowSizing . El tipo TGridOptions tiene la siguiente definición(extraído de la ayuda de Delphi): TYPE TGridOption = (goFixedVertLine. En concreto. goTabs . aparte delas celdas blancas normales.y están indicadas por ejemplo para poner títulos a las filascorrespondientes. goFixedHorzLine. goVertLine . PropertyFixedRows: Integer. perocambiándolo por filas.PropertyFixedCols: Integer. Hay que añadir un último punto: no se puede poner el valor de lapropiedadFixedCols a un valor mayor que ColCount -1. debe haber al menos una columna que sí estésometida al scroll. goAlwaysShowEditor. . goRangeSelect. Exactamente lo mismo que lo dicho para las columnas. Estas son las llamadasFixed. perono por color alguno de fondo especial. goColSizing Las columnas que hacen scroll redimensionadasindividualmente en ejecución. la celda con el foco de entrada sedistingue simplemente porque será rodeada por un rectángulo. goDrawFocusSelected Si incluimos esta opción. goHorzLine Las líneas horizontales son dibujadas para separar las filas nofijas de la grid.Este valor es ignorado si entre las opciones se encuentragoEditing. goVertLine Las líneas verticales son dibujadas para separar las columnasno fijas de la grid. goRowSizing Las filas que hacen scroll pueden ser redimensionadasindividualmente en ejecución. Si no la incluimos. goFixedHorzLine Las líneas horizontales son dibujadas para separar las filasfijas de la grid. goFixedVertLine Las líneas verticales son dibujadas para separar las columnasfijas (fixed) de la grid.. goRangeSelect Permite al usuario seleccionar un rango de celdas a la vez. las celdas que tengan el foco deentrada serán dibujadas con un color especial para resaltarlas. dela misma manera que las celdas seleccionadas pero sin el foco deentrada..Y cada una de las opciones sirve para. . goRowMoving pueden ser Las filas que hace scroll pueden ser cambiadas de posición(movidas) usando el ratón. qué fila ha sidoseleccionada. Asignando un valor a estapropiedad produce el mismo efecto que si pulsáramos sobre esa fila. de locontrario esta opción por sí sola no tiene efecto). la imagen de la grid se actualizamientras el usuario pulsa sobre la barra de scrollparadesplazarse.goColMoving Las columnas que hace scroll posición(movidas) usando el ratón. basta con pulsar sobre ella. la opción goRangeSelect no tieneefecto. goThumbTracking Si añadimos esta opción. goRowSelect Se selecciona una fila completa en lugar de celdasindividuales. Siincluimos esta opción. elusuario no necesita pulsar Enter o F2 para entrara editar una celda. Sabiendo. goTabs Permite al usuario moverse entre las celdas de la gridusandoTab y Shift+Tab. bien para determinar qué fila ha sidoseleccionada. PropertyRow: Longint. Si tenemosseleccionada la opción goRowSelect. Si no la añadimos. Se trata de una propiedad que sólo está disponible en tiempo deejecución que nos sirve. la opcióngoAlwaysShowEditor no tiene efecto. goEditing pueden ser cambiadas de Permite al usuario editar el contenido de las celdas. o bien para mover el foco a la celda que esté en lacolumna en la que estuviera pero cambiando la fila a la queasignemos a la propiedad Row. goAlwaysShowEditor La grid se encuentra permanentemente en modo edición (para loque debe estar seleccionada la opción goEditing. Si tenemos esta opción incluida. podemos usarla como índice para acceder a uno de losCells concreto. no veremos por dónde vamos en lagrid hasta que no soltemos la barra de scroll. Hay que añadir . gracias a esta propiedad. Con ello.goAlwaysShowEditor no tiene efecto. Teniendo Col y Row.1 DO SG. en un momento dado siemprepodremos acceder a la celda concreta que esté seleccionada. PropertyRowCount: Longint.Cells[i.ColCount := 12.1 DO SG.ColCount .que la primera fila es la 0.RowCount . llamadaSG. begin SG. que es RowCount-1. Con esto. Si le asignamos un valor. y así hasta la última.0] := 'Columna ' + IntToStr(i). a la que en tiempo de diseño sólo se le ha tocado elvalor de la propiedad Ctl3D poniéndolo a Falseycambiando un poco su posición y tamaño para que quede más o menoscentrada en el form.Cells[j.i] := 'Fila ' + IntToStr(i).' + IntToStr(j) + ')'.1 DO SG. Nos dice cuántas filas tiene la grid. FOR i := 1 TO SG.RowCount .la segunda la 1.ColCount . en el onShow del formlecambiaremos el número de filas y de columnas.FormShow(Sender: TObject).Cells[0. j: Integer. y escribiremos algodentro de ella: procedure TForm1. tenemos una grid.RowCount := 7. end. La gridtendrá filas desde 0 hasta RowCount-1. puesestas propiedades nos van a dar sus coordenadas. SG. VAR i. FOR i := 1 TO SG.1 DO FOR j := 1 TO SG.lo que hace es cambiar el número de filas de la grid.i] := '(' + IntToStr(i) + '. Simplemente. tenemos el resultado del gráfico: . FOR i := 1 TO SG. Ejemplo Vamos a terminar este capítulo sobre TStringGrid con unpequeño ejemplito. Entonces. Fixed.Se ha desplazado un poco la barra de scroll para que se vea quelaFixedCol es. . efectivamente. el componente de la clase TStringGrid es algo más cutre que el ListView. APELLIDO1. El único inconveniente estaba en que no se podían cambiar los títulos de las columnas. ya que venían predeterminadas por los colores de Windows. IMPORTE PTE. NIF. Pues bien. Cuando insertamos un componente StringGrid en el formulario nos va a poner por defecto la primera columna con celdas fijas (fixed). siendo nosotros los que le tenemos que dar formato a mano. AÑADIENDO DATOS A LA REJILLA Vamos a crear una rejilla de datos con las siguiente columnas: NOMBRE. pero permite cambiar al 100% el formato de todas las celdas.http://delphiallimite.html Mostrando datos en el componente StringGrid Anteriormente vimos como mostrar información en un componente ListView llegando incluso a cambiar el color de filas y columnas a nuestro antojo.blogspot. APELLIDO2. Al igual que ocurría con el ListView. todos las celdas de un componente StringGrid son de tipo string. Vamos a fijar las siguientes propiedades: Propiedad --------ColCount RowCount FixedCols FixedRows DefaultRowHeight Valor ----5 4 0 1 20 Descripción ----------5 columnas 4 filas 0 columnas fijas 1 fila fija altura de las filas a 20 pixels Ahora creamos un procedimiento para completar de datos la rejilla: .com/2007/09/mostrando-datos-en-el-componente. Veamos primero como meter información en el mismo. begin withStringGrid do begin // Título de las columnas Cells[0. end. '211.'. 2] := Cells[4. sobre todo la columna del importe pendiente: DANDO FORMATO A LAS CELDAS DE UN COMPONENTE STRINGGRIND Lo que vamos a hacer a continuación es lo siguiente: . 3] := Cells[2.36'. // Datos Cells[0. 'MARIA'. '44878234A'. 'GARCIA'. 1] := Cells[3.21'.La primera fila fija va a ser de color de fondo azul oscuro con fuente blanca y además el texto va a ir centrado. 'GUILLEN'.RellenarTabla. . '76892693L'. 2] := // Datos Cells[0. 0] := 'APELLIDO2'. 'PABLO'. Cells[3. 1] := Cells[1. 2] := Cells[1. 'PALAZON'. 3] := Cells[3. 3] := end. Cells[2. 'SANCHEZ'. 0] := 'APELLIDO1'. 3] := Cells[4. 1] := Cells[4. 2] := Cells[2. '67348321D'.procedureTFormulario. 'PEREZ'. 0] := 'NOMBRE'. 'CARMEN'. 0] := 'IMPORTE PTE. Cells[1.66'. 0] := 'NIF'. 2] := Cells[3. Cells[4. Al ejecutar el programa puede apreciarse lo mal que quedan los datos en pantalla. '1500. 'MARTINEZ'. '635. 1] := // Datos Cells[0. 1] := Cells[2. 3] := Cells[1. Name := StringGrid.. // le ponemos azul de fondo Font.Style := [fsBold].StringGridDrawCell( Sender: TObject.Style := [fsBold]. var sTexto: String. // fuente blanca Font. // Texto que va a imprimir en la celda actual Alineacion: TAlignment.Color := clRed. ACol.Size. .Size := StringGrid. // Ancho del texto a imprimir en pixels begin withStringGrid. // y negrita end else begin // ¿Esta enfocada la celda? ifgdFocused in Statethen begin Brush. Rect: TRect.Canvas do begin // Lo primero es coger la fuente por defecto que le hemos asignado al componente Font. // fondo rojo Font.Font.Color := clNavy.Color := clWhite. // ¿Es una celda fija de sólo lectura? ifgdFixed in Statethen begin Brush. Font.Name. State: TGridDrawState ). Todo esto hay que hacerlo en el evento OnDrawCell del componente StringGrid: procedureTFormulario. ARow: Integer. ifARow = 0 then Alineacion := taCenter else // Si es la columna del importe pendiente alineamos el texto a la derecha ifACol = 4 then Alineacion := taRightJustify else Alineacion := taLeftJustify.El resto de columnas tendrán el color de fondo blanco y el texto en negro. // y negrita end .La columna del importe pendiente va a tener la fuente de color verde y va a ir alineada a la derecha. // fuente blanca Font.Font. // Alineación que le vamos a dar al texto iAnchoTexto: Integer.Color := clWhite. else begin // Para el resto de celdas el fondo lo ponemos blanco Brush. Quedaría de la siguiente manera: .Left + 5. taRightJustify: TextOut( Rect.Color := clBlack.Left + ( ( Rect. Rect.ARow]. end else begin Font.2.Cells[ACol. // ¿Es la columna del importe pendiente? if ACol = 4 then begin Font.Top + 2. sTexto ). Si queremos que sólo se haga una vez hay que poner a False la propiedad DefaultDrawing.Color := clWindow. sTexto := StringGrid. Así quedaría al ejecutarlo: Sólo hay un pequeño inconveniente y es que la rejilla primero se pinta de manera normal y luego nosotros volvemos a pintarla encima con el evento OnDrawCell con lo cual hace el proceso dos veces. Font.iAnchoTexto ) div 2.Top + 2. end. end. // y negrita Alineacion := taRightJustify.Right . case Alineacion of taLeftJustify: TextOut( Rect.Style := [].Top + 2.iAnchoTexto . end. end.Style := [fsBold]. taCenter: TextOut( Rect. FillRect( Rect ). end. Rect.Color := clGreen. end. iAnchoTexto := TextWidth( sTexto ).Rect. sTexto ). Rect. sTexto ). // la pintamos de azul Font.Right .Left ) . Por lo demás creo que este componente que puede sernos muy útil para mostrar datos por pantalla en formato de sólo lectura. . Pruebas realizadas en Delphi 7. En formato de escritura es algo flojo porque habría que controlar que tipos de datos puede escribir el usuario según en que columnas esté. programacionfacil. . es decir en forma de tablas. Y RECORDAR QUE SUS INDICES EMPIEZAN EN RENGLON=0 y COLUMNA=0.COMPONENTE StringGrid (adicional) DELPHI Este componente es de los mas importantes. procesar y mostrar gran cantidad de información para la vista del usuario. manipula y procesa conjuntos de datos de tipo stringsen forma tabular.. permite concentrar. Algunas de sus propiedades y métodos mas interesantes son: ColCount.http://www. la primera de ellas es la columna 0. se realizan operaciones con ellos.Determina la cantidad de columnas que contendrá la tabla. Este componente presenta. para el procesamiento de muchos datos. se capturan. Recordar que para efectos de programación. etc.com/borland_delphi:stringgrid III BORLAND DELPHI UNIDAD ARREGLOS 6.. cuadros concentrados.). se despliegan. es la información externa quien le da sentido. matrices. CIA ACME INGRESOS POR VENTAS MENSUALES MILLONES DE PESOS ENE FEB MAR ABR SUC A 1 2 3 4 SUC B 5 6 4 5 SUC C 6 7 8 9 Recordar que son los datos numéricos internos quienes se procesan (es decir. ejemplo. Fixedcol .Determina la cantidad de renglones que contendrá la tabla. Ejemplo capturar una tabla de 3 * 4 enteros. Para que permita editar o capturar datos al usuario. Cells[columna.RowCount. Para que el usuario pueda navegar entre celdas usando la tecla del tabulador. Pantalla de Diseño: (inspector objetos) .1] := 'PATO'. +Options. Recordar que para efectos de programación. y restarles 4 después. Edit1. Es la propiedad mas importante. solo recordar que se debenusar dos ciclos foruno externo para controlar columnas y uno interno para controlar renglón ( observar que es lo inverso de las tablas o arreglos normales).Determinan la cantidad de columnas y renglones fijos o de encabezado.Text=StringGrid1. ej. StringGrid1. porque es la que permite el acceso a cualquier celda de la tabla.renglón]. Para procesar todos los elementos de la tabla..0]. goediting = true.Cells[1. Las demás propiedades investigarlas en la ayuda delborlanddelphi . estas propiedades ponerlas en 0. +Options. gotab = true. el primero de ellos es el renglón 0.Fixedrow.Cells[0.. r.temp:integer. var c.FORM1: Programa.Button1Click(Sender: TObject). procedure TForm1. . end. StringGrid1. Pantalla de Corrida: [[|Un proceso muy común con tablas.Cells[c.]]]]]] CIA ACME INGRESOS MENSUALES (MILES DE PESOS) ENE FEB MARZO TOTALSUC PROMSUC SUC A 1 2 3 6 2 SUC B 4 5 6 15 5 SUC C 7 8 9 24 8 SUC D 10 11 12 33 11 . cuadros y concentrados es agregarles listas [[|[[|de totales y promedios ya sea por columna o por renglón o ambas .r])-4. por ejemplo.r] := IntToStr(temp). end. end.begin for c:=0 to 2 do begin for r:=0 to 3 do begin temp:= StrToInt(StringGrid1.Cells[c. 5 7.col++) { totsuc[reng]=totsuc[reng]+tabla[reng][col].0.col++) prommes[col]=totmes[col]/4. promes[3].Construir un concentrado que despliegue los costos fijos de tres diversos productos que se fabrican en cuatro sucursales de una empresa MAQUILADORA.col<=2. dos para totales y dos para promedios.Construir un concentrado que contenga los ingresos por ventas mensuales de los 4 primeros meses del año de tres sucursales de una cadena refaccionaría. // operaciones para totales y promedios por mes for(reng=0.reng++) for(col=0. 2. se supone que la tabla // ya esta capturada.5 6. //código para operaciones para totales y promedios //renglones por sucursal: for(reng=0.reng++) promsuc[reng]=totsuc[reng] / 3. for (col=0. pero cambiarlo a borlanddelphi. //observar tamaños de listas que referencian renglón // listas que referencian columnas. agregar listas de ingresos totales por mes e ingresos promedios por sucursal.reng<=3. }. for(reng=0.reng++) for(col=0..col++) {totmes[col]=totmes[col]+tabla[reng][col].TOTMES 22 26 30 PROMMES 5.0 . recordarlo y aprenderlo para siempre: //declaración float tabla[4][3]. promsuc[4].col<=2.8 En este ejemplo aparte de la tabla se ocupan 4 listas. TAREAS PROGRAMACION BORLAND DELPHI 1.reng<=3. totsuc[4]. floattotmes[3]. El código en C++ es sencillo. .. }.reng<=3.col<=2. 3. incluir promedios de calificaciones por materia y por alumno.Construir un cuadro que contenga las calificaciones de 5 materias de cuatro alumnos cualesquiera. .. La calidad de las respuestas es directamente proporcional a la calidad de la pregunta Dime cuanto presumes y te diré cuanto careces . ...4:23.:74.7.1.0397./02E809094..5:0/0.39..O30848:0390 .570..6:06:0/..2..807/0.4393:..:48.78042.1.948 08 ( # 08 ( !# 08 ( & 08 ( 08 ( 03/ 03/ 00..../0254790503/0390 #% $$& ! %$%## 46:0.248.3....07.705747.431:0390 -.94803 5./4 . 84-7094/4.348/..447/0143/4.:9.57207. 94 #439007#0.3..4:23. .. 70894/0..425430390 $9737/ 574.9%#0.9$9..4:23./0254790503/0390.90%7/7.40909403 3074 %4/40894.0740300.30.7 8%094$973./.90 ..6:0.$9.0394 37../070.447.0 $03/07% -0...74$9737/7.0/0..447/0143/4-.07/0 ..0/:70%472:.8903/7E30.1:0390/0.7.90307. . 30.9:.43%32039...2572703.%0946:0....0/.. . 7.248.4%09439007../.O36:00.9094 3..30. . .3.4/09094.2572703508 -03 9$9737/.3.8/4 -03 . . 407./4.457207408.20 439$0$9737/439$0 1#4 903 30. .03907 080 .425430390 439.946:000248.439.83.1:0390547/010.20$9737/439.. . /0254790503/0390.24809094.$08..4:23.#9:891 080 30.019:891 .30..439...439.. /070. 14903 30. . 8:3.0/../08O40. 1/0/3$9.9:7...1..90903 -03 7:8447. . 90.05430248.:/0143/4 439447. . . 439$90184/(.1:0390-.3. . 3079. 03/ 080 -03 . . 0/.:80/3$9.0314...#0/.90903 -03 7:8447./.. 1/4. 89. . 90.143/4744 439447. . 3..1:0390-. 439$90184/(. . 3079. 03/ . 080 -03 . . 7.3/4 .!.0/.4 7:8447.070894/0.3.80143/445430248-. . 4:23./0254790503/0390 14903 -03 439447. 8..7003. . .539.: 439$90184/(.248/0. . 084/48.7J.08$6:0702486:08O480 ..8:03902.00.4341 9. 30..0.3079.70.9019 #0.4%094%09/9 8%094 .9%45 8%094 9.7. ./0 2.3472.9%45 8%094 03/ 03/ 03/ 8J6:0/.9%45 8%094 9.307.00574.:0434849748.:9.0394 37..4300.7J.74 $O4.439..4%094 /.9#9 3. 439$90( 03/ 03/ 03/ 8%094$9737/084 #4( #0.4%094 #0.9 3..3 ":0/.:97../0.43.4.#9:891%09 :9 #0.434..:3506:0N43.2.8030.9019 #0.019:891%09 :9 #0..9019 3...6:054307..539.#9:891 03/ 080 -03 439447.:.57207480539.57450/. #0./01.307.0.80.030390086:0.0.0248.9 #0..9#9 #0.03907%09 :9 #0.:3.03. 94/0 08.6:0.94/08O40. !474/02E8.43974.4:23.39.7046:00890.7/.4254303906:05:0/08073482:95.7.-7J.9:7.948 5:0/008.80305 .8089F !7:0-./.74803036:0.9485475.41445476:0..870.76:09548/0/.79:7.. 24897.31472.031472.7-70:8:.08. 995. . 42...2.431.5747.. 948/095489738031472./09.7.-..3.31472.9483:2F7.4254303905708039. #0.7 574.724897. ..76:05.010.574.0574./.4308..08.8 2.35:.7.76:084348/.//0.97.0397..43:3948/0/.34507.-:.825479.4:23./00.08.43048 80/0850.4839073486:030880574.7 08/0.8/08:857450/..86:0.948 507290.42543039008/0482. 9.48/.47/.57207.20394/02:.59:7.3 09.7.08.3908843 44:39 090723..7 80.77.9..89..4:23.6:030/..3/*/0589737/ #!&## $ ! %$9737/ .O309073.3 08/0. 08..0397.43903/7E.-.08 . ! 890.3908 5.47/.8390708. 8039/4 # ##"&$&$$!# & :3.808.43./48 00254 #$ $! #'%$$&$ $!$ $ ## $& $& $& #0.43.74 890.08./748.O35.7031472..:.3 8070./0 :8:./082F94/482.39/.2.39/.948/05747..-47.//031472.. 2.43..O3 . 47/.010..2.39/./080N4 3850.4:23..9474-0948 .0/9.7/.76:05..8/02E857450/..76:00843.-..6:00:8:.7.43974.3.74.8:8.7./0..08 0254..59:7.948. 703O3( 8.9.7/48.3/4./4 089.803 59438 40/9397:0!.57450/.89.6:050729..8:343907345.9..47/.708/085:F8 !.O3 0572074/0048080703O3 0/.3.794/484800203948/0.//0.770483472.084.59:7.:8:.7703O3 4-807.84./083.574.7.76:080/0-03:8.3//05 !.:.-:.#44:39 090723.7..7.4:23./47 08.6:07.-..6:05072900 .../0 0390748 7089.745:0/.7.825479.870343081484/0 03.74 59438 49./2./0854307./0-47.-97:0!.-.4:23.39/.39...-..90.390 5476:008..0/.43974. 84470.9..43903/7E.857450/./0 9.7:3.7.//070343086:0.-0.7.089.48 147:340907345..703970.0/. 0 $9737/08 ( !% /9%09$9737/08 ( ..0.948/05747.-. #0.08.9.0784/0.:/.803.4 0/74 090723. 574. # !747.9 . 7 902539007 ..7 .0/:70%472:9943.2. $03/07% -0. 7( $9737/08.-./4808.0397. &3574.0842:..:.70.4547703O34.439.8/0 949.43.0857420/48.4:23.8 ./0477/.2-. 94/4-03 1477 94/4 -03 9025$97%439 $9737/08./748.70889.8 54700254(((((( #$ $$&$ $!$ $ # % %$&!# $& $& $& $& $& . 7(39%4$97 9025 03/03/03/ !. -03 147.423.80.39.547. 5703/0745.790/0.5.O/403 802570 08803.7.3//05 70. .57420/48 .47/.389.8 /485.-47.74.74.7.% %$ !# $ 3089000254.949.4 5074.:5.804.7.9.08/485.2-..-. . ( 57428:..( 14.(( 9498:.99.9949208( 574208( .O3 14../0.-.7. . 2.86:07010703.3703O3 ..N48/089..4-807.79. . .9..4:23.-.8 808:54306:0.89.86:07010703.3. . ./.. .59:7.089. . . 7.4507.O/45..0857420/48.43085.949.7.. . 703(9498:.-.:78.703( 9. 147 703 703703 147 .4.4 .7034308547 8:.4(< 147 703 703703 57428:.4 9498:.703(.703(.703(9498:. . . 4 949208.949.4(949208.7..4507.4 .703(.4 .4(949208.0857420/48547208 147 703 703703 147 .4.-.4(< 147 .4(.4.4( 9.43085.4 5742208. 43. %#$!# # #! 43897:7:3.025708..08/0:3.48370848547.:.43903."& # 43897:7:3.07848574/:.:78.789.8/0 370848949.039./03.0397.08/0:3.9748:.:78./46:0.:78.0397.43..82038:..7J.08/048 572074820808/0.-7.43.701.08547208037084857420/485478:./46:0/0850:048..48948148/09708/.. .303. .N4/097088:.9486:0 801.70. :..907.1..43903./746:0.:..1.43085472...:.907.8/0.547.974.8.4308/02..:2348 ..:234 .:757420/48/0.086:07. 43897:7:3. 3. 3945708:20890/7F.//0.87085:089.43./..570:39..808/70..//0.:.9.70....20390574547. 20...:.08 ./.394.