Работа с Chart-ом!

отредактировано 17:46 Раздел: FastReport 3.0
Добрый день!
Вообщем есть такая проблема, нужно из Делфи создать отчет с несколькими страницами (количество страниц на перед не известно) на которых будут расположен Chart с своими сериями (количество серий в каждом Charte разное). Формат даных для серий FixedData.
Огромная прозьба привести пример кода, так как все попытки создать подобное самому, после прочтения доки и форума, венчались неудачью ;)
За ранее благодарен!
«1

Комментарии

  • отредактировано 17:46
    Добавить серии из Delphi можно так:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, frxChart, frxClass,TeEngine, Chart, Series,GanttCh, frxDesgn;
    
    type
      TForm1 = class(TForm)
        frxChartObject1: TfrxChartObject;
        frxReport1: TfrxReport;
        frxDesigner1: TfrxDesigner;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      s: TChartSeries;
      Chart1:TfrxChartView;
      Ser:TfrxSeriesItem;
    begin
    Chart1 := frxReport1.FindObject('Chart1') as TfrxChartView;
    s:= Chart1.Chart.AddSeries(TLineSeries.Create(nil));
    ser := Chart1.SeriesData.Add;
    ser.DataType := dtFixedData;
    ser.XSource := '1;2;3;4;5;6';
    ser.YSource := '1;2;3;4;5;6';
      with Chart1.Chart do
      begin
        View3DOptions.Orthogonal := True;
        AxisVisible := True;
        View3DWalls := True;
      end;
    frxReport1.ShowReport();
    end;
    
    end.
    
  • отредактировано 17:46
    Спасибо. ;) Так я уже пробывал. Этот пример показывает как связаться с уже существующим Chart-ом. А можно привести пример как из Делфы создать новую страницу, потом на нее поместить Chart и создать новые серии.
  • отредактировано 17:46
    Приблезительно так:
    var
    Page:TfrxReportPage;
    MasterData:TfrxMasterData;
    Chart:TfrxChartView;
    s: TChartSeries;
    Ser:TfrxSeriesItem;
    begin
    Page := TfrxReportPage.Create(Report);
    MasterData := TfrxMasterData.Create(Page);
    Chart := TfrxChartView.Create(MasterData);
    //настройки страници
    Page. ..
    ..
    //настройка бэнда
    MasterData.SetBounds(0,0,0,400);
    MasterData.RowCount := 10;
    
    //Chart
    Chart.SetBounds(0,0,0,0);
    Chart.Align := baClient;
    
    s:= Chart.Chart.AddSeries(TLineSeries.Create(nil));
    ser := Chart.SeriesData.Add;
    ser.DataType := dtFixedData;
    ser.XSource := '1;2;3;4;5;6';
    ser.YSource := '1;2;3;4;5;6';
     with Chart.Chart do
     begin
       View3DOptions.Orthogonal := True;
       AxisVisible := True;
       View3DWalls := True;
     end;
    Report.ShowReport();
    end;
    
    end.
    
  • отредактировано 17:46
    Странно, как ни пробую - ничего не получается. На строчку кода
    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 не имеют отношения к ФастРепорту.
    Мастера!!! Помогите.
  • отредактировано 17:46
    А если так:
    type
      TForm1 = class(TForm)
        frxChartObject1: TfrxChartObject;
        frxReport1: TfrxReport;
        frxDesigner1: TfrxDesigner;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      TSeriesClass = class of TChartSeries;
      const
      ChartSeries: array[0..7] of TSeriesClass =
        (TLineSeries, TAreaSeries, TPointSeries, TBarSeries, THorizBarSeries,
         TPieSeries, TGanttSeries, TFastLineSeries);
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      s: TChartSeries;
      b: Boolean;
      Chart1:TfrxChartView;
      Ser:TfrxSeriesItem;
    begin
    Chart1 := frxReport1.FindObject('Chart1') as TfrxChartView;
      s := TChartSeries(TLineSeries.NewInstance);
      s.Create(Chart1.Chart);
      Chart1.Chart.AddSeries(ChartSeries[2]);
      ser := Chart1.SeriesData.Add;
     
      with Chart1.Chart do
      begin
        b := not (s is TPieSeries);
        View3DOptions.Orthogonal := b;
        AxisVisible := b;
        View3DWalls := b;
      end;
        ser.XValues := '1;2;3;4;5;6';
        ser.YValues := '1;2;3;4;5;6';
    frxReport1.DesignReport;
     
    end;
     
    end.
    
  • отредактировано 17:46
    В последних версиях так:
    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;
  • отредактировано 17:46
    Теперь не компилится строка
    Chart1.Chart.AddSeries(ChartSeries[2]);
    Выдает ошибку
    [Error] Unit1.pas(47): Incompatible types: 'TChartSeries' and 'TSeriesClass'
    Муть такая, что голову сломать можно. Не могу поверить, что это нельзя сделать проще. Но вижу новые методы, щас буду ломать дальше.
  • отредактировано 17:46
    В последнем примере у меня строчка
    Chart.AddSeries(csBar);
    выдает ошибку. Недопустимый идентификатор AddSeries. А если сделать
    Chart.Chart.AddSeries(csBar);
    компилятор не распознает csBar. Это, насколько я понимаю, тип диаграммы. Кстати, csLine выдает тот же результат.
    А какую роль в этом процессе играют классы TfrxSeriesItem и TfrxSeriesData. Как они связаны между собой и с объектом TfrxChartView?
  • отредактировано 17:46
    В конечном итоге, перелопатив все, что было написано ранее, собрал рабочий вариант.

    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;
  • отредактировано 17:46
    Еще раз Добрый Вечер.
    Казалось бы, все решилось, да вот только, как оказалось, не все. Может кто подскажет, как вывести серию не с фиксированными датами, как в предыдущем примере, а из источника данных. Пробую сделать тупо
    with ser do
    begin
    DataType:=dtDBData;
    DataSet:=frDB;
    XSource:='frds."DAY"';
    YSource:='frds."SUMMA"';
    end;
    не получается. И вот так тоже не получается.
    XValues:='frds."DAY"';
    YValues:='frds."SUMMA"';
    Может кто делал такие вещи - поделитесь. Скорее всего не хватает каких-то настроек. Но каких - ума не приложу. Давайте уже расколупаем эту тему до конца. Заранее благодарен тем, кто принимает участие.
    Р.S. А нет ли никакой доки подробной. Исходники колупать - дело непростое, особенно, если их нет.
  • отредактировано 17:46
    Chil написал:
    В последнем примере у меня строчка
    Chart.AddSeries(csBar);
    выдает ошибку.
    Нужна последняя версия FR3 - это добавлено в одном из последних билдов.
  • отредактировано April 2006
    Ребята!!! Может кто-то сделал отчет с диаграммой в run-time, взяв данные не фиксированные, а из источника данных. Я гоняю цикл по набору данных и вношу в свойства Chart.SeriesData[0].XSource и Chart.SeriesData[0].YSource данные через точку с запятой, тем самым вырывая зуб через задницу. Если же указать Chart.SeriesData[0].DataType:=dtDBData, а также дать ссылку на набор данных Chart.SeriesData[0].DataSet:=frDB, то при указании поля, из которого берутся данные Chart.SeriesData[0].XValues:='frDB."DAY_BEGIN"';
    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'
    Что-то не так, а что - не пойму. Помогите разобраться. ;)
    Как указать поля источника данных???
  • отредактировано 17:46
    Проблема в том, что датасет не подключен к отчету (даже исли был подключен вы вызвали метод Clear).
    Попробуйте так должно работать:
    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;
    Fr.DataSets.Add(frxDBDataset1);//добавляем датасет
    fr.EnabledDataSets.Add(frxDBDataset1);//делаем датасет активным
    s := TChartSeries(TLineSeries.NewInstance);
    s.Create(Chart);
    ser:=chart.SeriesData.Add;
    Chart.Chart.AddSeries(s);
    Chart.Chart.View3D:=false;
    with ser  do
    begin
    DataType := dtDBData;
    XSource := 'frxDBDataset1."Name"';
    YSource := 'frxDBDataset1."Area"';
    DataSet := frxDBDataset1;
    
    end;
    fr.ShowReport;
    end;
    
  • отредактировано 17:46
    Спасибо!!! Все получилось. Кстати, без
    fr.EnabledDataSets.Add(frxDBDataset1);//делаем датасет активным
    тоже все работает.
    Всем спасибо, кто помогал ;)
  • отредактировано 17:46
    не получается(((
    надо добавить программно несколько серий, по числу записей в запросе
    у меня 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;
  • отредактировано 17:46
    Есть пример, если нужно могу дать.
  • отредактировано 17:46
    да, очень очень нужно
    fortran.ds на gmail.com
  • отредактировано 17:46
    Вот он.
  • отредактировано 17:46
    спасибо
    но мне надо не в делфишном проекте, а в скрипте отчета
    procedure Page1OnBeforePrint(Sender: TfrxComponent);

    нельзя ведь копи-паст кусок из проекта? ну во всяком случае у меня не компилируется(((
  • отредактировано 17:46
    народ, ну не бросайте
    неужели никто в скрипте не добавлял серии?
    ;)
  • отредактировано 17:46
    написал:
    Вот он.
    Прикрепленный файл не скачивается. Перезалейте еще раз, пожалуйста.
  • отредактировано 17:46
    написал:
    Прикрепленный файл не скачивается.
    Все нормально скачивается. Только что качал.
  • отредактировано 17:46
    GloThin написал:
    GloThin написал:
    Прикрепленный файл не скачивается.
    Все нормально скачивается. Только что качал.
    у меня не качается. Ну да ладно, у меня вопрос: как получить доступ к серии из отчета?
    Например, в отчете закинул Chart1 на листок. В нем добавил серию типа Pie.
    Теперь при построении отчета в той же Page1OnBeforePrint
    хочу задать параметры серии. Как это сделать?
    Такой вариант не прокатывает:
    with Chart1.Chart.Series1 do
    begin
    DataType := dtFixedData;
    XSource := 'Jan;Feb;Mar;Apr';
    YSource := '31;28;30;25';
    end
    
    Что надо подправить?
  • отредактировано 17:46
    написал:
    у меня не качается.
    У меня скачался.

    Попробуйте так:
    with Chart1.SeriesData[0] do
    begin
    DataType := dtFixedData;
    XSource := 'Jan;Feb;Mar;Apr';
    YSource := '31;28;30;25';
    end;
    
  • отредактировано 17:46
    написал:
    написал:
    у меня не качается.
    У меня скачался.

    Попробуйте так:
    with Chart1.SeriesData[0] do
    begin
    DataType := dtFixedData;
    XSource := 'Jan;Feb;Mar;Apr';
    YSource := '31;28;30;25';
    end;
    
    возможно у меня не качается из-за ограничений прокси. Хотя zip, exe rar не запрещены. Den, спасибо за подсказку, то что нужно!
  • cavcav Кемерово
    отредактировано 17:46
    А не коде Delphi а в скрипте кто нибуть пробовал создавать серии у Chart ?
  • отредактировано 17:46
    cav написал:
    А не коде Delphi а в скрипте кто нибуть пробовал создавать серии у Chart ?
    То, что написал уважаемый Den как раз таки не в Delphi, а в скрипте. Это у меня лежит в событии страницы OnBeforePrint.
    Правда серии я там не создаю, так как серия у меня одна всегда (круговая диаграмма), а лишь вношу туда необходимые значения.
    Просто мне пришлось немного модернизировать модуль frxChart.pas,
    чтобы была возможность расскрашивать диаграммы в требуемые цвета.
    Добавил одно свойство к серии помимо XSource, YSource добавил ItemColor.

    Сделано все на скорую руку, так как заказчику потребовалось расскрасить диаграмму в нужные ему цвета.
    Поэтому, поскольку если доделывать все путем (поддержка цветности) когда данные для графика берутся из БД, из бэндов потребовалось бы уйму времени, нужно было бы и в соответствующие формы добавить Edit-поля ввода для цвета. Вот я и пошел малой кровью, свойство добавил, но данные заполнять в него только через скрипты.
  • cavcav Кемерово
    отредактировано 17:46
    То что привел Den в последнем посте и у меня работает в скрипте. А вот как создать серии.... вот с этим затык. Можно конечно и в Delphi реализовать (по его примеру). Но как то это не совсем интересно. Самое обидное в документации по Fr ничего не нашол ;)
  • отредактировано 17:46
    Может кто знает как разместить одну под другой три горизонтальные оси трех серий одного Chartа, вертикальная ось у них общая
  • cavcav Кемерово
    отредактировано 17:46
    to intaari

    Спомощью серий. В этом топике как раз и идет обсуждение как это сделать програмно.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.