PDA

Ver la Versión Completa : ¿Se pueden quitar las líneas verticales en un dbgrid pero dejar las de las cabeceras?


Angel Fernández
12-02-2010, 20:38:02
Hola a todos.

Estoy tratando de obtener un dbgrid (o jvdbgrid que viene a ser lo mismo pero un poco avanzado) sin líneas verticales para darle un aspecto más elegante (según mi criterio).
Esto es fácil: En options -> dgcollines -> poner false y listo. Pero se pierden también las líneas verticales de las cabeceras y considero que queda mejor con estas líneas, para definir bien las columnas, que sin ellas.

Esto que digo (líneas verticales sólo en la cabecera) lo hacen otros componentes de terceros previo paso por caja (tmsgrid, expressgrid, etc.) pero el componente jvdbgrid es muy válido.

¿Se puede hacer lo que digo, por ejemplo usando el DefaultDrawColumnCell(Rect, DataCol, Column, State)? (Esta sugerencia me la saco un poco de la manga)

Un saludo al foro.

rgstuamigo
12-02-2010, 20:56:27
Revisa dentro de la propiedad Options de tu DBGrid y ubica la opcion que dice dgColLines que es para las lineas de columnas y dgRowLines para las lineas de Filas. ;) .. No sé si es lo que buscas :rolleyes:...
Saludos...:)

Angel Fernández
12-02-2010, 21:03:39
Gracias por tu respuesta. Sin embargo, eso es lo que decía en mi mensaje original, que tocando en opciones -> dgcollines -> false te quita las líneas verticales pero también te quita las líneas de las cabeceras (donde aparecen los nombres de los campos) y lo que busco es que no me quite las de las cabeceras.

Un saludo.

cocute
12-02-2010, 22:32:46
si te fijas con un StringGrid si que se puede pero con un Dbgrid no,
quizas puedas mirar el codigo fuente (.pas) del componente StringGrid e intentar copiar esa propiedad en el Dbgrid
aunque no sera facil, pero quizas tengas suerte y lo sea.

rgstuamigo
12-02-2010, 22:55:30
Bueno entonces vamos a utilizar el evento OnDrawColumnCell del dbGrid y poner este codigo:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var i,x,u,y:Integer;
begin
x:=12;//inicializo en 12 por la anchura de la pequeña columna del indicador (Flecha)
y:=TAuxGrid(DBGrid1).DefaultRowHeight; //obtengo la altura de las filas
for i:=0 to DataCol-1 do
x:=x+DBGrid1.Columns[i].Width;//obtengo la anchura hasta la DataCol-1 columna

DBGrid1.Canvas.Pen.Color:=clBlack;//determino el color que va ser la linea
DBGrid1.Canvas.MoveTo(x,0);//pongo la punta del lapiz en la coordenada (x,0)
DBGrid1.Canvas.LineTo(x,y);//Dibujo una linea hasta la coordenada (x,y)
if DataCol=DBGrid1.Columns.Count-1 then //verifico si es la ultima columna
begin
x:=10;//inicializo x en 10 por conveniencia
for i:=0 to DBGrid1.Columns.Count-1 do
x:=x+DBGrid1.Columns[i].Width; //obtengo la anchura de todas las columnas
DBGrid1.Canvas.MoveTo(x,0);
DBGrid1.Canvas.LineTo(x,y);// dibujo una linea al final de la ultima columna
end;
end;
Ahora te preguntarás que es TAuxGrid el que esta con rojo, pues simplemente es una clase auxiliar que te permite hacer casting a una clase ancestra y poder acceder a los atributos y propiedades protegidas y demás(Buen truco por si acaso).Para usarla debes declarala en la sección de Type de delphi, algo así:
...
type
TAuxGrid = class(TDBGrid);//<---;)
TForm1 = class(TForm)
.....

Y para que se repinten las lineas cuando por ejemplo minimizes o muevas tu formulario(anque quisas no sea necesario :rolleyes:) según si es el caso puedes llamar al método Invalidate de tu DbGrid en cuestión, yo lo he puesto en el evento OnPaint del formulario algo asi:
procedure TForm1.FormPaint(Sender: TObject);
begin
DBGrid1.Invalidate;
end;.
Desde luego quisas pueda haber una mejor forma de hacerlo pero a mi se me ocurrió asi::rolleyes:;).
Pruébalo...
Saludos...:)

Caro
12-02-2010, 23:18:52
Hola Angel Fernández, puedes hacer también un Cast a StringGrid y añadir la opción goFixedVertLine.


TStringGrid(DBGrid1).Options := TStringGrid(DBGrid1).Options + [goFixedVertLine];


Saluditos

rgstuamigo
12-02-2010, 23:26:12
Hola Angel Fernández, puedes hacer también un Cast a StringGrid y añadir la opción goFixedVertLine.

Código Delphi [-] (http://www.clubdelphi.com/foros/#) TStringGrid(DBGrid1).Options := TStringGrid(DBGrid1).Options + [goFixedVertLine];


Saluditos
Definitivamente creo que la opcion que brinda Caro es la mejor..:eek::D, amigo Angel Fernández olvídate de mi anterior código chapuza :o y hazlo como indica Caro.:D:D.

Al González
13-02-2010, 00:14:21
Definitivamente creo que la opcion que brinda Caro es la mejor..:eek::D, amigo Angel Fernández olvídate de mi anterior código chapuza :o y hazlo como indica Caro.:D:D.
Chapuza sería lo que estaba pensando yo: agregar un segundo DBGrid sobrepuesto, con la altura exacta de la cabecera. :D

Un afectuoso saludo hasta Cochabamba y Santa Cruz.

Al. :)

Angel Fernández
13-02-2010, 20:37:43
Caramba, amigos, muchas gracias por vuestras respuestas. Probaré lo de Caro a ver qué tal.
Y cuidado con lo que dice Al que no lo descarto...

Un saludo.

Angel Fernández
13-02-2010, 20:55:09
Hola Angel Fernández, puedes hacer también un Cast a StringGrid y añadir la opción goFixedVertLine.

Código Delphi [-] (http://www.clubdelphi.com/foros/#) TStringGrid(DBGrid1).Options := TStringGrid(DBGrid1).Options + [goFixedVertLine];


Saluditos

Funciona perfectamente. Muchas gracias Caro. Y también muchas gracias para Rgstuamigo por tu código.

Un saludo.

Delfino
15-02-2010, 12:57:48
Pq no usar El DBGrid sin la fila de titulos y en su lugar poner un control THeader y asi lo personalizas a tu gusto..