Работа с Chart-ом!
Добрый день!
Вообщем есть такая проблема, нужно из Делфи создать отчет с несколькими страницами (количество страниц на перед не известно) на которых будут расположен Chart с своими сериями (количество серий в каждом Charte разное). Формат даных для серий FixedData.
Огромная прозьба привести пример кода, так как все попытки создать подобное самому, после прочтения доки и форума, венчались неудачью
За ранее благодарен!
Вообщем есть такая проблема, нужно из Делфи создать отчет с несколькими страницами (количество страниц на перед не известно) на которых будут расположен Chart с своими сериями (количество серий в каждом Charte разное). Формат даных для серий FixedData.
Огромная прозьба привести пример кода, так как все попытки создать подобное самому, после прочтения доки и форума, венчались неудачью
За ранее благодарен!
Комментарии
s:= Chart.Chart.AddSeries(TLineSeries.Create(nil));
компилятор упорно выдает ошибку
[Error] diagram.pas(156): Incompatible types: 'TChartSeries' and 'procedure, untyped pointer or untyped parameter'
и не хочет работать. Я третий день бьюсь над этой задачей, решил ее через обычный компонент Chart, нарисовал графики на форме, а fast Report побороть не могу.
Кстати, на мой дилетантский взгляд класы TChartSeries и TLineSeries не имеют отношения к ФастРепорту.
Мастера!!! Помогите.
uses frxChart;
var
Page: TfrxReportPage;
Chart: TfrxChartView;
begin
Page := TfrxReportPage.Create(frxReport1);
Page.CreateUniqueName;
Page.SetDefaults;
Chart := TfrxChartView.Create(Page);
Chart.SetBounds(0, 0, 300, 300);
Chart.CreateUniqueName;
Chart.AddSeries(csBar);
with Chart.SeriesData[0] do
begin
DataType := dtFixedData;
XSource := 'Jan;Feb;Mar;Apr';
YSource := '31;28;31;30';
end;
frxReport1.ShowReport;
Chart1.Chart.AddSeries(ChartSeries[2]);
Выдает ошибку
[Error] Unit1.pas(47): Incompatible types: 'TChartSeries' and 'TSeriesClass'
Муть такая, что голову сломать можно. Не могу поверить, что это нельзя сделать проще. Но вижу новые методы, щас буду ломать дальше.
Chart.AddSeries(csBar);
выдает ошибку. Недопустимый идентификатор AddSeries. А если сделать
Chart.Chart.AddSeries(csBar);
компилятор не распознает csBar. Это, насколько я понимаю, тип диаграммы. Кстати, csLine выдает тот же результат.
А какую роль в этом процессе играют классы TfrxSeriesItem и TfrxSeriesData. Как они связаны между собой и с объектом TfrxChartView?
uses
frxClass, frxDBSet, frxChart, Printers, Series, ExtCtrls, Chart,
frxDesgn, DBCtrlsEh, TeeProcs, TeEngine, Mask;
var
Page:TfrxReportPage;
Chart:TfrxChartView;
s: TChartSeries;
Ser:TfrxSeriesItem;
begin
fr.Clear;
Page := TfrxReportPage.Create(fr);
Page.CreateUniqueName;
Page.SetDefaults;
Page.Orientation:=poLandScape;
Chart := TfrxChartView.Create(Page);
Chart.Align:=baClient;
Chart.CreateUniqueName;
s := TChartSeries(TLineSeries.NewInstance);
s.Create(Chart);
ser:=chart.SeriesData.Add;
Chart.Chart.AddSeries(s);
Chart.Chart.View3D:=false;
with ser do
begin
DataType := dtFixedData;
XSource := 'Jan;Feb;Mar;Apr';
YSource := '31;28;30;25';
end;
fr.ShowReport;
end;
Казалось бы, все решилось, да вот только, как оказалось, не все. Может кто подскажет, как вывести серию не с фиксированными датами, как в предыдущем примере, а из источника данных. Пробую сделать тупо
with ser do
begin
DataType:=dtDBData;
DataSet:=frDB;
XSource:='frds."DAY"';
YSource:='frds."SUMMA"';
end;
не получается. И вот так тоже не получается.
XValues:='frds."DAY"';
YValues:='frds."SUMMA"';
Может кто делал такие вещи - поделитесь. Скорее всего не хватает каких-то настроек. Но каких - ума не приложу. Давайте уже расколупаем эту тему до конца. Заранее благодарен тем, кто принимает участие.
Р.S. А нет ли никакой доки подробной. Исходники колупать - дело непростое, особенно, если их нет.
Chart.SeriesData[0].YValues:='frDB."F_1"';
выдается ошибка: Error in expression: Expression expected. Если же написать
Chart.SeriesData[0].XSource:='frDB."DAY_BEGIN"';
Chart.SeriesData[0].YSource:='frDB."F_1"'; то выдается ошибка другая:
Error in expression 'frDB."DAY_BEGIN"': Identifier expected.
Если указать Chart.SeriesData[0].XSource:='DAY_BEGIN'; выдается такая ошибка:
Undeclared identifier 'DAY_BEGIN'
Что-то не так, а что - не пойму. Помогите разобраться.
Как указать поля источника данных???
Попробуйте так должно работать:
fr.EnabledDataSets.Add(frxDBDataset1);//делаем датасет активным
тоже все работает.
Всем спасибо, кто помогал
надо добавить программно несколько серий, по числу записей в запросе
у меня FR3.25enterprise
уже все варианты перепробовала
procedure Page1OnBeforePrint(Sender: TfrxComponent);
var
s1:tbarseries;
..................
begin
adoquery2.Active:=true;
adoquery2.first;
for i:=0 to adoquery2.RecordCount-1 do
begin
s1:=Chart1.Chart.AddSeries(TBarSeries.Create(nil));
....
s1.XValues.DateTime:=true;
adoquery2.Next;
end;
adoquery2.close;
fortran.ds на gmail.com
но мне надо не в делфишном проекте, а в скрипте отчета
procedure Page1OnBeforePrint(Sender: TfrxComponent);
нельзя ведь копи-паст кусок из проекта? ну во всяком случае у меня не компилируется(((
неужели никто в скрипте не добавлял серии?
Например, в отчете закинул Chart1 на листок. В нем добавил серию типа Pie.
Теперь при построении отчета в той же Page1OnBeforePrint
хочу задать параметры серии. Как это сделать?
Такой вариант не прокатывает:
Что надо подправить?
Попробуйте так:
Правда серии я там не создаю, так как серия у меня одна всегда (круговая диаграмма), а лишь вношу туда необходимые значения.
Просто мне пришлось немного модернизировать модуль frxChart.pas,
чтобы была возможность расскрашивать диаграммы в требуемые цвета.
Добавил одно свойство к серии помимо XSource, YSource добавил ItemColor.
Сделано все на скорую руку, так как заказчику потребовалось расскрасить диаграмму в нужные ему цвета.
Поэтому, поскольку если доделывать все путем (поддержка цветности) когда данные для графика берутся из БД, из бэндов потребовалось бы уйму времени, нужно было бы и в соответствующие формы добавить Edit-поля ввода для цвета. Вот я и пошел малой кровью, свойство добавил, но данные заполнять в него только через скрипты.
Спомощью серий. В этом топике как раз и идет обсуждение как это сделать програмно.