Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 28-01-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 28-01-2020 a las 18:07:48.
Responder Con Cita
  #22  
Antiguo 28-01-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 214
Poder: 14
compuin Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
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;
Responder Con Cita
  #23  
Antiguo 28-01-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #24  
Antiguo 28-01-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 214
Poder: 14
compuin Va por buen camino
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
Responder Con Cita
  #25  
Antiguo 28-01-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.096
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por compuin Ver Mensaje
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
Responder Con Cita
  #26  
Antiguo 28-01-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.096
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #27  
Antiguo 28-01-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 214
Poder: 14
compuin Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
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
Responder Con Cita
  #28  
Antiguo 28-01-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 214
Poder: 14
compuin Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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 )
Responder Con Cita
  #29  
Antiguo 28-01-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.096
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pon aquí tu código.
Responder Con Cita
  #30  
Antiguo 28-01-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 214
Poder: 14
compuin Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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;
Responder Con Cita
  #31  
Antiguo 28-01-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 214
Poder: 14
compuin Va por buen camino
Olvide agregar

Código Delphi [-]
ascmc  : array[0..9] of double;
                          xx     : Array[0..5] of double;
Responder Con Cita
  #32  
Antiguo 28-01-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.096
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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".
Responder Con Cita
  #33  
Antiguo 28-01-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #34  
Antiguo 28-01-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
Respuesta



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
Foco en primera fila cxgrid dardusso23 Varios 1 17-10-2016 18:15:52
Obtener la primera fila por grupos de una consulta anidada gluglu SQL 5 11-04-2012 12:36:20
agregar una linea en la primera fila de un memo ingabraham Varios 1 08-07-2010 16:45:56
Primera columna y fila de un StringGrid gironella OOP 3 01-10-2008 09:42:30
Primera fila visible de un grid RONPABLO Conexión con bases de datos 9 08-11-2004 07:15:44


La franja horaria es GMT +2. Ahora son las 21:25:49.


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
Copyright 1996-2007 Club Delphi