 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Dom 28 Ene, 2018 3:58 am Asunto: Escribir en una celda de StringGrid en vertical |
|
|
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 |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Sab 23 Jun, 2018 5:09 am Asunto: Encontre algo en foros delphi |
|
|
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 |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
|
| Volver arriba |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Vie 29 Jun, 2018 7:52 pm Asunto: |
|
|
Muchas gracias, con esto ya tengo claridad que hace lo que necesito y ahora me pondre a ver como lograrlo en C |
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
|
| Volver arriba |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Mie 04 Jul, 2018 3:16 am Asunto: esto es buena referencia |
|
|
muchas gracias estimado, ya casi logro lo requerido con mayor formato (mas atractivo).
una vez logrado lo compartiré. |
|
| Volver arriba |
|
 |
jotny Master


Registrado: 17 Feb 2004Mensajes: 226Ubicación: santiago
|
Publicado: Mie 22 Ago, 2018 3:15 am Asunto: ya pude solucionarlo |
|
|
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 |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Sab 25 Ago, 2018 5:07 pm Asunto: |
|
|
| Muy bien. Será útil. Gracias. Sugiero que el poste en el foro Tips & Tricks |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|