PDA

Ver la Versión Completa : Pintar StringGrid


aams01
06-05-2011, 17:38:22
Hola con respecto al tema se que se cuenta con demasiada infomacion y temas, una de las diferencias o por lo cual abro otro tema es la siguiente
es en C++, a los demas les funciona y a mi no.
lo que quiero es pintar un renglon si y otro no (azul,blanco,azul,blanco,.......)
Tengo el siguiente codigo en el evento SGVentasDrawCell()

if (ARow!=0) {
if (ARow%2==0 ){
SGVentas->Canvas->Brush->Color = clBlue;
SGVentas->Canvas->Rectangle(Rect);
SGVentas->Canvas->Font->Style << fsBold;
SGVentas->Canvas->Font->Color = clWhite;
}
}

Lo que hace es pintar como antes mencione, pero el error en si es el texto
no se si el color de Brush se ponga por encima del renglon o si el texto simplemente no tiene color.
Por que en el renglon que se pinta Azul no se ve el texto (al entrar para editar si se encuentra).
Alguien que me pueda orientar

ecfisa
06-05-2011, 19:09:31
Hola.

Probá de este modo:


void __fastcall TForm1::gridDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid *StrGrd = dynamic_cast<TStringGrid*>(Sender);

if (ARow != 0 && ARow%2 != 0 ){
StrGrd->Canvas->Brush->Color = clBlue;
StrGrd->Canvas->Rectangle(Rect);
StrGrd->Canvas->Font->Style << fsBold;
StrGrd->Canvas->Font->Color = clWhite;
DrawText(StrGrd->Canvas->Handle, StrGrd->Cells[ACol][ARow].c_str(),
StrGrd->Cells[ACol][ARow].Length(), &Rect,
DT_SINGLELINE | DT_VCENTER);
}
}


Saludos.

escafandra
06-05-2011, 19:39:44
Exacto, la razón es que pintas un rectángulo sólido con lo que tienes que pintar también el texto.

La única pega que se puede poner al buen ejemplo de ecfisa es que el texto se pintarán las líneas desaclopadas. Quizás desplazando un poco a la derecha y abajo el texto...

TStringGrid *StrGrd = dynamic_cast<TStringGrid*>(Sender);
if (ARow!=0) {
if (ARow%2==0 ){
StrGrd->Canvas->Brush->Color = clBlue;
StrGrd->Canvas->Rectangle(Rect);
StrGrd->Canvas->Font->Style << fsBold;
StrGrd->Canvas->Font->Color = clWhite;
InflateRect(&Rect, -2, -2);
DrawText(StrGrd->Canvas->Handle, StrGrd->Cells[ACol][ARow].c_str(), StrGrd->Cells[ACol][ARow].Length(), &Rect, 0);
}
}

Saludos.

aams01
07-05-2011, 04:20:08
Gracias por su apoyo, el código era algo similar solo una modificacion ya que utilizo c++ 2010 y han de saber es mas caprichoso.
Utilize el codigo que puso escafandra ya que como menciono el codigo de ecfisa movia un poco el texto a la izquierda.
Modificacion:
DrawText(StrGrd->Canvas->Handle, StrGrd->Cells[ACol][ARow].c_str(),
StrGrd->Cells[ACol][ARow].Length(), &Rect, 0);
Por
DrawTextW(StrGrd->Canvas->Handle, StrGrd->Cells[ACol][ARow].c_str(),
StrGrd->Cells[ACol][ARow].Length(), &Rect, 0);
Bueno con este codigo que me brindaron me entro una duda para que sireve o se utiliza InflateRect(&Rect, -2, -2);
y que es &Rect

Otra cosa no se si an notado que los colores de builder son demasiado llamativos como puedo utilizar otros aparte de la funcion RGB() ya que esta me manda Warning
Gracias de antemano y por su apoyo

ecfisa
07-05-2011, 05:05:23
Hola.

InflateRect incrementa/decrementa el ancho y/o largo de un rectángulo: InflateRect Function (http://msdn.microsoft.com/en-us/library/dd144994%28v=vs.85%29.aspx)

Para definir colores personalizados desde el Object Inspector, doble click sobre la propiedad color y click sobre el botón "Definir colores personalizados".

Desde código en forma directa:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Color = 0x007C88ED;
}


Saludos.

aams01
07-05-2011, 06:24:27
Gracias nunca se me había ocurrido dar doble click.
aunque una diferencia en el modo de asignación el color sale con el sig. formato desde la propiedad color
$007C88ED ay que cambiar el signo de $ y poner 0x007C88ED
esto por si a alguien le interesa