La Web del Programador: Comunidad de Programadores
 
    Pregunta:  47473 - GRAFICOS EN DELPHI
Autor:  Carlos Quesada
Gusto de saludarles hacen un excelente trabajo, me gustaria saber como puedo generar un grafico de lineas en delphi, tomando como base una lista ordenada con numeros entrados por el usuario
Muchas gracias

  Respuesta:  Erwin Perez
Primero, me gustaria saber como ha de introducir el usuario el conjunto de valores, porque de ello hay un poco de trabajo. Pasemos a la suposicion de que tienes los datos en un DataSet, ya sea en memoria o en una base de datos, supongamos que pusiste un indice para identificar el orden de los valores, ok, el primer paso seria obtener el maximo y el minimo, para eso ordenarias por valor tu DataSet, del menor al mayor, tomarias el valor del primer registro:
MyDataSet.First;
Minimo:=MyDataSet.FieldByName('Valor').AsVariant;
Luego el maximo:
MyDataSet.Last;
Maximo:=MyDataSet.FieldByName('Valor').AsVariant;
Luego Reordenamos (Esto es solo un ejemplo teorico y estoy suponiendo los nombres de los campos y de indices):
MyDataSet.IndexFieldNames:='Indice';
Ahora viene el dibujado:
Supon que vas a usar el canvas de un control, o de la impresora, lo pones en una variable, ej.: TheCanvas:=Panel1.Canvas;
Ahora obtienes los factores de escala (Para que el grafico ajuste el tamaƱo del area de dibujo)
iM:=abs(Maximo) - abs(Minimo) + 5; (Aqui le agrege 5 pixeles para que tenga margen)
iD:=TheCanvas.ClientHeight;

Ahora dibujamos los ejes (por simplicidad no escribo como colocar los valores de "x" y "y", eso me gustaria que lo dedujeras de lo que esta a continuacion o buscaras informacion acerca del metodo DrawText de la clase TCanvas)

with TheCanvas do begin
// Eje Y
MoveTo(2, 2);
LineTo(2, ClientRect.Bottom - 2);
// Eje X
LineTo(ClientRect.Right - 2, ClientRect.Bottom - 2);
end;

Ahora Dibujemos las lineas

with MyDataSet do begin
if MyDataSet.IsEmpty then Exit; // Terminar si no hay datos que mostrar
First;
TheCanvas.MoveTo(2, ClientRect.Bottom - 2);
for i:=1 to RecordCount do begin
with TheCanvas do begin
// Posicion Y (Asumo que son valores de punto flotante, no se como vayan a ser, pero esto espero te sea util)
Y:=TRUNC((FieldByName('Valor').AsFloat * iM)/iD);
// Posicion X
X:=(((ClientWidth - 5) / RecordCount) * i) + 2;
LineTo(X, Y);
end;
end;
end;

Esto no muestra un grafico con una vista maravillosa, pero es darte una idea de donde empezar, lo principal (el traducir numeros a dibujo) ahi esta, espero te sirva.