Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Al usar TCanvas perdi la selección !!! (https://www.clubdelphi.com/foros/showthread.php?t=75472)

lmpadron 26-08-2011 14:42:08

Al usar TCanvas perdi la selección !!!
 
hola amigos

Estoy usando un DBGrid y al realizar la consulta pues coloreo las filas pares para que resalten, sucede que las filas coloreadas al ser seleccionadas(en el momento en que se le da click encima) pierden la visualizacion (el valor que estan mostrando) y no se ponen del tipico color azul (como casi todo lo que se selecciona en windows). :confused::confused::confused:

posteo el codigo que estoy usando para que me lo revisen y si existe alguna solucion estare muy agradecido

Código:


void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{
        //dibujando filas pares en grid 1
        TCanvas *Temp = ((TDBGrid *) Sender)->Canvas;

        if (ADOQuery1->RecNo % 2)
        {
                Temp->Brush->Color = StringToColor("0x00f7fbfd");
        }

        Temp->FillRect(Rect);
        Temp->TextOut(Rect.Left, Rect.Top, Column->Field->AsString);
}


ecfisa 26-08-2011 17:35:52

Hola Impadron.

Probá de este modo:
Código:

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender, const TRect &Rect,
  int DataCol, TColumn *Column, TGridDrawState State)
{
  if (ADOQuery1->RecNo % 2) {
    DBGrid1->Canvas->Brush->Color = clMoneyGreen;
    DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);
  }
}

Saludos.

lmpadron 26-08-2011 17:55:22

La celda coloreada aun sigue sin cambair de color y las letras se muestran en blanco, con el clMoneyGreen no hay problema porque se ve bien pero con el StringToColor("0x00f7fbfd") que es un crema un tanto mas claro me hace falta que al estar seleccionado las letras de la fuente me salgan en negro o que se señale en Azul como es normalmente para que las letras del fondo al ser blancas se puedan distinguir.
saludos

Chris 26-08-2011 17:57:59

Lo que sucede es que estás utilizando un color constante para todos los estados de la celda. El estado de una celda (si está seleccionada o no) es indicado en el parámetro State de tipo TGridDrawState.

El color constante que estás utilizando es "0x00f7fbfd". Debes utilizar una condicional que pruebe el estado de la celda, y utilizar el color clHotlight cuando la celda esté seleccionada.

Saludos,
Chris

lmpadron 26-08-2011 18:27:44

y como accedo a los valores de State, lo que he hecho es esto

Código:


if (State == NO ENCUENTRO QUE PONER)
    {
      DBGrid1->Canvas->Brush->Color = clHotLight;
    }
    else
    {
      if (ADOQuery1->RecNo % 2)
      {
        DBGrid1->Canvas->Brush->Color = StringToColor("0x002899d2");
        DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);
      }
    }

es algo asi no ???

Chris 26-08-2011 18:33:23

En C++ no sé cómo sería el código, no escribo en ese lenguage. Pero en Delphi tu código más o menos debería ser así:

Código Delphi [-]
if (ADOQuey.RecNo mod 2) then
begin
  if not (gdsSelected in State) then
      DBGrid1.Canvas.Brush.Color := { tu color para líneas impares };
end;

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

ecfisa 26-08-2011 18:40:02

Hola Impadrón.

No había probado con el color que pusiste por lo que no veía el problema.
En realidad no perdes la selección. El texto, que en la selección esta en color blanco, se confunde con el color '0x002899d2' ya que es muy similar.

Yo lo resolví así:
Código:

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State)
{
  DBGrid1->Canvas->Font->Color = clBlack; /* Texto en negro */
  if (ADOQuery1->RecNo % 2){
  DBGrid1->Canvas->Brush->Color =  0x00f7fbfd;
  DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);
  }
}

Saludos.

ecfisa 26-08-2011 18:49:59

Hola.

Te agrego un ejemplo más completo, en el cuál seleccionás los colores de fondo y fuente en ambos casos (par/impar):
Código:

void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column, TGridDrawState State)
{
  if (ADOQuery1->RecNo % 2) {
  DBGrid1->Canvas->Font->Color = clBlack;  /* letra negra */
  DBGrid1->Canvas->Brush->Color =  clLime; /* fondo claro */
  }
  else{
  DBGrid1->Canvas->Font->Color = clWhite;  /* letra blanca */
  DBGrid1->Canvas->Brush->Color =  clNavy; /* fondo oscuro */
  }
  DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);
}

Saludos.

lmpadron 26-08-2011 18:52:05

Gracias amigos ecfisa y Chris

Estaba probando el codigo que Chris habia escrito en Pascal y pues no puedo convertirlo a C++, ahora voy a probar con tu solucion ecfisa de todas formas si alguien puede convertir el codigo del amigo Chris seria excelente.

Saludos

Chris 26-08-2011 18:52:38

Cita:

Empezado por ecfisa (Mensaje 410202)
Hola.
Te agrego un ejemplo en el cuál seleccionás los colores de fondo y fuente en ambos casos:
Saludos.

El problema ecfisa es que el compañero necesita descartar esos colores al momento de seleccionar la celda. Es por eso que le he dicho que lo que no está haciendo es tomar en cuenta el estado de la celda indicado en el parámetro State. Si el parámetro State posee dgsSelected, entonces ése es el indicativo de que la celda está seleccionada.

Saludos,
Chris

ecfisa 26-08-2011 19:01:58

Cita:

Empezado por lmpadron (Mensaje 410204)
Gracias amigos ecfisa y Chris

Estaba probando el codigo que Chris habia escrito en Pascal y pues no puedo convertirlo a C++, ahora voy a probar con tu solucion ecfisa de todas formas si alguien puede convertir el codigo del amigo Chris seria excelente.

Saludos

Hola.

La conversión del código de Chris es:
Código:

if(ADOQuery1->RecNo % 2)
  if(!State.Contains(gdSelected))
    DBGrid1->Canvas->Brush->Color =  0x00f7fbfd;
  DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);

Saludos.

Chris 26-08-2011 19:05:03

Gracias ecfisa por la traducción! :)
Solo que se te ha escapado la negación en la segunda condicional.
Código:

if(ADOQuery1->RecNo % 2)
  if !(State.Contains(gdSelected))
    DBGrid1->Canvas->Brush->Color =  0x00f7fbfd;
  DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);

Saludos,
Chris

ecfisa 26-08-2011 19:06:17

Cita:

Empezado por Chris (Mensaje 410205)
El problema ecfisa es que el compañero necesita descartar esos colores al momento de seleccionar la celda. Es por eso que le he dicho que lo que no está haciendo es tomar en cuenta el estado de la celda indicado en el parámetro State. Si el parámetro State posee dgsSelected, entonces ése es el indicativo de que la celda está seleccionada.

Saludos,
Chris

Hola Chris.

Entiendo lo que comentas, pero aparte de la selección, creo que de todas maneras las celdas tienen que tener colores diferentes cuando son pares o impares.

Ahora voy a probar evaluando la condición del estado.

Un saludo.

Edito: Tenés toda la razón Chris :), gracias por la observación, ya incluí el "!" en la condición del código del mensaje superior

lmpadron 26-08-2011 19:07:13

Gracias amigos por su ayuda !!!

Chris 26-08-2011 19:11:51

Cita:

Empezado por ecfisa (Mensaje 410208)
Hola Chris.

Entiendo lo que comentas, pero aparte de la selección, creo que de todas maneras las celdas tienen que tener un color diferentes cuando son pares e impares.

Ahora voy a probar implementando la condición de selección.

Un saludo.

Sí lo tendrán inclusive con un código pequeño. Al utilizar DefaultDrawColumnCell, el sistema utilizará el color indicado en la propiedad Color del TDBGrid o TColumn cuando la celda no sea par. Por lo que utilizar else para explícitamente asignarle el color predeterminado es redundante desde mi punto de vista.

Saludos,
Chris

lmpadron 26-08-2011 19:12:16

he unido los dos codigos, jejeje y al hacerlo me di cuenta de que la negación debe ir dentro del parentesis (me dio error cuando lo corri !!!) :D:D:D

Cita:

Empezado por Chris (Mensaje 410207)
Gracias ecfisa por la traducción! :)
Solo que se te ha escapado la negación en la segunda condicional.
Código:

if(ADOQuery1->RecNo % 2)
  if (!State.Contains(gdSelected))
    DBGrid1->Canvas->Brush->Color =  0x00f7fbfd;
  DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);

Saludos,
Chris


ecfisa 26-08-2011 19:13:54

Hola Chris.

Probé con tu sugerencia y funciona perfectamente.;)
Cita:

asignarle el color predeterminado es redundante desde mi punto de vista
Tenés razón, si no deseas cambiar el color predeterminado, es redundante.

Saludos.

lmpadron 26-08-2011 20:05:24

Al final quedo de esta manera, espero que le sea de utilidad al proximo que presente la misma dificultad
Código:


if (ADOQuery1->RecNo % 2)
  {
    if (!State.Contains(gdSelected))
    {
      DBGrid1->Canvas->Font->Color = clBlack;  /* letra negra */
      DBGrid1->Canvas->Brush->Color =  StringToColor("0x00daf1fc"); /* fondo claro*/
    }
  }
  DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);

Los pares quedan de un crema claro y los impares de color blanco (como estan normalmente), si seleccionas uno que este de color crema, la seleccion se vera en azul (normalmente) o el color que sea que use el sistema.

Saludos y Gracias


La franja horaria es GMT +2. Ahora son las 11:43:48.

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