Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Agregar texto en primera fila de TStringrid (https://www.clubdelphi.com/foros/showthread.php?t=94405)

compuin 26-01-2020 19:02:39

Agregar texto en primera fila de TStringrid
 
Hola amigos,

Como puedo agregar texto a cada celda de la primera linea de un TStringgrid ?

Uso Delphi 7

Gracias de antemano

compuin 26-01-2020 19:46:35

Cita:

Empezado por compuin (Mensaje 535364)
Hola amigos,

Como puedo agregar texto a cada celda de la primera linea de un TStringgrid ?

Uso Delphi 7

Gracias de antemano

Ya logre hacerlo,

Código Delphi [-]
StringGrid1.Cells[1,0] := 'Longitud';

ahora me gustaria centrarlos dentro del campo o ajustarlo a la derecha

Alguna sugerencia ?

escafandra 26-01-2020 21:27:42

Para eso tienes que pintar tú mismo las celdas. Te pongo un ejemplo:


Código Delphi [-]
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with Sender as TStringGrid do
  begin
    // Dibujar texto centrado horizontal y verticalmente o a la derecha
    InflateRect(Rect, -1, -1);
    Canvas.FillRect(Rect);
    InflateRect(Rect, -3, -3);
    DrawText(Canvas.Handle, PAnsiChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), Rect,
      DT_CENTER or DT_VCENTER or DT_SINGLELINE);   // Texto centrado en la celda
//      DT_RIGHT or DT_VCENTER or DT_SINGLELINE);   // Texto alineado a la derecha en la celda
  end;
end;




Saludos.

compuin 26-01-2020 21:30:13

Cita:

Empezado por escafandra (Mensaje 535367)
Para eso tienes que pintar tú mismo las celdas. Te pongo un ejemplo:


Código Delphi [-]
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with Sender as TStringGrid do
  begin
    // Dibujar texto centrado horizontal y verticalmente o a la derecha
    InflateRect(Rect, -1, -1);
    Canvas.FillRect(Rect);
    InflateRect(Rect, -3, -3);
    DrawText(Canvas.Handle, PAnsiChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), Rect,
      DT_CENTER or DT_VCENTER or DT_SINGLELINE);   // Texto centrado en la celda
//      DT_RIGHT or DT_VCENTER or DT_SINGLELINE);   // Texto alineado a la derecha en la celda
  end;
end;




Saludos.


Me sale el error Expected '='('found. en una pequena ventana

escafandra 26-01-2020 21:37:31

Revisa lo que has escrito. En algún sitio metiste la gamba.















Saludos.

compuin 26-01-2020 21:41:47

Aqui la declare

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);

private
{ Private declarations }

Casimiro Notevi 26-01-2020 21:47:01

No olvides las etiquetas para código, gracias:



escafandra 26-01-2020 22:13:23

Cita:

Empezado por compuin (Mensaje 535370)
Aqui la declare

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);

private
{ Private declarations }

En el IDE debes ir a Eventos del TSringGrid y buscar OnDrawCell Haces dobleclick y se abrirá en el editor de código con la función preparada para escribir. Allí pega el código que puse. Si lo haces "a mano" No debes poner Form1.

Código Delphi [-]
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


Pero luego tienes que is al editor de eventos igualmente para que quede asignado dicho evento.




Saludos.

compuin 26-01-2020 22:19:51

Ya lo intente

Coloco el procedure y se ejecuta el formulario pero no hace el arreglo en el grid

escafandra 26-01-2020 22:24:51

Cita:

Empezado por compuin (Mensaje 535373)
Ya lo intente

Coloco el procedure y se ejecuta el formulario pero no hace el arreglo en el grid

No has asignado el evento


Saludos.

compuin 26-01-2020 22:26:36

Cuando trato de asignarlo me da error apuntando al nombre de la procedure

Sera que no lo estoy haciendo bien ??

escafandra 26-01-2020 22:28:57

Borra todo y deja que delphi lo haga. Cuando se muestre el editor de código, escribes el código que te puse.


Saludos.

compuin 26-01-2020 22:38:42

El evento OnDrawCell queda vacio luego que borro el codigo y ejecuto

Es normal ?

escafandra 26-01-2020 22:44:26

Cuando un evento que ha asignado delphi no tiene código, directamente se borra por completo al ejecutar o guardar. Si el evento tiene código, delphi no borra nada.




Saludos.

escafandra 26-01-2020 22:47:04

Esto es lo que te debe aparecer en el editor de eventos:








Saludos.

compuin 26-01-2020 22:49:42

Ahora si, era eso

Mil gracias mi estimado

compuin 26-01-2020 22:53:49

Aunque el ejemplo lo hace con todas las celdas

Yo necesito que las celdas de escabezado queden centradas y el resto alineadas a la derecha

Como logro ajustarlo

Adicional, el color azul de la celda activa me gustaria quitarlo tambien

Te muestro como esta


escafandra 26-01-2020 23:41:42

Cita:

Empezado por compuin (Mensaje 535382)
Aunque el ejemplo lo hace con todas las celdas

Yo necesito que las celdas de escabezado queden centradas y el resto alineadas a la derecha

Código Delphi [-]
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Alin: integer;
begin
  with Sender as TStringGrid do
  begin
    if ARow = 0 then
       Alin:= DT_CENTER
    else
       Alin:= DT_RIGHT;

    // Dibujar texto centrado horizontal y verticalmente o a la derecha
    InflateRect(Rect, -1, -1);
    Canvas.FillRect(Rect);
    InflateRect(Rect, -3, -3);
    DrawText(Canvas.Handle, PAnsiChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), Rect,
      Alin or DT_VCENTER or DT_SINGLELINE);
  end;
end;


Cita:

Empezado por compuin (Mensaje 535382)
Adicional, el color azul de la celda activa me gustaria quitarlo tambien

Código Delphi [-]
DefaultDrawing:= false;


Saludos.

compuin 26-01-2020 23:48:24

Muchisimas gracias

:)

compuin 28-01-2020 01:38:03

Amigos,

Tengo el stringgrid funcionando correctamente pero ahora necesito agregar un tipo de font diferente entre textos sin que me cambie el font a todo el grid. Necesito algo asi como esta imagen

[IMG][/IMG]

Agradezco sus aportes

escafandra 28-01-2020 18:00:55

Te muestro como usar dos fuentes en un texto alineado a la derecha:


Código Delphi [-]
procedure PrintText(Canvas: TCanvas; Text: String; Rect: TRect);
var
  OldAlign: cardinal;
  FName: String;
begin
  InflateRect(Rect, -1, -1);
  Canvas.FillRect(Rect);
  OldAlign:= SetTextAlign(Canvas.Handle, TA_UPDATECP or TA_RIGHT);
  MoveToEx(Canvas.Handle, Rect.Right, Rect.Top, nil);
  FName:= Canvas.Font.Name;
  Canvas.Brush.Style:= bsClear;
  TextOut(Canvas.Handle, 0, 0, PCHAR(Copy(Text, 2, Length(Text)-1)), Length(Text)-1);
  Canvas.Font.Name:= 'Symbol';
  TextOut(Canvas.Handle, 0, 0, PCHAR(Copy(Text, 1, 1)), 1);
  SetTextAlign(Canvas.Handle, OldAlign);
  Canvas.Font.Name:= FName;
end;



En este caso usa una fuente "Symbol" para el primer carácter del texto y la predeterminada para el resto.


Saludos.

compuin 28-01-2020 19:22:15

Cita:

Empezado por escafandra (Mensaje 535409)
Te muestro como usar dos fuentes en un texto alineado a la derecha:


Código Delphi [-]
procedure PrintText(Canvas: TCanvas; Text: String; Rect: TRect);
var
  OldAlign: cardinal;
  FName: String;
begin
  InflateRect(Rect, -1, -1);
  Canvas.FillRect(Rect);
  OldAlign:= SetTextAlign(Canvas.Handle, TA_UPDATECP or TA_RIGHT);
  MoveToEx(Canvas.Handle, Rect.Right, Rect.Top, nil);
  FName:= Canvas.Font.Name;
  Canvas.Brush.Style:= bsClear;
  TextOut(Canvas.Handle, 0, 0, PCHAR(Copy(Text, 2, Length(Text)-1)), Length(Text)-1);
  Canvas.Font.Name:= 'Symbol';
  TextOut(Canvas.Handle, 0, 0, PCHAR(Copy(Text, 1, 1)), 1);
  SetTextAlign(Canvas.Handle, OldAlign);
  Canvas.Font.Name:= FName;
end;



En este caso usa una fuente "Symbol" para el primer carácter del texto y la predeterminada para el resto.


Saludos.

Estoy intentando asi, pero no me logra posicionar en la segunda columna que es donde lo necesito

Código Delphi [-]
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Alin: integer;
  FName: String;
  OldAlign: cardinal;
begin
  with Sender as TStringGrid do
  begin
    if ARow = 0 then
       Alin:= DT_CENTER
    else
       Alin:= DT_RIGHT;

    if ACol = 0 then
       Alin:= DT_LEFT;

     if ARow = 0 then
       Alin:= DT_CENTER;

    // Dibujar texto centrado horizontal y verticalmente o a la derecha
    InflateRect(Rect, -1, -1);
    Canvas.FillRect(Rect);
    FName:= Canvas.Font.Name;
    InflateRect(Rect, -3, -3);
    FName:= Canvas.Font.Name;
    Canvas.Brush.Style:= bsClear;
    //TextOut(Canvas.Handle, 0, 0, PCHAR(Copy(Text, 2, Length(Text)-1)), Length(Text)-1);
    Canvas.Font.Name:= 'Symbol';
    //TextOut(Canvas.Handle, 0, 0, PCHAR(Copy(Text, 1, 1)), 1);
    SetTextAlign(Canvas.Handle, OldAlign);
    Canvas.Font.Name:= FName ;
    DrawText(Canvas.Handle, PAnsiChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), Rect,
      Alin or DT_VCENTER or DT_SINGLELINE);
  end;

escafandra 28-01-2020 20:10:40

Aclarando ideas con todo el cariño

1- Preguntas por usar fuentes distintas en un texto y en tu imagen aparecen fuentes especiales en el 4° carácter de una cadena de texto. Sin embargo ahora hablas de columnas. Hablando de un TStringGreed, está muy claro lo que es una columna. ¿Puedes especificar bien claro lo que pretendes?
2- El código que muestras no tiene nada que ver con el que puse y su funcionalidad tampoco.
3- Escribir código es un ejercicio de rigurosidad y se ha de tener claro el objetivo y los medios. Las API que he usado tienen una funcionalidad muy concreta.
4- No esperes que mezclando código sin entenderlo con precisión, suene la flauta.
5- Para poder ayudarte nos hace falta precisión en tus planteamientos para poder entender tu objetivo, las dudas y errores.

Saludos.

compuin 28-01-2020 20:18:21

Resta de valores en grados, minutos, segundos
 
Hola amigos

Tengo los siguientes valores almacenados en unas variables, como sigue:

DM, t , w : string;

t:= 273 32' 37

w:= 314 56, 28"


cuando realizo la operacion aritmerica

DM := t - w;

Me arroja este error

[Warning] Unit1.pas(192): Unsafe code 'String index to var param'
[Warning] Unit1.pas(197): Unsafe code 'String index to var param'
[Error] Unit1.pas(532): Operator not applicable to this operand type
[Warning] Unit1.pas(683): Unsafe type 'PAnsiChar'
[Warning] Unit1.pas(707): Unsafe type 'PAnsiChar'
[Fatal Error] AstroRadix.dpr(6): Could not compile used unit 'Unit1.pas'


No he logrado ver el error, algun comentarios de parte de algun programador senior ?

Gracias de antemano

Casimiro Notevi 28-01-2020 20:23:01

Cita:

Empezado por compuin (Mensaje 535421)
algun comentarios de parte de algun programador senior ?

Yo soy un novato, pero el problema es que no puedes hacer cálculos con variables "string".

Y te recuerdo nuevamente nuestra guía de estilo ;)

Casimiro Notevi 28-01-2020 20:27:59

Combino ambos temas porque a fin de cuentas es lo mismo.

Por favor, compuin, párate un momento a pensar lo que realmente necesitas y luego con las ideas claras, continua.
Porque de esta manera te estás haciendo un lio tremendo y no vas a solucionar nada. ^\||/

compuin 28-01-2020 20:28:54

Cita:

Empezado por escafandra (Mensaje 535420)
Aclarando ideas con todo el cariño

1- Preguntas por usar fuentes distintas en un texto y en tu imagen aparecen fuentes especiales en el 4° carácter de una cadena de texto. Sin embargo ahora hablas de columnas. Hablando de un TStringGreed, está muy claro lo que es una columna. ¿Puedes especificar bien claro lo que pretendes?
2- El código que muestras no tiene nada que ver con el que puse y su funcionalidad tampoco.
3- Escribir código es un ejercicio de rigurosidad y se ha de tener claro el objetivo y los medios. Las API que he usado tienen una funcionalidad muy concreta.
4- No esperes que mezclando código sin entenderlo con precisión, suene la flauta.
5- Para poder ayudarte nos hace falta precisión en tus planteamientos para poder entender tu objetivo, las dudas y errores.

Saludos.

Hola,

Me disculpo por no haber sido claro en mi planteamiento. Aqui voy de nuevo

Tengo el stringgrid funcionando como me lo recomendastes pero necesito colocar en las celdas del stringgrid caracteres especiales

1.- Asi es como esta actualmente

[IMG][/IMG]


2.- asi deberia quedar reemplazando lo que esta en amarillo por el caracter especial, en este caso la fuente astrologica

[IMG][/IMG]

Eso es lo que requiero en principio, el codigo del stringgrid que uso actualmente es el siguiente

Código Delphi [-]
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Alin: integer;
begin
  with Sender as TStringGrid do
  begin
    if ARow = 0 then
       Alin:= DT_CENTER
    else
       Alin:= DT_RIGHT;

    if ACol = 0 then
       Alin:= DT_LEFT;

     if ARow = 0 then
       Alin:= DT_CENTER;

    // Dibujar texto centrado horizontal y verticalmente o a la derecha
    InflateRect(Rect, -1, -1);
    Canvas.FillRect(Rect);
    InflateRect(Rect, -3, -3);
    DrawText(Canvas.Handle, PAnsiChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), Rect,
      Alin or DT_VCENTER or DT_SINGLELINE);
  end;
end;

especificamente en cada celda de la columna 2 deberian ir esos simbolos

Espero haberme hecho entender mejor y nuevamente me disculpo por mi falta de claridad y conocimientos

compuin 28-01-2020 20:30:56

Cita:

Empezado por Casimiro Notevi (Mensaje 535423)
Yo soy un novato, pero el problema es que no puedes hacer cálculos con variables "string".

Y te recuerdo nuevamente nuestra guía de estilo ;)

Me disculpo por lo de la guia de estilos.

En la adicion parece funciona pero en las demas operaciones no (resta, division, multiplicacion )

Casimiro Notevi 28-01-2020 20:37:16

Pon aquí tu código.

compuin 28-01-2020 20:40:31

Cita:

Empezado por Casimiro Notevi (Mensaje 535427)
Pon aquí tu código.

Código Delphi [-]
DA, t, w : string;

          { Coordenadas Ecuatoriales }
            t:= AngleToStr(xx[0]);  //Ascension Recta
          
          { ARMC }
            ARMC := ascmc[2] ;
            w := AngleToStr(ARMC);

           DM := t - w;

           StringGrid1.Cells[4,i+1] := ' ' +DM;

compuin 28-01-2020 20:43:19

Olvide agregar

Código Delphi [-]
ascmc  : array[0..9] of double;
                          xx     : Array[0..5] of double;

Casimiro Notevi 28-01-2020 21:00:39

Mejor borras todo y empiezas de nuevo con los consejos que te han dado.

Tienes que ir paso a paso, y no avanzar al siguiente hasta tener perfecto el paso actual.
Primero de todo la función de cálculo de grados.
Cuando tenga eso totalmente perfecto, entonces empiezas a pasar los datos a grid.
Cuando tengas perfecto los datos en el grid, entonces empiezas a "dejarlo bonito".

escafandra 28-01-2020 23:27:23

En lo referente al tema del cambio de fuente, dejo este código orientativo en el que la fuente se cambia para la primera columna del grid desde la fila 1. Solo se cambia para los dos caracteres que aparezcan después del primer espacio aparecido en la celda:


Código Delphi [-]
procedure PrintText(Canvas: TCanvas; Text: String; Rect: TRect);
var
  OldAlign: cardinal;
  FName: String;
  n: integer;
begin
  InflateRect(Rect, -1, -1);
  Canvas.FillRect(Rect);
  OldAlign:= SetTextAlign(Canvas.Handle, TA_UPDATECP or TA_RIGHT);
  MoveToEx(Canvas.Handle, Rect.Right, Rect.Top, nil);
  FName:= Canvas.Font.Name;
  Canvas.Brush.Style:= bsClear;
  n:= Pos(' ', Text)+1;
  TextOut(Canvas.Handle, 0, 0, PCHAR(Copy(Text, n+2, Length(Text)-n-2)), Length(Text)-n-2);
  Canvas.Font.Name:= 'Ravie';
  TextOut(Canvas.Handle, 0, 0, PCHAR(Copy(Text, n, 2)), 2);
  Canvas.Font.Name:= FName;
  TextOut(Canvas.Handle, 0, 0, PCHAR(Copy(Text, 0, n-1)), n-1);
  SetTextAlign(Canvas.Handle, OldAlign);
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Alin: integer;
begin
  with Sender as TStringGrid do
  begin
    if ARow = 0 then
       Alin:= DT_CENTER
    else
       Alin:= DT_RIGHT;

    InflateRect(Rect, -1, -1);
    Canvas.FillRect(Rect);
    InflateRect(Rect, -3, -3);
    if (ACol = 1) and (ARow <> 0) then
      PrintText(Canvas, Cells[ACol, ARow], Rect)
    else
      DrawText(Canvas.Handle, PAnsiChar(Cells[ACol, ARow]), Length(Cells[ACol, ARow]), Rect,
        Alin or DT_VCENTER or DT_SINGLELINE);
  end;
end;


Saludos.

escafandra 28-01-2020 23:37:58

Para las operaciones con ángulos dados en cadenas en formato grados, minutos, segundos, lo que habría que hacer es la conversión de la cadena a grados en formato centesimal. Operar y convertir de nuevo a formato cadena.


La conversión a cadena está resuelta. dejo el código para el paso de la cadena a grados centesimales:


Código Delphi [-]
// Extrae la subcadena i de la cadena Str
// i=1  grados
// i=2 minutos
// i=3 segundos

function StrDigit(Str: String; i: integer): String;
var
  n, m: integer;
begin
  n:= 1; m:= 1;
  while i>0 do
  begin
    n:= m;
    while not (Str[m] in ['0'..'9', '.', ',']) do inc(m);
    while (Str[m] in ['0'..'9', '.', ',']) do inc(m);
    dec(i);
  end;
  while not (Str[n] in ['0'..'9', '.', ',']) do inc(n);
  Result:= Copy(Str, n, m-n);
end;

function StrToAngle(Str: String): Extended;
var
  d, m: integer;
  s: Extended;
begin
  d:= StrToIntDef(StrDigit(Str, 1), 0);
  m:= StrToIntDef(StrDigit(Str, 2), 0);
  s:= StrToFloatDef(StrDigit(Str, 3), 0);
  Result:= d + m/60 + s/3600;
end;


Lo siguiente es operar y pasar a cadena en formato grados, minuto, segundos.
Otra cuestión es si queremos pasar los grados al primer cuadrante, si sirven valores negativos, etc...





Saludos.


La franja horaria es GMT +2. Ahora son las 19:48:58.

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