 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
mgf Invitado
|
Publicado: Mar 05 Nov, 2002 5:49 pm Asunto: Alternar color en filas DBGrid |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 06 Nov, 2002 2:47 am Asunto: |
|
|
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 |
|
 |
mgf Invitado
|
Publicado: Mie 06 Nov, 2002 8:47 am Asunto: |
|
|
Gracias, pero lo he probado y no me funciona porque RecNo siempre
me vale -1. Esoy con BDE+Oracle |
|
| Volver arriba |
|
 |
mgf Invitado
|
Publicado: Jue 14 Nov, 2002 12:30 pm Asunto: |
|
|
Tema solucionado haciendo un (select rownum ,...)
que equivale al RecNo en otras bases de datos |
|
| Volver arriba |
|
 |
cuisak Invitado
|
Publicado: Sab 16 Nov, 2002 1:54 pm Asunto: como usar select rownum |
|
|
| 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 |
|
 |
mgf Invitado
|
Publicado: Vie 29 Nov, 2002 9:24 am Asunto: |
|
|
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 |
|
 |
Cerúleo Invitado
|
Publicado: Vie 29 Nov, 2002 7:18 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 29 Nov, 2002 9:35 pm Asunto: |
|
|
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 |
|
 |
Cerúleo Invitado
|
Publicado: Dom 01 Dic, 2002 12:26 pm Asunto: |
|
|
| Gracias _Leo por la respuesta. Voy a mirar. Un saludo |
|
| Volver arriba |
|
 |
cuisak Invitado
|
Publicado: Sab 07 Dic, 2002 2:57 am Asunto: |
|
|
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 |
|
 |
cuisak Invitado
|
Publicado: Dom 08 Dic, 2002 3:19 am Asunto: |
|
|
| 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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 08 Dic, 2002 8:39 am Asunto: |
|
|
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 |
|
 |
Cuisak Invitado
|
Publicado: Sab 14 Dic, 2002 6:33 pm Asunto: |
|
|
Seccion de Peloteo y agradecimientos (de verdad, de verdad de la buena ):
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.....  |
|
| Volver arriba |
|
 |
Trols Invitado
|
Publicado: Vie 15 Oct, 2004 12:46 am Asunto: Problema |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 15 Oct, 2004 2:07 am Asunto: |
|
|
| 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|