Ver Mensaje Individual
  #4  
Antiguo 14-02-2014
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Reputación: 21
salvica Va por buen camino
Talking Solucionado

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

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;
Responder Con Cita