Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Modificar etiquetas en TChart (https://www.clubdelphi.com/foros/showthread.php?t=85198)

salvica 13-02-2014 00:00:29

Modificar etiquetas en TChart
 
Hola a tod@s.
No se si este hilo debe ir aquí o en "Gráficos" (por el componente).

Se trata de los siguiente: Tengo un TChart que lo relleno con 1440 valores minutales (24 horas).
En modo diseño me divide el Grid cada 100 elementos y los señala como 0, 100, 200, ... etc. y necesito que lo divida cada 60 elementos (una hora) y que además los etiquete con la hora correspondiente, comenzando por CERO (0, 1, 2, 3, ..., 23, 24)

He leido que tengo que poner a talText el LabelStyle de los ejes (en este caso BottomAxis y TopAxis, pero me hace una escabechina grisacea :mad:.
Código Delphi [-]
{ ajustar los ejes Y a la escala que utilice }
    Chart.LeftAxis.Maximum       := FIN_ESCALA;
    Chart.LeftAxis.Minimum       := INI_ESCALA;
    Chart.RightAxis.Maximum      := FIN_ESCALA;
    Chart.RightAxis.Minimum      := INI_ESCALA;
{ cambiar el estilo de las etiquetas de los ejes X }
    Chart.BottomAxis.LabelStyle  := talText;
    Chart.TopAxis.LabelStyle     := talText;
    Chart.Series[0].Marks.Visible:= False;
{ cambiar el grueso de la pluma }
    (Chart.SeriesList[0] as TLineSeries ).LinePen.Width := 3;
{ re-dibujar el TChart }
    Chart.Repaint;
{ rellenar el TChart con los valores minutales }
    for I:=Low(Array1Minuto) to High(Array1Minuto) do begin
      { calcular la hora y los minutos en cada posición }
        iHora    := I div 60;
        iMinuto  := I mod 60;
        Etiqueta := '';
        if( iMinuto=0 ) then Etiqueta := IntToCadena(iHora, 2);
      { escribir los valores y las etiquetas de la serie }
        Chart.Series[0].Add(ArrayPresion1Minuto[i], Etiqueta, clBlue);
    end;

¿Podeis decirme como se cambian las etiquetas de las escalas en los ejes?

Gracias adelantadas
Salvica

salvica 13-02-2014 10:55:02

2 Archivos Adjunto(s)
Como una imagen vale mas que mil palabras :D os adjunto lo que sale y lo que debería saliren el eje de las X.

Gracias

salvica 14-02-2014 18:11:13

Aclaración de la ayuda
 
2 Archivos Adjunto(s)
Es la primera vez que utilizo TChar y me parece que estaba enfocando mal el asunto, por lo que os pido disculpas por haceros perder el tiempo. Además se me olvido indicar que es para Delphi-7 y Windows XP.

Asi mismo indicar que previamente a esto, me he leido todas la consulta que contienen TChar en los foros de ClubDelphi

Estaba enfocando el problema como si un TChar fuese un TGridString, en el cual pudiese cambiar el título de las columnas a mi gusto y parece ser que no es el caso aunque debe ser fácil.

Bien, el problema es representar en un TChar una serie de valores para representar una gráfica.
- En los ejes izquierdo y derecho va la escala de valores (por ejemplo de 750 a 1200)
- En los ejes superior e inferior va la escala de tiempo (un día, de 00 horas a 24 horas)
- Lo datos que introduzco en la serie son minutales (de 0 a 1440 = un día completo), almacenados en un Array de tipo real.

Después de mirar las demos de delphi, he visto que la escala X se declara como DateTime, y entonces el DateTimeFormat=hh, declarando el Increment=OneHour (aquí no se si deberia poner OneMinute, aunque no noto la diferencia).

Sin embargo, aunque en diseño queda más o menos bien, el resultado no es el esperado. Os subo una imágenes para que veáis como aparece el EjeX (El ejeY lo cambio a medida)

¿Podéis decirme como se configura este objeto parea este caso específico?

Gracias por todo
salvica

salvica 14-02-2014 20:25:20

Solucionado
 
Después de cuatro días ¡¡¡ LO CONSEGUÍ !!! :eek::eek:

Para aquellos que tengan el mismo o parecido problema:

1º - Y muy importante: ELIMINAR CUALQUIER TCHAR PREVIO, para ir viendo como se desarrolla.
2º - Añadir una serie (en mi caso una de líneas, sin 3D)
3º - Seleccionar la serie. Seleccionar la pestaña General y marcar la opción DateTime en el eje que se desea, al mismo tiempo que se selecciona donde vamos a ver dicho eje.
4º - Seleccionamos Chart y pulsamos la pestaña Axis (ejes).
5º - Seleccionamos el primer eje que usará el DateTime, desmarcamos Automatic (para poner Maximo y Minimo por código), y cambiamos el valor de DesiredIncrement (yo lo he puesto a una hora)
6º - Pulsamos en pestaña Labels y ponemos el formato que queremos ver (en mi caso solo horas = 'hh')
7º - Si utilizamos otro eje, repetimos los pasos 5º y 6º

NOTA - Yo cambio las escalas en runtime, por lo que todos los ejes tienen desmarcado Automatic

Ahora nos creamos una función que inicializará el TChart
Código Delphi [-]
{
--------------------------------------------------------------------------
   Esta función rellena un TChar que simula una banda de BARÓGRAFO

Chart ----------------------------> el TChart utilizado
FECHA_DATOS -------------------> la fecha a la que se refiere el gráfico
INI_ESCALA, FIN_ESCALA ---------> inicio y fin de la escala
ArrayPresion1Minuto --------------> Array de valores de datos minutales
--------------------------------------------------------------------------
}
  procedure RellenarChartBarografo( Chart:TChart; FECHA_DATOS:TDateTime;
                                    INI_ESCALA, FIN_ESCALA:integer;
                                    ArrayPresion1Minuto:Array of real );
  var
    Serie       : TLineSeries;
    FECHA_INI   : TDateTime;
    FECHA_FIN   : TDateTime;
    Y, M, D     : word;
    H, N, S, MS : word;
    Etiqueta    : string;
    iHora       : integer;
    iMinuto     : integer;
    I           : integer;
  begin

    DecodeDate(FECHA_DATOS, Y, M, D);
    FECHA_INI := EncodeDate(Y, M, D);
    FECHA_FIN := FECHA_INI+1;
    with Chart do begin
       { limpiar y poner un título a la banda (me gusta en el pié) }
         Foot.Text.Clear;
         Foot.Text.Add( 'Banda del BARÓGRAFO correspondiente al '+
                         FechaToCadena(FECHA_DATOS, true) );
       { poner un título al eje izquierdo }
         if BAR_EN_HPA
            then LeftAxis.Title.Caption := 'Hectopascales'
            else LeftAxis.Title.Caption := 'Milímetros de Mercurio';
       { dar máximo y mínimo al eje inferior }
         BottomAxis.Maximum   := FECHA_FIN;
         BottomAxis.Minimum   := FECHA_INI;
       { dar máximo y mínimo al eje izquierdo }
         LeftAxis.Maximum     := FIN_ESCALA;
         LeftAxis.Minimum     := INI_ESCALA;
       { dar máximo y mínimo al eje derecho }
         RightAxis.Maximum    := FIN_ESCALA;
         RightAxis.Minimum    := INI_ESCALA;
       { dar máximo y mínimo al eje superior }
         TopAxis.Maximum      := FECHA_FIN;
         TopAxis.Minimum      := FECHA_INI;
       { calcular la serie de datos }
         Serie                := (SeriesList[0] as TLineSeries );
       { cambiar el ancho de la pluma }
         if Zoomed { ¿es un zoom? }
            then Serie.LinePen.Width := 3
            else Serie.LinePen.Width := 2;
       { cargar datos hasta 23:00 }
         for I:=Low(ArrayPresion1Minuto) to High(ArrayPresion1Minuto)-1 do begin
             iHora    := (I div 60);
             iMinuto  := I - (iHora*60);
             Serie.AddXY(FECHA_INI+EncodeTime(iHora, iMinuto, 0, 0), ArrayPresion1Minuto[i], '', clBlue);
         end;
       { cargar datos de 24:00 -> 00:00 de mañana }
         I   := High(ArrayPresion1Minuto);
         Serie.AddXY(FECHA_FIN+EncodeTime(0, 0, 0, 0), ArrayPresion1Minuto[i], '', clBlue);
    end; { del with Chart do begin }
  end;

Además tengo un evento Chart_OnClick para que forme de nuevo la gráfica entre unos valores MAXIMO y MINIMO calculados previamente
Código Delphi [-]

procedure TForm_Presion.Chart_BAROGRAFO_OnClick(Sender: TObject);
var
  INI_ESCALA, FIN_ESCALA : string;
begin
{ al pulsar sobre el TChart }
  TChart(Sender).Zoomed := not TChart(Sender).Zoomed;
  if TChart(Sender).Zoomed then begin
     INI_ESCALA  := IntToStr(Trunc(ESBFloatEdit_P_MINIMA.AsFloat)-1);
     FIN_ESCALA := IntToStr(Trunc(ESBFloatEdit_P_MAXIMA.AsFloat)+1);
  end else begin
     INI_ESCALA  := ESCALA_BAROGRAFO_INI;
     FIN_ESCALA := ESCALA_BAROGRAFO_FIN;
  end;
  RellenarChartBarografo( TChart(Sender), Form_Main.mxCalendar.Date,
                                 StrToInt(INI_ESCALA), StrToInt(FIN_ESCALA),
                                 ArrayPresion1M );
end;


La franja horaria es GMT +2. Ahora son las 18:26: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