Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-11-2004
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.419
Poder: 15
AGAG4 Va por buen camino
Como Pintar Solo la Celda y No Toda la Columna de la Celda de un dbGrid??

Como Pintar Solo la Celda y No Toda la Columna de la Celda de un dbGrid??

Lo que pasa es que quiero cambiar de fondo una Celda uso el siguiente código:
Código Delphi [-]
procedure TfFacturas.gridFacDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
{ gdSelected
   gdFocused }
  if not PVentaCheck then
    if (Column.Index = 3) and (State = [gdSelected]) then begin
      //Pintar el Color de la Letra
      gridFac.Canvas.Font.Color := clBlack;    
      //Pintar el Fondo de la Celda
      gridFac.Canvas.Brush.Color := clSilver;
      gridFac.DefaultDrawColumnCell(rect,DataCol,Column,State);
    end;
end;

Con el código de arriba no me pinta nada aun así si esta seleccionada la Celda No. 3, El problema es que si le quito el Tipo de Estado "State = []" si me lo colorea pero a parte si abro un nuevo registro me pinta la celda del Nuevo registro de la misma Celda por lo que lo unico que quiero es que no me pinte nada abajo siempre y cuando se cumpla la condicion if not PVentaCheck then.

Espero me haya Explicado.
Cualquier sugerencia se los agradezco.
Responder Con Cita
  #2  
Antiguo 13-11-2004
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.512
Poder: 14
RONPABLO Va por buen camino
Tal vez esto pueda ayudar

Cambia en donde compara el estado el '='por 'in'. mira en el codigo abajo

Código Delphi [-]
procedure TfFacturas.gridFacDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
{ gdSelected
   gdFocused }
  if not PVentaCheck then
    if (Column.Index = 3)and (gdSelected in State)then begin
      //Pintar el Color de la Letra
      gridFac.Canvas.Font.Color := clBlack;   
      //Pintar el Fondo de la Celda
      gridFac.Canvas.Brush.Color := clSilver;
      gridFac.DefaultDrawColumnCell(rect,DataCol,Column,State);
    end;
end;
Responder Con Cita
  #3  
Antiguo 13-11-2004
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.419
Poder: 15
AGAG4 Va por buen camino
No me Funciona

Gracias por su respuesta, pero no me funcionó, trato de poner
(Column.Index = 4) a (Column.Index = 3) para que me coloree la Columna #3 pero en vez de colorearme se mueve la Celda, si no hago esta misma asignación me colorea la columna #4 en vez de la #3 y si me colorea la #4 al abrir un nuevo registro se quita el Color, en fin es un desastre.

Que tenga buen día.
Responder Con Cita
  #4  
Antiguo 13-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.107
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Si quieres que el pintado afecte sólo a las filas que satisfagan una condición entonces esta condición debe de alguna manera depender de la fila. En tu código PVentaCheck o es falso o es verdadero para todas las filas así que, o se pintan todas las celdas de la columna o no se pinta ninguna.

// Saludos
Responder Con Cita
  #5  
Antiguo 15-11-2004
mfcorral mfcorral is offline
Registrado
 
Registrado: nov 2004
Posts: 3
Poder: 0
mfcorral Va por buen camino
COlorear DBGridColumn

Prueba lo siguiente

if DataCol = 0 then //Index de la columna que quieres colorear
begin
DBGrid1.Canvas.Brush.Color := clBlue; //Color de fondo
FillRect(DBGrid1.Canvas.Handle, Rect, DBGrid1.Canvas.Brush.Handle);
DBGrid1.Canvas.Font.Color := clRed; //Color de fuente
DBGrid1.Canvas.TextOut(Rect.left + 2, Rect.top + 2, Column.Field.AsString);
end;
Responder Con Cita
  #6  
Antiguo 15-11-2004
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.419
Poder: 15
AGAG4 Va por buen camino
Código Delphi [-]
 if not PVentaCheck then 
    if (Column.Index = 3) and (State=[]) then begin
      gridFac.Canvas.Brush.Color := clBlue; //Color de fondo
      FillRect(gridFac.Canvas.Handle, Rect, gridFac.Canvas.Brush.Handle);
      gridFac.Canvas.Font.Color := clRed; //Color de fuente
      gridFac.Canvas.TextOut(Rect.left + 2, Rect.top + 2, Column.Field.AsString);
      PVentaCheck:=true;
    end;

Cambie el Estado de la Celda y el número de Columna que quiero que me cambie de Color, Agregue el Código que me proporciono MFCORRAL para pintar la Celda Si me funciona Corrrectamente pero si abro un Nuevo registro me la DESPINTA y vuelve a su estado normal, es lo que quiero evitar que haga eso, quiero que quede el Color que le pongo al cumplirse la condición, siendo que la condicion la hago en el evento OnColExit de la Columna #3.
Responder Con Cita
  #7  
Antiguo 15-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.107
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por AGAG4
siendo que la condicion la hago en el evento OnColExit de la Columna #3
A pesar de que hiciste caso omiso de mi comentario lo intentaré nuevamente.

No puedes establecer la condición en un momento dado, tienes que establecerla en cualquier momento.

Las celdas en un grid no se pintan porque en algún momento les digamos "píntense de rojo", debemos decírselos en todo momento. Dicho de otra forma, el pintado de las celdas de un grid funciona como sigue:

Cuando el grid debe ser repintado, sea porque la ventana se descubre, se mueve alguna columna, se hace un deslazamiento, cambian de posición las filas, etc., etc., etc., la VCL genera el el evento OnDrawColumnCell. Tú no tienes manera de saber en qué momento vas a recibir este evento. Por ello el código en tu evento debe estar preparado para cualquier situación.

Si tú estableces una condición en el evento OnColExit, quizá se pinte como deseas durante un momento, es decir, mientras el grid no se repinte por alguna otra acción (como abrir un nuevo registro). En el próximo repintado, tu evento debes estar listo para dibujar la celda correcta.

En todas las versiones que has puesto, no hay ninguna condición que sea específica de la celda que quieres, si acaso hay de la columna, pero no de la fila.

En fin, lo que yo veo es que hay un error de concepción en lo que piensas que hace el evento OnDrawColumnCell y te recomiendo que revises desde el punto de vista que te doy.

// Saludos
Responder Con Cita
  #8  
Antiguo 15-11-2004
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.419
Poder: 15
AGAG4 Va por buen camino
Si Entiendo

Si Entiendo lo que me dijo en su primer comentario, pero sinceramente no sabìa que tambien se le tiene que decir al grid en que Registro se debe de pintar, pero bueno, yo reconozco que usted esta en lo Correcto, mi unica finalidad es de Pintar SOLO una Celda de un Registro que cumpla una condicón, no quiero que me pinte Toda la Fila y toda la columna de una Celda, como ya se dio cuenta es la primera vez que intento hacer esto, solamente ocupo saber si no se puede hacer lo que menciono.

Espero me haya explicado.
Saludos.
Responder Con Cita
  #9  
Antiguo 15-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.107
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por AGAG4
solamente ocupo saber si no se puede hacer lo que menciono.
Claro que se puede hacer. Únicamente tienes que determinar con toda precisión cuál es la condición que se debe cumplir. Y no me refiero al código sino a lo que tú requieres. Una vez que tengas claro esto te será mucho más fácil transportarlo a código.

Por dar un ejemplo, suponte que tienes en la columna 3 un dato numérico y deseas pintar de rojo aquellas celdas de dicha columna cuyos valores sean negativos. La condición será del estilo:

Código Delphi [-]
if (Column.Index = 3) and (SelectedField.AsInteger < 0) then
begin
  ...
end;

En este caso la condición no sólo incluye el número de columna sino además una condición que depende de la fila (esto es, del valor en particular que tenga el campo de esa columna para una fila o filas en específico).

// Saludos
Responder Con Cita
  #10  
Antiguo 15-11-2004
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.419
Poder: 15
AGAG4 Va por buen camino
oki

La condicion la ya tengo Sr. Roman, hago la validación en el Evento OnColExit del dbgrid cuando capturo un valor en la celda determinó que valor contendrá PVentaCheck si es False pintará la Celda de lo contrario no la pinta, pero el Problema no es eso si no que al Insertar un nuevo registro la DESPINTA, este es mi problema.

Saludos.
Responder Con Cita
  #11  
Antiguo 15-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.107
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Volvemos al mismo punto. Tú asignas un valor a PVentaCheck como dices en el evento OnColExit y será válido sólamente para el registro que acabs de editar, pero el evento OnDrawColumnCell no tiene ni idea de a qué registros aplicar esa condición. El evento únicamente ve una variable estática PVentaCheck pero nada que le indique qué fila usar.

Lo más posible es que el código que uses en OnColExit para determinar el valor de PVentaCheck debas trasladarlo al evento OnDrawColumnCell.

// Saludos
Responder Con Cita
  #12  
Antiguo 15-11-2004
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.419
Poder: 15
AGAG4 Va por buen camino
Gracias....!!!!

Ok.. Roman Gracias, y disculpe si lo hice sacar de onda pero es la primer vez que pinto una celda de un dbgrid desconocía como se hacía para pintar solo un registro sin pintar toda la columna y toda la fila de la celda.

Le agradezco su valioso Tiempo.
Que tenga buen día.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 18:59:50.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi