Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Escribir en una celda de StringGrid en vertical

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Escribir en una celda de StringGrid en vertical Responder citando

Estimados

He buscado por toda la ayuda de todas las formas que he podido pero no logro encontrar, si es que ya estuviera resuelto, el como poder escribir una celda en sentido vertical sobre todo cuando el contenido de los datos de una columna son cortos y poder poner el ColWith y ajustarlo al contenido sin depender del ancho del nombre de la columna.

alquien sabe donde puedo manipular el sentido del texto en la las columnas de la primera fila de un String Grid?
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Encontre algo en foros delphi Responder citando

Alguien sabe como traducir esto, segun he visto hace lo que necesito para escribir una celda en vertical.

Código:

procedure TForm1.StringGridRotateTextOut2(Grid:TStringGrid;ARow,ACol:Integer;Rect:TRect;
          Schriftart:String;Size:Integer;Color:TColor;Alignment:TAlignment);
var
    NewFont, OldFont : Integer;
    FontStyle, FontItalic, FontUnderline, FontStrikeout: Integer;
begin
   // if the font is to big, resize it
   // wenn Schrift zu groß dann anpassen
   If (Size > Grid.ColWidths[ACol] DIV 2) Then
       Size := Grid.ColWidths[ACol] DIV 2;
   with Grid.Canvas do
   begin
       // Set font
       // Font setzen
       If (fsBold IN Font.Style) Then
          FontStyle := FW_BOLD
       Else FontStyle := FW_NORMAL;
       If (fsItalic IN Font.Style) Then
          FontItalic := 1
       Else FontItalic := 0;
       If (fsUnderline IN Font.Style) Then
          FontUnderline := 1
       Else FontUnderline := 0;
       If (fsStrikeOut IN Font.Style) Then
          FontStrikeout:=1
       Else FontStrikeout:=0;
       Font.Color := Color;
       NewFont := CreateFont(Size, 0, 900, 0, FontStyle, FontItalic,
                             FontUnderline, FontStrikeout, DEFAULT_CHARSET,
                             OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                             DEFAULT_PITCH, PChar(Schriftart));
       OldFont := SelectObject(Handle, NewFont);
       // fill the rectangle
       // Rechteck füllen
       FillRect(Rect);
       // Write text depending on the alignment
       // Text nach Ausrichtung ausgeben
       If Alignment = taLeftJustify Then
          TextRect(Rect,Rect.Left+2,Rect.Bottom-2,Grid.Cells[ACol,ARow]);
       If Alignment = taCenter Then
          TextRect(Rect,Rect.Left+Grid.ColWidths[ACol] DIV 2 - Size + Size DIV 3,
            Rect.Bottom-2,Grid.Cells[ACol,ARow]);
       If Alignment = taRightJustify Then
          TextRect(Rect,Rect.Right-Size - Size DIV 2 - 2,Rect.Bottom-2,Grid.Cells[ACol,ARow]);
       // Recreate reference to the old font
       // Referenz auf alten Font wiederherstellen
       SelectObject(Handle, OldFont);
       // Recreate reference to the new font
       // Referenz auf neuen Font löschen
       DeleteObject(NewFont);
   end;
end;


y asi sería la llamada

Código:

    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      If ARow = 0 then
        StringGridRotateTextOut2(StringGrid1,ARow, ACol, Rect, 'ARIAL', 18, clBlack,taCenter);
      StringGrid1.Update;
    end;
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola, jotny, no sé si ese código haga lo que usted necesita. Ver un ejemplo en Delphi:

https://stackoverflow.com/questions/9148347/how-can-you-change-the-text-orientation-in-cells-in-the-fixed-rows-in-a-delphi-t

Buscar por lfOrientation
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Felip escribió:
Hola, jotny, no sé si ese código haga lo que usted necesita. Ver un ejemplo en Delphi:

https://stackoverflow.com/questions/9148347/how-can-you-change-the-text-orientation-in-cells-in-the-fixed-rows-in-a-delphi-t

Buscar por lfOrientation


Muchas gracias, con esto ya tengo claridad que hace lo que necesito y ahora me pondre a ver como lograrlo en C
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

he encontrado:

http://www.hardforum.ru/t72886/

..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: esto es buena referencia Responder citando

Felip escribió:
he encontrado:

http://www.hardforum.ru/t72886/

..


muchas gracias estimado, ya casi logro lo requerido con mayor formato (mas atractivo).

una vez logrado lo compartiré.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: ya pude solucionarlo Responder citando

Estimados todos, lo prometido es deuda. Logre dar con lo que requería en lo más importante.
adjunto el codigo que debe tener el OnDrawCell (la grilla no debe tener la propiedad multiseleccion y el DrawingStyle en gdsClassic (de otra forma se pinta distorsionado.
he usado algunos codigos usados por Leo_ en donde genera interlineados

Código:

   TStringGrid *grid = dynamic_cast<TStringGrid*>(Sender);
   TCanvas * canvas = grid->Canvas;
   TRect r,rtmp;
   TRect rect = Rect;
   grid->Canvas->Font = grid->Font;
   if(ARow==0 && ACol>=7){ // estas son las filas que no deben mostrarse en vertical
      Canvas->FillRect(Rect);
      SetFontAngle(Canvas->Font,90);
      canvas->Brush->Style = bsClear;
          rtmp=grid->CellRect(ACol,0);
          r.left=rtmp.left;
          r.top=rtmp.top;
          r.right=rtmp.right;
          r.bottom=rtmp.bottom;
          Canvas->TextRect(Rect,r.left,r.bottom-5,grid->Cells[ACol][0]);
          grid->ColWidths[ACol]=20;
          grid->RowHeights[0]=230;

   }else if(ARow>=0 && ACol<7){ // las que deben mostrarse en vertical

         if (State.Contains(gdSelected)){
               grid->Canvas->Brush->Color = static_cast<TColor>(0xF4E6DC);
               grid->Canvas->Pen->Color = static_cast<TColor>(0xD48A4C);
               grid->Canvas->Rectangle(Rect);
               grid->Canvas->Pen->Color = grid->Canvas->Brush->Color;

               // Comprobamos si hay una celda seleccionada a la _izquierda_
               // de esta y borramos la linea izquierda que hemos pintado antes
               if (grid->Selection.Left < ACol)
               {
                  grid->Canvas->MoveTo(Rect.Left, Rect.Top+1);
                  grid->Canvas->LineTo(Rect.Left, Rect.Bottom-1);
               }

               // Comprobamos si hay una celda seleccionada a la _derecha_
               // de esta y borramos la linea izquierda que hemos pintado antes
               if (grid->Selection.Right > ACol)
               {
                  grid->Canvas->MoveTo(Rect.Right-1, Rect.Top+1);
                  grid->Canvas->LineTo(Rect.Right-1, Rect.Bottom-1);
               }

         }else{
                  grid->Canvas->Brush->Color = ARow & 0x01 ? grid->Color : clGradientInactiveCaption;//99ddff
                  grid->Canvas->FillRect(rect);
                  grid->Canvas->Font->Color = grid->Font->Color;
         }

         grid->Canvas->Brush->Style = bsClear;
         SetTextColor(grid->Canvas->Handle,clBlack);
         DrawText(grid->Canvas->Handle, grid->Cells[ACol][ARow].w_str(),
         grid->Cells[ACol][ARow].Length(), &rect,
           DT_VCENTER | DT_END_ELLIPSIS | DT_WORDBREAK);

 // ajusto el ancho de la celda al contenido de ella
           int largo= grid->Canvas->TextWidth(grid->Cells[ACol][ARow]);
           if(grid->ColWidths[ACol]<largo)
                  grid->ColWidths[ACol] = largo+18;



   }



el resultado


https://drive.google.com/open?id=19lEhwJVgBwkcKWvu1HEExHlJmYGIKnsq


cualquier acotacion a esto será muy bienvenida
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muy bien. Será útil. Gracias. Sugiero que el poste en el foro Tips & Tricks
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.