Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-08-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
¿Margen en celdas de TStringGrid?

Buenas amigos, sigo mejorando el juego de las tablas y ahora le he añadido un ranking y todo va correcto pero me gustaria crear un pequeño margen para que cuando alineo a la derecha los numeros no llegue justo al filo sino que quede un poquitin de espacio a la derecha.
Esto tengo hecho:
Código:
void __fastcall TFormRanking::StringGridRankingDrawCell(TObject *Sender,
      int ACol, int ARow, TRect &Rect, TGridDrawState State)
{
        char *cadena;
        cadena = StringGridRanking->Cells[ACol][ARow].c_str();

        if (State.Contains(gdFixed))
        {
                StringGridRanking->Canvas->Brush->Color = clBtnFace;
                StringGridRanking->Canvas->Font->Color = clWindowText;
                StringGridRanking->Canvas->FillRect(Rect);

                HDC dc = StringGridRanking->Canvas->Handle;
                DrawText(dc, cadena, strlen(cadena), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
        }
        else if(State.Contains(gdSelected)) //if is selected use the clAqua color
        {
                StringGridRanking->Canvas->Brush->Color = clWindow;
                StringGridRanking->Canvas->Font->Color = clWindowText;
                StringGridRanking->Canvas->FillRect(Rect);

                HDC dc = StringGridRanking->Canvas->Handle;
                if(ACol == 1)
                        DrawText(dc, cadena, strlen(cadena), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
                else
                        DrawText(dc, cadena, strlen(cadena), &Rect, DT_RIGHT | DT_VCENTER | DT_SINGLELINE );
        }
        else if (ARow %2 == 0)
        {
                StringGridRanking->Canvas->Brush->Color = clSilver;
                StringGridRanking->Canvas->Font->Color = clWindowText;
                StringGridRanking->Canvas->FillRect(Rect);

                HDC dc = StringGridRanking->Canvas->Handle;
                if(ACol == 1)
                        DrawText(dc, cadena, strlen(cadena), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
                else
                        DrawText(dc, cadena, strlen(cadena), &Rect, DT_RIGHT | DT_VCENTER | DT_SINGLELINE );
        }
        else
        {
                StringGridRanking->Canvas->Brush->Color = StringGridRanking->Color;
                StringGridRanking->Canvas->Font->Color = StringGridRanking->Font->Color;
                StringGridRanking->Canvas->FillRect(Rect);

                HDC dc = StringGridRanking->Canvas->Handle;
                if(ACol == 1)
                        DrawText(dc, cadena, strlen(cadena), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
                else
                        DrawText(dc, cadena, strlen(cadena), &Rect, DT_RIGHT | DT_VCENTER | DT_SINGLELINE );
        }
}
¿Como puedo hacer eso?
Responder Con Cita
  #2  
Antiguo 05-08-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Al final lo he solucionado concatenando un espacio tras cada cadena que quiero alinear a la derecha. De todos modos si hay algun modo mejor pues me quedo a la espera de sus sugerencias.
Responder Con Cita
  #3  
Antiguo 05-08-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

A mi tampoco se me ocurre otro medio mas sencillo que agregar un espacio al final. Pero si me permites, yo restructuraría el código de este modo:
Código:
void __fastcall TFormRanking::StringGridRankingDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
  TStringGrid *SG = static_cast<TStringGrid*>((TStringGrid*)(Sender));
  String cad = SG->Cells[ACol][ARow];
  HDC dc = StringGrid1->Canvas->Handle;
  register int Flags = (ACol == 1 ? DT_CENTER | DT_VCENTER | DT_SINGLELINE :
                        DT_RIGHT | DT_VCENTER | DT_SINGLELINE);

  cad += (ACol > 1 ? " " : "");
  if (State.Contains(gdFixed)) {
    SG->Canvas->Brush->Color = clBtnFace;
    SG->Canvas->Font->Color = clWindowText;
    SG->Canvas->FillRect(Rect);
    DrawText(dc, cad.c_str(), cad.Length(), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  }
  else if(State.Contains(gdSelected)) {
    SG->Canvas->Brush->Color = clAqua;
    SG->Canvas->Font->Color = clWindowText;
    SG->Canvas->FillRect(Rect);
    DrawText(dc, cad.c_str(), cad.Length(), &Rect, Flags);
  }
  else {
    if (ARow % 2 == 0){
      SG->Canvas->Brush->Color = clSilver;
      SG->Canvas->Font->Color = clWindowText;
    }
    else {
      SG->Canvas->Brush->Color = SG->Color;
      SG->Canvas->Font->Color = SG->Font->Color;
    }
    SG->Canvas->FillRect(Rect);
    DrawText(dc, cad.c_str(), cad.Length(), &Rect, Flags);
  }
}
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 05-08-2014 a las 22:10:34.
Responder Con Cita
  #4  
Antiguo 06-08-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
¿podrias explicarme que haces aqui?
Código:
register int Flags = (ACol == 1 ? DT_CENTER | DT_VCENTER | DT_SINGLELINE :
                      DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
cad += (ACol > 1 ? " " : "");
Creo recordar que eso es igual que un if...else pero me pierdo con eso ¿podrias explicarme para entenderlo? ¿y que es register? Es que como pones "register int" pues no me suena ese tipo.
Responder Con Cita
  #5  
Antiguo 06-08-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

El símbolo ? es el operador ternario de C y C++, y funciona de este modo:
Cita:
una_condición ? verdadero : falso
Ejemplos:
Código:
#include <iostream>

using namespace std;

#define MAX(a, b) ((a) > (b) ? (a) : (b))

char *MinMayEqu(const int a, const int b)
{
  return (a < b) ? "menor" : ((a > b) ? "mayor" : "igual");
}

int main()
{
  int a = 8, b = 7;
  cout << MAX(a,b) << endl;
  cout << a << " es " << MinMayEqu(a,b) << " a " << b;
  cin.get();
  return 0;
}
En tanto que la palabra reservada register, es un especificador del tipo de almacenamiento que debería usarse.
Le indica al compilador que, de ser posible, en lugar del stack utilice los registros del procesador para guardar los valores generando así un código mas rápido. (Solo se aplica a variables automáticas y parámetros)

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 06-08-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Lo he probado y he tenido que modificarlo un poco ya que mi codigo tambien fue modificado un poco para hacer lo que yo queria realmente. Asi ha quedado pero tiene un problemilla:

Código:
void __fastcall TFormRanking::StringGridRankingDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
  TStringGrid *SG = static_cast<TStringGrid*>((TStringGrid*)(Sender));
  String cad = SG->Cells[ACol][ARow];
  HDC dc = StringGridRanking->Canvas->Handle;
  register int Flags = (ACol == 1 || State.Contains(gdFixed) ? DT_CENTER | DT_VCENTER | DT_SINGLELINE :
                        DT_RIGHT | DT_VCENTER | DT_SINGLELINE);

  cad += (ACol != 1 && ARow > 0 ? " " : "");
  if (State.Contains(gdFixed)) {
    SG->Canvas->Brush->Color = clBtnFace;
    SG->Canvas->Font->Color = clWindowText;
    SG->Canvas->FillRect(Rect);
    DrawText(dc, cad.c_str(), cad.Length(), &Rect, Flags);
  }
  else if(State.Contains(gdSelected)) {
    SG->Canvas->Brush->Color = clWindow;
    SG->Canvas->Font->Color = clWindowText;
    SG->Canvas->FillRect(Rect);
    HDC dc = StringGridRanking->Canvas->Handle; //No se porque pero si no pongo esta linea no aparece el texto de la celda seleccionada
    DrawText(dc, cad.c_str(), cad.Length(), &Rect, Flags );
  }
  else {
    if (ARow % 2 == 0){
      SG->Canvas->Brush->Color = clSilver;
      SG->Canvas->Font->Color = clWindowText;
    }
    else {
      SG->Canvas->Brush->Color = SG->Color;
      SG->Canvas->Font->Color = SG->Font->Color;
    }
    SG->Canvas->FillRect(Rect);
    DrawText(dc, cad.c_str(), cad.Length(), &Rect, Flags );
  }
}
Ahi tienes el comentario de que tengo que hacer para que funcione y es algo raro ya que eso mismo se hace al principio pero no se porque tengo que volverlo a hacer.
Responder Con Cita
  #7  
Antiguo 06-08-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

Acabo de probar el codigo que publicaste y me funciona bién, lo que si veo es que me quedó un detalle de la prueba, cambiar la siguiente línea,
Código:
 HDC dc = StringGrid1->Canvas->Handle;
pero eso hace más reusable la rutina, no es solución al comportamiento que mencionas. No sé que puede estar pasando aunque supongo que se debe a una cuestión de superposición de colores ...

Te pongo el código completo de mi prueba (que funciona correctamente) para que puedas controlar
con el tuyo.
Código:
/* darle algunos valores a la grilla */
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  StringGrid1->Options << TGridOption(goEditing);
  for (register int c = 0; c < StringGrid1->ColCount; c++)
    for (register int r = 0; r < StringGrid1->RowCount; r++)
      StringGrid1->Cells[c][r] = IntToStr(c+r);
}

/* organizar la presentación */
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
  TStringGrid *SG = static_cast<TStringGrid*>((TStringGrid*)(Sender));
  String cad = SG->Cells[ACol][ARow];
  HDC dc = SG->Canvas->Handle;    // <<<< --- Cambio 
  register int Flags = (ACol == 1 ? DT_CENTER | DT_VCENTER | DT_SINGLELINE :
                        DT_RIGHT | DT_VCENTER | DT_SINGLELINE);

  cad += (ACol > 1 ? " " : "");
  if (State.Contains(gdFixed)) {
    SG->Canvas->Brush->Color = clBtnFace;
    SG->Canvas->Font->Color = clWindowText;
    SG->Canvas->FillRect(Rect);
    DrawText(dc, cad.c_str(), cad.Length(), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  }
  else if(State.Contains(gdSelected)) {
    SG->Canvas->Brush->Color = clAqua;
    SG->Canvas->Font->Color = clWindowText;
    SG->Canvas->FillRect(Rect);
    DrawText(dc, cad.c_str(), cad.Length(), &Rect, Flags);
  }
  else {
    if (ARow % 2 == 0){
      SG->Canvas->Brush->Color = clSilver;
      SG->Canvas->Font->Color = clWindowText;
    }
    else {
      SG->Canvas->Brush->Color = SG->Color;
      SG->Canvas->Font->Color = SG->Font->Color;
    }
    SG->Canvas->FillRect(Rect);
    DrawText(dc, cad.c_str(), cad.Length(), &Rect, Flags);
  }
}
Si tenes alguna dificultad, no dudes en avisame y te adjunto los fuentes.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cambiar color por defecto al seleccionar varias celdas de un TStringGrid JAI_ME Varios 1 05-08-2012 18:58:19
Centrar celdas en un TSTringGrid gluglu Varios 3 23-01-2005 13:41:44
colorear las celdas de un TstringGrid mangel OOP 2 16-12-2003 17:22:47
Celdas de colores diferentes en un TStringGrid phyera Gráficos 2 14-09-2003 19:06:26
Justificar Texto en las celdas del TStringGrid Anabel Varios 3 19-05-2003 18:20:47


La franja horaria es GMT +2. Ahora son las 00:05:12.


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
Copyright 1996-2007 Club Delphi