Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
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 06-05-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Precisamente en ese hilo respondía a la misma pregunta que tu haces. El evento OnDrawCell expuesto se encarga de centrar los textos, sólo tienes que colocar ese código y rellenar las celdas con tus datos sin preocuparte de nada mas.

No termino de entender bien cual es tu duda.

Saludos.
Responder Con Cita
  #2  
Antiguo 06-05-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 16
mizzard Va por buen camino
pues que he probado con muchos codigos y no consigo nada. Con ese en concreto copiando y pegando tal cual me salta el siguiente error en la línea:

Código:
   char *Cadena = grid->Cells[ACol][ARow].c_str();
[BCC32 Error] MainForm.cpp(1013): E2034 Cannot convert 'wchar_t *' to 'char *'

Uso C++ Builder 2010 y en concreto el codigo compreto es:

Código:
  TStringGrid *grid = dynamic_cast<TStringGrid*>(Sender);
   HDC dc = grid->Canvas->Handle;
   char *Cadena = grid->Cells[ACol][ARow].c_str();


    StrGridTique->Canvas->Font = StrGridTique->Font;

    // Ponemos el título en negrita
    if (ACol>=0 && State.Contains(gdFixed)){
        StrGridTique->Canvas->Font->Style = TFontStyles()<< fsBold;
    }

    const AnsiString Conceptos[3]= {"Cantidad","Precio ud","Precio"};
    if(ARow==0 && ACol==0){
        StrGridTique->Canvas->TextOutA(Rect.Left, Rect.Top,"Producto");
        }
    else if(ARow==0){
        StrGridTique->Canvas->TextOutA(Rect.Left, Rect.Top, Conceptos[ACol-1] );
    }

   grid->Canvas->Brush->Style = bsClear;
   DrawText(dc, Cadena, strlen(Cadena), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );

Un saludo!
Responder Con Cita
  #3  
Antiguo 06-05-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El problema es que la versión 2010 usa Unicode.

Debes usar la versión unicode de la API DrawText: DrawTextW (el copmpilador lo hace automáticamente) y cambiar la línea
Código:
char *Cadena = grid->Cells[ACol][ARow].c_str();
a
Código:
wchar_t *Cadena = grid->Cells[ACol][ARow].c_str();
Saludos.
Responder Con Cita
  #4  
Antiguo 07-05-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 16
mizzard Va por buen camino
Hola, perdona x no contestar antes pero he estado muy liado, gracias por la respuesta.

Tras hacer ese cambio ahora me pasa lo siguiente:


Error 1:Cannot convert wchar_t *' to const char *
Error 2: Type mismatch in parameter '__s' (wanted 'const char *', got 'wchar_t *')

en la 2ª línea:

Código:
grid->Canvas->Brush->Style = bsClear;
   DrawText(dc, Cadena, strlen(Cadena), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );

Un saludo!
Responder Con Cita
  #5  
Antiguo 07-05-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Te explico:

Las APIs de Windows Que usan cadenas, tienen dos versiones, la terminada en A y la terminada en W. Para DrawText tenemos internamente DrawTextA y DrawTextW. Lo normal es que el compilador escoja ya apropiada según si usa Unicode (W) o no (A).

Usa la versión DrawTextW;
Código:
DrawTextW(dc, Cadena, wcslen(Cadena), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
o bien:

Código:
DrawTextW(grid->Canvas->Handle, grid->Cells[ACol][ARow].c_str(), grid->Cells[ACol][ARow].Length(), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

Saludos.
Responder Con Cita
  #6  
Antiguo 07-05-2011
mizzard mizzard is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 100
Poder: 16
mizzard Va por buen camino
Muchisimas gracias por la respuesta, pero... sigo teneniendo un problema ...

Resulta q el texto se centra bien, pero me sale dos veces, a la izquierda y centrado

Lo que me gustaría es que se viera todo centrado tanto en la fila 0 que es fija (y en negrita) como en todos los campos.

Yo lo que hago es a partir de una serie de botones, recojo unos campos y hago que se muestren en el string grid usando:
Código:
StrGridTique->Cells[0][posFila]=DBText->Caption;
y controlando posFila voy añadiendo registros y diferentes nombres en el Caption del DBText.

Y luego en el evento hago:

Código:
void __fastcall TfrmMain::StrGridTiqueDrawCell(TObject *Sender, int ACol, int ARow,
          TRect &Rect, TGridDrawState State)
{
   TStringGrid *grid = dynamic_cast<TStringGrid*>(Sender);
   HDC dc = grid->Canvas->Handle;
   wchar_t *Cadena = grid->Cells[ACol][ARow].c_str();

   grid->Canvas->Brush->Style = bsClear;
   DrawTextW(grid->Canvas->Handle, grid->Cells[ACol][ARow].c_str(), grid->Cells[ACol][ARow].Length(), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

   StrGridTique->Canvas->Font = StrGridTique->Font;

    // Ponemos el título en negrita
    if (ACol>=0 && State.Contains(gdFixed)){
        StrGridTique->Canvas->Font->Style = TFontStyles()<< fsBold;
    }

    // Preparamos la rejilla con el tique
    const AnsiString Conceptos[3]= {"Precio unitario","Cantidad","Precio"};
    if(ARow==0 && ACol==0){
        StrGridTique->Canvas->TextOutA(Rect.Left, Rect.Top,"Producto");
    }
    else if(ARow==0){
        StrGridTique->Canvas->TextOutA(Rect.Left, Rect.Top, Conceptos[ACol-1] );
    }
    else if (ARow>0){
        tposFila=ARow;
        bEditarCantidad=true;
    }
}

Uff perdona por mi insistencia, pero es que voy dando tumbos constantemente, veo que la solución está cerca pero no consigo llegar, jeje

Muchísimas gracias por adelantado.

Un saludo!
Responder Con Cita
  #7  
Antiguo 07-05-2011
Avatar de aams01
aams01 aams01 is offline
Miembro
 
Registrado: ago 2010
Posts: 44
Poder: 0
aams01 Va por buen camino
Hola soy re-novato espero comprension si es que me equivoco.
Por que no desde que se active la forma pones los titulos de la rejilla
en cuanto se active la forma.
Código:
void __fastcall TTfrmMain::FormActivate(TObject *Sender)
{
	StrGridTique->Cells[0][0]="Precio unitario";
	StrGridTique->Cells[1][0]="Cantidad";
	StrGridTique->Cells[2][0]="Precio";

}
Para poner en negritas y centrar con lo siguiente recorte tu codigo asi que le hace falta el ultimo if por lo demas yo creo si lo hace
Código:
void __fastcall TTfrmMain::StrGridTiqueDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
		  TGridDrawState State)
{

  StrGridTique->Canvas->Brush->Color = clBtnFace; // Color por default, 
//  cambialo al que gustes, Esto es para que no te empalme la informacion
  StrGridTique->Canvas->Rectangle(Rect);
  InflateRect(&Rect, -2, -2);
  if (ARow==0) {
	   StrGridTique->Canvas->Font->Style = TFontStyles()<< fsBold;
  }

  DrawTextW(StrGridTique->Canvas->Handle, StrGridTique->Cells[ACol][ARow].c_str(), StrGridTique->Cells[ACol][ARow].Length(), &Rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

  if (ARow>0){
        tposFila=ARow;
        bEditarCantidad=true;
    }
}
Todo este codigo fue tomado de escafandra en uno de los temas, ojala y no enoje por tomar su codigo


Buno yo tengo unas preguntas para que utilizas
Código:
StrGridTique->Canvas->Brush->Style = bsClear;
__________________
El Software es como el Sexo, si es de gratis es Mejor

Última edición por aams01 fecha: 07-05-2011 a las 22:59:09.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Centrar imagen que esta en las celdas de un StringGrid gulder Varios 4 11-12-2008 19:48:02
Centrar texto en un memo Tilk Varios 1 12-11-2008 01:19:13
Centrar el texto de un edit Sayuri Varios 2 19-03-2008 21:28:59
Centrar el texto de una columna en el componente DrawGrid Aprendiendo OOP 0 30-09-2004 00:55:00
Centrar bmp en celda de stringgrid mosorio OOP 2 31-03-2004 06:15:27


La franja horaria es GMT +2. Ahora son las 09:41:33.


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