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)

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 13:18:31.

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