Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Построение графика


Автор: kolugd 12.3.2005, 04:35
Как построить график:
по оси Y - данные, например, с приборов, подключенных к PC;
по оси X - текущее время.

Пробовал применить компоненты TChart и TDBChart,
но что-то не получается.

Автор: Poseidon 12.3.2005, 05:32
Что именно не получается? Приведи промер кода! А то сразу КАК! Нужно же и самому хоть что-то сделать. А если что-то не получается, то ити за помощью. А ты пришел за готовым примером! Так не пойдет. Тебе же в программисты никто не нанялся! Опиши, что сделал, что не получилось, приведи пример. И получишь помощь.

Автор: Satana 12.3.2005, 09:22
Блин тут я уже гдето писал как ну да ладно еще раз пример приведу:
Запускаешь дельфу, кидаешь на форму компонент Tchart щелкаешь два раза и добавляешь Series (тип графика: линия, диаграмма и т.п.).

После этого на форму я кинул кнопку и в обработчике написал следующее:
Код

Chart1.Series[0].AddXY(1,15);
Chart1.Series[0].AddXY(2,20);
Chart1.Series[0].AddXY(3,5);

Думаю что и так понятно но опишу: Мы на созданный нами график (Series) помещаем точки по Х=1 по Y=15
далее 2 и 20 соотвественно и т.д. в иотге получается график.

Автор: Poseidon 12.3.2005, 20:16
Вот пример с пояснениями, каторый строит график задаваемой функции прямо на форме (никаких компонентов не надо)
Код
// Функция, график которой надо построить
 Function f(x:real):real;
 begin
    f:=2*x+3; // можно использовать любые мат. функции (cos, sin, sqr и т.п.)
 end;

// строит график функции
procedure GrafOfFunc;
var
 x1,x2:real;    // границы изменения аргумента функции
 y1,y2:real;    // границы изменения значения функции
 x:real;        // аргумент функции
 y:real;        // значение функции в точке x
 dx:real;       // приращение аргумента
 l,b:integer;   // левый нижний угол области вывода графика
 w,h:integer;   // ширина и высота области вывода графика
 mx,my:real;    // масштаб по осям X и Y
 x0,y0:integer; // точка - начало координат

begin
 // область вывода графика
 l:=10;                     // X - координата левого верхнего угла
 b:=Form1.ClientHeight-20;  // Y - координата левого верхнего угла
 h:=Form1.ClientHeight-40;  // высота
 w:=Form1.Width-40;         // ширина

 x1:=0;     // нижняя граница диапазона аргумента
 x2:=25;    // верхняя граница диапазона аргумента
 dx:=0.01;  // шаг аргумента

 // найдем максимальное и минимальное значения
 //  функции на отрезке [x1,x2]
 y1:=f(x1); // минимум
 y2:=f(x1); // максимум
 x:=x1;
 repeat
   y := f(x);
   if y < y1 then y1:=y;
   if y > y2 then y2:=y;
   x:=x+dx;
 until (x>=x2);

 // вычислим масштаб
 my:=h/abs(y2-y1);  // масштаб по оси Y
 mx:=w/abs(x2-x1);  // масштаб по оси X

 // оси
 x0:=l;
 y0:=b-Abs(Round(y1*my));

 with form1.Canvas do
 begin
   // оси
   MoveTo(l,b);LineTo(l,b-h);
   MoveTo(x0,y0);LineTo(x0+w,y0);
   TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
   TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));
   // построение графика
   x:=x1;
   repeat
     y:=f(x);
     Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
     x:=x+dx;
   until (x>=x2);
 end;
end;


Процедуру GrafOfFunc нужно вызывать в событии OnPaint формы.

Для того, что бы не было багов при максимизации формы в событии OnResize формы очищаем форму и заново рисуем график (GrafOfFunc)
Код
// изменился размер окна программы
procedure TForm1.FormResize(Sender: TObject);
begin
  // очистить форму
  form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
  // построить график
  GrafOfFunc;end;


Конечно, построить график функции не есть твоя цель. Но из этого кода можно просто получить то, что нужно. Этот пример так же показывает, что для построения графика (да и вообще для "рисования" можно и не использовоть никаких компонентов. Все отображается прямо на форме (для этого, как видно, используется свойство Canvas).

Автор: Lom 4.8.2006, 11:52
В посте заинтересовало время по оси Х.
В свойствах серии TChart есть галочка про Date Time, сколько не бился над форматом ничего не получается, нужны именно минуты и часы.
И немного не в тему - я правильно понял, что в TChart  по оси Х только целые значения можно задавать ????

Автор: Alexeis 4.8.2006, 12:42
Lom,  smile 
Цитата

TChartAxis component

Declaration
property AxisValuesFormat : String;
Description
Default Value: '#,##0.###'
The AxisValuesFormat specifies the desired formatting string to be applied to Axis Labels. It has effect when Axis associated Series have their XValues.DateTime or YValues.DateTime property set to False.
For DateTime Axis labels use the TChartAxis.DateTimeFormat property.


Код

 LineSeries1Series1.XValues.DateTime := true;
 Cht1.BottomAxis.DateTimeFormat := 'dd/mm/yy';
 LineSeries1Series1.AddXY(1.1, 2.2);
 LineSeries1Series1.AddXY(1.8, 2.2);


Добавлено @ 12:49 
Минуты и часы будет тоже самое только
Код

Cht1.BottomAxis.DateTimeFormat :='hh/nn';

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)