Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Alternar color en filas DBGrid
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Alternar color en filas DBGrid Responder citando

Hola, alguien puede decirme cómo puedo pintar las filas de un dbgrid alternando los colores?
Por ejemplo:
rojo
azul
rojo
azul
Vamos, una fila de un color y la siguiente de otro pero independientemente de si está seleccionada o tiene el foco o ...
Gracias
Volver arriba
Mensaje    Asunto: Responder citando

Dependiendo del formato de base de datos que utilices puedes probar lo siguiente en el evento OnDrawColumnCell del DBGrid:
Código:
    // Puntero al DbGrid enlazado con este evento
    TDBGrid *grid = dynamic_cast<TDBGrid*>(Sender);

    if ( grid && !State.Contains(gdSelected) )
    {
        grid->Canvas->Brush->Color =
            (grid->DataSource->DataSet->RecNo & 1) ?
                clRed : clBlue;
    }

    grid->DefaultDrawColumnCell(Rect, DataCol, Column, State);

              

(Probado con BDE+Paradox y ADO+Access)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias, pero lo he probado y no me funciona porque RecNo siempre
me vale -1. Esoy con BDE+Oracle
Volver arriba
Mensaje    Asunto: Responder citando

Tema solucionado haciendo un (select rownum ,...)
que equivale al RecNo en otras bases de datos
Volver arriba
Mensaje    Asunto: como usar select rownum Responder citando

He tenido ese problema antes y mi solucion fue efectiva pero mucho mas cutre.... Yo uso BDE+Interbase y tampoco me funciona haciendo uso de RecNo...lo que quisiera es saber como uso lo que dices "select rownum", es un metodo de DataSet, y un ejemplo de como usarlo?.... gracias de antemano
Volver arriba
Mensaje    Asunto: Responder citando

Select rownum es sql, no tiene que ver con Builder.
Yo utilizo Oracle no sé si a ti te funcionaría.

En la consulta pones:

Select rownum,campo1,..,from tabla1

El método es igual que lo que ha escrito Leo pero en lugar de utilizar RecNo utilizas Query1->FieldByName("rownum")->AsInteger.

Tienes que tener en cuenta que si ordenas la consulta no te lo va a hacer bien porque tienes que obtener el rownum después de hacer la consulta,entonces haces:

Select rownum consulta.* from (select campo1,..,campon from tabla1 order by campo1) consulta
Volver arriba
Mensaje    Asunto: Responder citando

Hola _Leo.
¿Cómo has hecho para hacer el Form que has insertado en la respuesta? Me gusta y tengo ganas de cambiar el clásico aspecto del estandar de Windows.

Gracias de antemano
Volver arriba
Mensaje    Asunto: Responder citando

Hola, no he hecho nada especial, este es uno de los temas/skins que trae el Windows XP de fabrica.

De todos modos si quieres hacer algo similar en otras versiones de Windows hay varios programas que lo permiten, uno de ellos se llama WindowBlinds:

http://www.stardock.com

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias _Leo por la respuesta. Voy a mirar. Un saludo
Volver arriba
Mensaje    Asunto: Responder citando

antes de na gracias por reponder a todos.... a _Leo por iluminar mi camino y a mgf por corregirlo (un poco de pelotilla nunca esta de mas, je)

if (Column->Field->DataSet->FieldByName("CODIGO")->AsInteger % 2 == 0) {
if (State.Contains(gdSelected)) DBGrid1->Canvas->Brush->Color = clHighlight;
else DBGrid1->Canvas->Brush->Color = clWhite;
}
DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);


Yo uso esto en el mismo evento, pero los valores varian en funcion de los valores almacenados en la base de datos.

El caso es:
mgf -> rownum es el nombre que le has dado a una columna? o como su nombre dice es algun metodo interno que tiene oracle y no interbase que devuelve el numero de fila? porque el interbase me dice que no la conoce y no me permite hacer la consulta.
En el Query he puesto "Select rownum from Bancos"

joe si que me enrollo, pos eso tios, que muchas gracias solo por leerlo y si contesta alguien le estare eternamente agradecido (casi tanto como a mgf .... mas peloteo, ta luego)
Volver arriba
Mensaje    Asunto: Responder citando

hola de nuevo (odio ser pesao) ... he tao investigando y ya se lo que es rownum (una pseudocolumna que existe en oracle, pero no en interbase, la v5.3 que es la que uso) (y yo volviendme loco, je) asi que quiza ahora el asunto esta un poco mas feo.... como hago pa solucionarlo, ya sea una solucion SQL o C++? (no me funciona el RecNo de Leo, ni el rownum de mgf)....
Volver arriba
Mensaje    Asunto: Responder citando

Aquí va otra forma de hacerlo que no usa 'RecNo' y por tanto teóricamente debería funcionar con cualquier base de datos.

Esta probado en BCB1 y BCB6, y aunque en esta ultima se podrían quitar algunas cosillas y hacerla mas corta, he preferido que funcione en todas las versiones del builder igual.

Como anteriormente, metemos lo siguiente en el evento OnDrawColumnCell del DBGrid:

Código:
// Puntero al TDBGrid enlazado con este evento
TDBGrid *grid = dynamic_cast<TDBGrid*>(Sender);

// Toda esta parte (EventoLocal) nos la podemos ahorrar poniendo
//   la linea 'DBGrid1->Repaint()' en el evento OnDataChange del
//   DataSource asociado al grid.  Esta tonteria la hago así mas
//   que nada para dejar todo el ejemplo dentro del mismo evento ;-)
static struct {
    TDBGrid *grid;
    TDataChangeEvent EventoViejo;
    void __fastcall EventoNuevo(TObject *remite, TField *campo) {
        grid->Invalidate();
        if (EventoViejo)
            EventoViejo(remite, campo);
    }
} EventoLocal;

if (!EventoLocal.grid) {
    EventoLocal.grid = grid;
    EventoLocal.EventoViejo = grid->DataSource->OnDataChange;
    grid->DataSource->OnDataChange = EventoLocal.EventoNuevo;
}

// Esto no es necesario en algunas versiones, lo hago para
//   asegurarme que el mismo codigo funciona en todas las versiones
struct TDBGridX : public TDBGrid {
    TGridCoord __fastcall MouseCoordX(int x, int y) {
        return MouseCoord(x, y);
    }
};

// Calculamos que numero de posicion ocupa la celda
POINT pt = { Rect.Left, Rect.Top };
::ClientToScreen(grid->Canvas->Handle, &pt);
TGridCoord coord=static_cast<TDBGridX*>(grid)->MouseCoordX(pt.x, pt.y);

// Pintamos la celda segun su posicion par o impar
if ( grid && !State.Contains(gdSelected) )
    grid->Canvas->Brush->Color = (coord.Y & 1) ? clWhite : clAqua;

grid->DefaultDrawColumnCell(Rect, DataCol, Column, State);
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Seccion de Peloteo y agradecimientos (de verdad, de verdad de la buena Wink ):
joer, me he quedado "......." sin palabras de lo bueno que ha resultado el codigo de _Leo (yo quiero saber aunque sea un poquico de lo que sabe él, jooooo, jeje), en fin, lo dice to el mundo y resulta tipico, pero a veces lo tipico tiene un sentido, asi que muchisimas gracias a mgf de nuevo por hacer la pregunta originaria de to esto y por interesarse como el que mas, y muchisimas gracias _Leo por.... convertirse en mi guia espiritual, jejeje (soy exagerao ehhh, je).

PD: me enrrollo demasiao lo se, pero aun asi, añado que..... je, es broma..... Very Happy
Volver arriba
Mensaje    Asunto: Problema Responder citando

He probado el código en Builder 5, y me ha lanzado un error al compilarlo
en la siguiente línea:

::ClientToScreen(grid->Canvas->Handle, &pt);

El Error es el siguiente:
[C++ Error] FormPrincipal.cpp(116): E2034 Cannot convert 'HDC__ *' to 'HWND__ *'
[C++ Error] FormPrincipal.cpp(116): E2342 Type mismatch in parameter 'hWnd' (wanted 'HWND__ *', got 'HDC__ *')

Que es lo que será desde ya muchas gracias
Volver arriba
Mensaje    Asunto: Responder citando

Aunque a mi ni en el BCB1, 4 y 6 me da ningún error (la 5 no la tengo instalada) de todos modos esa línea la puedes quitar tranquilamente, es un despiste, no era necesaria.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.