Está en la página 1de 20

Apuntes sobre StringGrid en Delphi

Color y alineacin en celdas de un StringGrid


http://neftali.clubdelphi.com/?p=180
ste ejemplo muestra cmo programar el evento OnDrawCellde un TStringGridpara modificar la alineacin y color de las celdas pertenecientes a una columna completa; Adems implementa los metodos de Importar desde un fichero separado por comas e interaccin con el portapapeles de filas completas (Cortar/Copiar/Pegar).

En este ejemplo est el cdigo necesario para:

Cambiar la alineacin 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

pestaa

'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 asen el form:

con un nmero de filas y columnas predeterminado que podremoscambiar. Vamos a estudiar algunas de las propiedades msimportantes con los que cuentan estos objetos, dejando lainvestigacin 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 lnea rodeando la grid y el segundo no. Sinembargo, la apariencia del borde depende tambin del valor de

lapropiedadCtl3D. Afortunadamente, se puede experimentar entiempo de diseo.

PropertyCells[NCol, NRow: Integer]: String;


Gracias a esta propiedad podemos acceder a la cadena que hayaalmacenada en la fila NRow, columna NCol. Losvalores mximos vienen dados por las propiedades ColCountyRowCount.

Property Col: Longint


Se trata de una propiedad que slo est disponible en tiempo deejecucin que nos sirve, bien para determinar qu columna ha sidoseleccionada, 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. Asignando un valor a estapropiedad produce el mismo efecto que si pulsramos sobre esacolumna. Sabiendo, gracias a esta propiedad, qu columna ha sidoseleccionada, podemos usarla como ndice para acceder a uno de losCells concreto. Hay que aadir que la primera columna es la0, la segunda la 1, y as hasta la ltima, que esColCount-1.

PropertyColCount: Longint
Nos dice cuntas columnas tiene la grid. Si le asignamos unvalor, lo que hace es cambiar el nmero de columnas de la grid. Lagrid tendr columnas desde 0 hasta ColCount-1.

Property Ctl3D: Boolean;


Fijando este valor a True, el borde del control tieneun aspecto "acolchado" tpico de los controles con apariencia 3D,mientras que si se pone a False, el borde es de aparienciaplana. En la imagen podemos ver la misma grid de antes pero conCtl3D = False:

PropertyFixedCols: Integer;
En cuanto insertamos una grid en el form, vemos que, aparte delas celdas blancas normales, tiene una fila y una columna extra queson de color gris con apariencia 3D. Estas son las llamadasFixed. En concreto, con FixedCols podemos poner lascolumnas de este estilo que queramos, simplemente asignndoles unvalor. Estas columnas son especiales, puesto que no se desplazan siaparecen las barras de scroll, permanecen fijas (de ah su nombre),y estn indicadas por ejemplo para poner ttulos a las filascorrespondientes. Hay que aadir un ltimo punto: no se puede poner el valor de lapropiedadFixedCols a un valor mayor que ColCount -1, es decir, debe haber al menos una columna que s estsometida al scroll.

PropertyFixedRows: Integer;
Exactamente lo mismo que lo dicho para las columnas, perocambindolo por filas.

PropertyOptions: TGridOptions;
El tipo TGridOptions tiene la siguiente definicin(extrado de la ayuda de Delphi):
TYPE TGridOption = (goFixedVertLine, goFixedHorzLine, goVertLine , goHorzLine, goRangeSelect, goDrawFocusSelected, goRowSizing , goColSizing, goRowMoving, goColMoving, goEditing, goTabs , goRowSelect, goAlwaysShowEditor, goThumbTracking ); TGridOptions = Set OF TGridOption;

Y cada una de las opciones sirve para...


goFixedVertLine

Las lneas verticales son dibujadas para separar las columnasfijas (fixed) de la grid.
goFixedHorzLine

Las lneas horizontales son dibujadas para separar las filasfijas de la grid.
goVertLine

Las lneas verticales son dibujadas para separar las columnasno fijas de la grid.
goHorzLine

Las lneas horizontales son dibujadas para separar las filas nofijas de la grid.
goRangeSelect

Permite al usuario seleccionar un rango de celdas a la vez.Este valor es ignorado si entre las opciones se encuentragoEditing.
goDrawFocusSelected

Si incluimos esta opcin, las celdas que tengan el foco deentrada sern dibujadas con un color especial para resaltarlas, dela misma manera que las celdas seleccionadas pero sin el foco deentrada. Si no la incluimos, la celda con el foco de entrada sedistingue simplemente porque ser rodeada por un rectngulo, perono por color alguno de fondo especial.
goRowSizing

Las filas que hacen scroll pueden ser redimensionadasindividualmente en ejecucin.


goColSizing

Las columnas que hacen scroll redimensionadasindividualmente en ejecucin.


goRowMoving

pueden

ser

Las filas que hace scroll pueden ser cambiadas de posicin(movidas) usando el ratn.

goColMoving

Las columnas que hace scroll posicin(movidas) usando el ratn.


goEditing

pueden

ser

cambiadas

de

Permite al usuario editar el contenido de las celdas. Siincluimos esta opcin, la opcin goRangeSelect no tieneefecto.
goTabs

Permite al usuario moverse entre las celdas de la gridusandoTab y Shift+Tab.


goRowSelect

Se selecciona una fila completa en lugar de celdasindividuales. Si tenemos esta opcin incluida, la opcingoAlwaysShowEditor no tiene efecto.
goAlwaysShowEditor

La grid se encuentra permanentemente en modo edicin (para loque debe estar seleccionada la opcin goEditing, de locontrario esta opcin por s sola no tiene efecto). Con ello, elusuario no necesita pulsar Enter o F2 para entrara editar una celda, basta con pulsar sobre ella. Si tenemosseleccionada la opcin goRowSelect,goAlwaysShowEditor no tiene efecto.
goThumbTracking

Si aadimos esta opcin, la imagen de la grid se actualizamientras el usuario pulsa sobre la barra de scrollparadesplazarse. Si no la aadimos, no veremos por dnde vamos en lagrid hasta que no soltemos la barra de scroll.

PropertyRow: Longint;
Se trata de una propiedad que slo est disponible en tiempo deejecucin que nos sirve, bien para determinar qu fila ha sidoseleccionada, 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. Asignando un valor a estapropiedad produce el mismo efecto que si pulsramos sobre esa fila. Sabiendo, gracias a esta propiedad, qu fila ha sidoseleccionada, podemos usarla como ndice para acceder a uno de losCells concreto. Hay que aadir

que la primera fila es la 0,la segunda la 1, y as hasta la ltima, que es RowCount-1.Teniendo Col y Row, en un momento dado siemprepodremos acceder a la celda concreta que est seleccionada, puesestas propiedades nos van a dar sus coordenadas.

PropertyRowCount: Longint;
Nos dice cuntas filas tiene la grid. Si le asignamos un valor,lo que hace es cambiar el nmero de filas de la grid. La gridtendr filas desde 0 hasta RowCount-1.

Ejemplo
Vamos a terminar este captulo sobre TStringGrid con unpequeo ejemplito. Simplemente, tenemos una grid, llamadaSG, a la que en tiempo de diseo slo se le ha tocado elvalor de la propiedad Ctl3D ponindolo a Falseycambiando un poco su posicin y tamao para que quede ms o menoscentrada en el form. Entonces, en el onShow del formlecambiaremos el nmero de filas y de columnas, y escribiremos algodentro de ella:
procedure TForm1.FormShow(Sender: TObject); VAR i, j: Integer; begin SG.ColCount := 12; SG.RowCount := 7; FOR i := 1 TO SG.RowCount - 1 DO SG.Cells[0,i] := 'Fila ' + IntToStr(i); FOR i := 1 TO SG.ColCount - 1 DO SG.Cells[i,0] := 'Columna ' + IntToStr(i); FOR i := 1 TO SG.RowCount - 1 DO FOR j := 1 TO SG.ColCount - 1 DO SG.Cells[j,i] := '(' + IntToStr(i) + ',' + IntToStr(j) + ')'; end;

Con esto, tenemos el resultado del grfico:

Se ha desplazado un poco la barra de scroll para que se vea quelaFixedCol es, efectivamente, Fixed.

http://delphiallimite.blogspot.com/2007/09/mostrando-datos-en-el-componente.html

Mostrando datos en el componente StringGrid


Anteriormente vimos como mostrar informacin en un componente ListView llegando incluso a cambiar el color de filas y columnas a nuestro antojo. El nico inconveniente estaba en que no se podan cambiar los ttulos de las columnas, ya que venan predeterminadas por los colores de Windows. Pues bien, el componente de la clase TStringGrid es algo ms cutre que el ListView, pero permite cambiar al 100% el formato de todas las celdas. Veamos primero como meter informacin en el mismo. Al igual que ocurra con el ListView, todos las celdas de un componente StringGrid son de tipo string, siendo nosotros los que le tenemos que dar formato a mano. AADIENDO DATOS A LA REJILLA Vamos a crear una rejilla de datos con las siguiente columnas:
NOMBRE, APELLIDO1, APELLIDO2, NIF, IMPORTE PTE.

Cuando insertamos un componente StringGrid en el formulario nos va a poner por defecto la primera columna con celdas fijas (fixed). Vamos a fijar las siguientes propiedades:
Propiedad --------ColCount RowCount FixedCols FixedRows DefaultRowHeight Valor ----5 4 0 1 20 Descripcin ----------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:

procedureTFormulario.RellenarTabla; begin withStringGrid do begin // Ttulo de las columnas Cells[0, 0] := 'NOMBRE'; Cells[1, 0] := 'APELLIDO1'; Cells[2, 0] := 'APELLIDO2'; Cells[3, 0] := 'NIF'; Cells[4, 0] := 'IMPORTE PTE.'; // Datos Cells[0, 1] := Cells[1, 1] := Cells[2, 1] := Cells[3, 1] := Cells[4, 1] := // Datos Cells[0, 2] := Cells[1, 2] := Cells[2, 2] := Cells[3, 2] := Cells[4, 2] := // Datos Cells[0, 3] := Cells[1, 3] := Cells[2, 3] := Cells[3, 3] := Cells[4, 3] := end; end; 'PABLO'; 'GARCIA'; 'MARTINEZ'; '67348321D'; '1500,36'; 'MARIA'; 'SANCHEZ'; 'PALAZON'; '44878234A'; '635,21'; 'CARMEN'; 'PEREZ'; 'GUILLEN'; '76892693L'; '211,66';

Al ejecutar el programa puede apreciarse lo mal que quedan los datos en pantalla, sobre todo la columna del importe pendiente:

DANDO FORMATO A LAS CELDAS DE UN COMPONENTE STRINGGRIND Lo que vamos a hacer a continuacin es lo siguiente: - La primera fila fija va a ser de color de fondo azul oscuro con fuente blanca y adems el texto va a ir centrado.

- La columna del importe pendiente va a tener la fuente de color verde y va a ir alineada a la derecha. - El resto de columnas tendrn el color de fondo blanco y el texto en negro. Todo esto hay que hacerlo en el evento OnDrawCell del componente StringGrid:
procedureTFormulario.StringGridDrawCell( Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState ); var sTexto: String; // Texto que va a imprimir en la celda actual Alineacion: TAlignment; // Alineacin que le vamos a dar al texto iAnchoTexto: Integer; // Ancho del texto a imprimir en pixels begin withStringGrid.Canvas do begin // Lo primero es coger la fuente por defecto que le hemos asignado al componente Font.Name := StringGrid.Font.Name; Font.Size := StringGrid.Font.Size; 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; // Es una celda fija de slo lectura? ifgdFixed in Statethen begin Brush.Color := clNavy; // le ponemos azul de fondo Font.Color := clWhite; // fuente blanca Font.Style := [fsBold]; // y negrita end else begin // Esta enfocada la celda? ifgdFocused in Statethen begin Brush.Color := clRed; // fondo rojo Font.Color := clWhite; // fuente blanca Font.Style := [fsBold]; // y negrita end

else begin // Para el resto de celdas el fondo lo ponemos blanco Brush.Color := clWindow; // Es la columna del importe pendiente? if ACol = 4 then begin Font.Color := clGreen; // la pintamos de azul Font.Style := [fsBold]; // y negrita Alineacion := taRightJustify; end else begin Font.Color := clBlack; Font.Style := []; end; end; end; sTexto := StringGrid.Cells[ACol,ARow]; FillRect( Rect ); iAnchoTexto := TextWidth( sTexto ); case Alineacion of taLeftJustify: TextOut( Rect.Left + 5, Rect.Top + 2, sTexto ); taCenter: TextOut( Rect.Left + ( ( Rect.Right - Rect.Left ) - iAnchoTexto ) div 2, Rect.Top + 2, sTexto ); taRightJustify: TextOut( Rect.Right - iAnchoTexto - 2, Rect.Top + 2, sTexto ); end; end; end;

As quedara al ejecutarlo:

Slo hay un pequeo 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. Si queremos que slo se haga una vez hay que poner a False la propiedad DefaultDrawing. Quedara de la siguiente manera:

Por lo dems creo que este componente que puede sernos muy til para mostrar datos por pantalla en formato de slo lectura. En formato de escritura es algo flojo porque habra que controlar que tipos de datos puede escribir el usuario segn en que columnas est. Pruebas realizadas en Delphi 7.

http://www.programacionfacil.com/borland_delphi:stringgrid

III BORLAND DELPHI UNIDAD ARREGLOS 6.- COMPONENTE StringGrid (adicional) DELPHI

Este componente es de los mas importantes, para el procesamiento de muchos datos, permite concentrar, procesar y mostrar gran cantidad de informacin para la vista del usuario. Este componente presenta, manipula y procesa conjuntos de datos de tipo stringsen forma tabular, es decir en forma de tablas, matrices, cuadros concentrados, ejemplo; 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 numricos internos quienes se procesan (es decir, se capturan, se realizan operaciones con ellos, se despliegan, etc.), es la informacin externa quien le da sentido. Y RECORDAR QUE SUS INDICES EMPIEZAN EN RENGLON=0 y COLUMNA=0. Algunas de sus propiedades y mtodos mas interesantes son:

ColCount.- Determina la cantidad de columnas que contendr la tabla. Recordar que para efectos de programacin, la primera de ellas es la columna 0.

RowCount.- Determina la cantidad de renglones que contendr la tabla. Recordar que para efectos de programacin, el primero de ellos es el rengln 0. Fixedcol ,Fixedrow.- Determinan la cantidad de columnas y renglones fijos o de encabezado, estas propiedades ponerlas en 0. +Options, goediting = true; Para que permita editar o capturar datos al usuario. +Options, gotab = true; Para que el usuario pueda navegar entre celdas usando la tecla del tabulador. Cells[columna,rengln], Es la propiedad mas importante, porque es la que permite el acceso a cualquier celda de la tabla, ej. StringGrid1.Cells[1,1] := 'PATO'; Edit1.Text=StringGrid1.Cells[0,0];

Las dems propiedades investigarlas en la ayuda delborlanddelphi . Para procesar todos los elementos de la tabla, solo recordar que se debenusar dos ciclos foruno externo para controlar columnas y uno interno para controlar rengln ( observar que es lo inverso de las tablas o arreglos normales). Ejemplo capturar una tabla de 3 * 4 enteros, y restarles 4 despus; Pantalla de Diseo: (inspector objetos)

FORM1:

Programa;

procedure TForm1.Button1Click(Sender: TObject); var c,r,temp:integer;

begin for c:=0 to 2 do begin for r:=0 to 3 do begin temp:= StrToInt(StringGrid1.Cells[c,r])-4; StringGrid1.Cells[c,r] := IntToStr(temp); end; end; end;

Pantalla de Corrida:

[[|Un proceso muy comn con tablas, cuadros y concentrados es agregarles listas [[|[[|de totales y promedios ya sea por columna o por rengln o ambas , por ejemplo;]]]]]] 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

TOTMES 22 26 30 PROMMES 5.5 6.5 7.8 En este ejemplo aparte de la tabla se ocupan 4 listas, dos para totales y dos para promedios. El cdigo en C++ es sencillo, pero cambiarlo a borlanddelphi, recordarlo y aprenderlo para siempre:

//declaracin float tabla[4][3], totsuc[4], promsuc[4]; floattotmes[3], promes[3]; //observar tamaos de listas que referencian rengln // listas que referencian columnas, se supone que la tabla // ya esta capturada. //cdigo para operaciones para totales y promedios //renglones por sucursal: for(reng=0;reng<=3;reng++) for(col=0;col<=2;col++) { totsuc[reng]=totsuc[reng]+tabla[reng][col]; }; for(reng=0;reng<=3;reng++) promsuc[reng]=totsuc[reng] / 3.0 ; // operaciones para totales y promedios por mes for(reng=0;reng<=3;reng++) for(col=0;col<=2;col++) {totmes[col]=totmes[col]+tabla[reng][col]; }; for (col=0;col<=2;col++) prommes[col]=totmes[col]/4.0;

TAREAS PROGRAMACION BORLAND DELPHI 1.- Construir un concentrado que despliegue los costos fijos de tres diversos productos que se fabrican en cuatro sucursales de una empresa MAQUILADORA. 2.- Construir un concentrado que contenga los ingresos por ventas mensuales de los 4 primeros meses del ao de tres sucursales de una cadena refaccionara, agregar listas de ingresos totales por mes e ingresos promedios por sucursal.

3.- Construir un cuadro que contenga las calificaciones de 5 materias de cuatro alumnos cualesquiera, incluir promedios de calificaciones por materia y por alumno.

La calidad de las respuestas es directamente proporcional a la calidad de la pregunta Dime cuanto presumes y te dir cuanto careces

También podría gustarte