PDA

Ver la Versión Completa : Columnas del DBGrid


hgiacobone
13-08-2003, 15:22:05
Bien, supongo que esto tambien se aplicaría a un simple Grid.

Si bien puedo ordenar los datos mostrados en un DBGrid al hacer clic sobre el nombre de la columna, Uds. sabrán que en la mayoría de estos componentes (como en el Explorardor de Archivos, en el WinZip, etc) se muestra con una pequeña flecha el sentido de orden [Des/Ascendente]. La pregunta es:

¿Cómo se puede mostrar esta flecha o gráffico similar en el título de la columna de un DBGrid en que el usuario hace el clic?

__cadetill
13-08-2003, 16:38:29
en mi web tienes una demo del RxDBGrid (DbGrid de las RX) que muestra precisamente eso

hgiacobone
13-08-2003, 16:56:25
Posteado originalmente por cadetill
en mi web tienes una demo del RxDBGrid (DbGrid de las RX) que muestra precisamente eso

Gracias CADE... siempre tan atento.
De todas formas, lo interesante sería tratar de hacer SIN librerías externas. Eso es lo que busco. Tal vez alguien sepa cómo hacerlo; de hecho alguine una vez me ha comentado que con alguna metodología del Canvas era posible, pero no logro desculalrlo.

le4br
20-11-2004, 02:40:09
...Tal vez alguien sepa cómo hacerlo; de hecho alguine una vez me ha comentado que con alguna metodología del Canvas era posible, pero no logro desculalrlo. hgiacobone, ya sabes como hacer para mostrar una imagem en el titulo de la columna?

Mi gustaria saber como mostrar una pequeña flecha en el título de la columna de un DBGrid para indicar el sentido de orden (Des/Asc), pero SIN librerías externas, tambien.

hgiacobone
23-11-2004, 20:51:55
No... nadie me ha ayudado.

le4br
24-11-2004, 23:44:40
Hola amigos,

Yo no desisto nunca y como en Delphi nadia es impossible, aqui hay una solucion que ordena los datos de la tabla, atraves del metodo Sort, y agrega una imagem bmp, en el titulo de la columna del DBGrid, que indicaran la ordem de los registros (ASC / DESC).

El codigo es de Luiz Fernando Severnini y adaptado por mim.

- Vamos utilizar um TImageList (Win32 Component Palette). Doble clique en el ImageList1 para añadir las imagens bmp (Puedes crear las imagens en Paint del Windows o obtener en la carpeta de imagens en el diretorio Borland Shared). Seta arriba indica la ordem DESC y seta abajo ASC.

Ahora devemos añadir la declaracion TDBGrid = class(DBGrids.TDBGrid) en la linea seguinte al type:

type
TDBGrid = class(DBGrids.TDBGrid);
TForm1 = class(TForm)
.
.
.

Declaramos Indice como variable global

var
Form1: TForm1;
.
.
.
// Adquiri la columna clicada, para mostrar la imagem.
Indice: Integer;


En el evento OnTitleClick do DBGrid:

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
// Ordena los datos ASC o DESC
if DBGrid1.DataSource.DataSet is TCustomADODataSet then
with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
if (Pos(Column.FieldName, Sort) = 1) and (Pos(' ASC', Sort)= 0) then
begin
// Sort specifies the sort order of the recordset.
Sort := Column.FieldName + ' ASC';
end
else
begin
Sort := Column.FieldName + ' DESC';
end;
Indice := Column.Index; { Returns the item’s position in the Items array of TCollection. Atribue la columna clicada a variable global}
end;


Ahora en el evento OnDrawColumnCell del DBGrid1:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Bmp : TBitMap; // variable del tipo TBitMap que recibi la figura de lo ImageList1

// Funcion local al evento OnDrawColumnCell, para obtener la anchura de las columnas:
function GetColsWidth: Integer;
var
I : Integer;
begin
Result := 0;
for I := 0 to Column.Index do
begin
Result := Result + TDBGrid(Sender).Columns.Items[I].Width;
end;
Result := Result + 10 + (Column.Index);
end;

begin
// Hacemos el acesso a los membros protegidos de la classe TDBGrid
with TDBGrid(Sender) do
begin
// Determina la columna clicada...
if Column.Index = Indice then
begin
// ...Creamos la variable Bmp
Bmp := TBitMap.Create;

with Bmp do // Configuracion de color transparente
begin
TransparentColor := clWhite;
Transparent := True;
TransparentMode := tmAuto
end;

try
// Determina la imagem mostrada de acuerdo com la ordem de los registros
if DBGrid1.DataSource.DataSet is TCustomADODataSet then
with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
if (Pos(Column.FieldName, Sort) = 1) and (Pos(' ASC', Sort)= 0) then
ImageList1.GetBitmap(0, Bmp) // Seta abajo
else
ImageList1.GetBitmap(1, Bmp); // Seta arriba

// Determina se la altura del titulo es suficiente para recibir la imagem
if RowHeights[0] < Bmp.Height+4 then
RowHeights[0] := Bmp.Height+4;

// Muestra la imagem el titulo de acuerdo com la posição
Canvas.Draw((GetColsWidth-Bmp.Width),(RowHeights[0] - Bmp.Height) div 2, Bmp);
finally
Bmp.Free; // Liberamos la variable Bmp de la memoria
end;
end

else

// Si no es la columna clicada, entonces nadia acontece...
DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end;


Que tal?
Gracias a todos y perdon por el español.

Saludos!