Яндекс цитирования
 

Web-программирование

 

[ В начало раздела ]

Создание изображений графиков и диаграмм

Давайте решим проблему создадания и вывода пользователю различных графиков, диаграмм, которые отражают некоторые необходимые данные для анализа и принятия решения.

В рассматриваемом примере мы создадим web-серевер, выдающий на запрос пользователя диаграммы, отражающие дифференциацию стран по площади или по численности населения. Вывод производим в виде изображения Jpeg.

Информацию возьмем из таблицы Country стандартной базы DBDEMOS.

Итак, начнем новый проект (New - Web Application Server). Тип - CGI или ISAPI (Напомню, что для отладки полезнее использовать CGI). Web-модуль переименуем в WM.

Для создания интерфейса взаимодействия с пользователем создадим 2 действия-отклика:

  • - ActionArea - запрос на вывод информации по площади стран
  • - ActionPopulation - запрос на вывод информации по численности населения стран

Добавим их в Actions нашего Web-модуля и добавим им пути /area и /population соответсвенно.

Кроме того на web-модуль поместим компонент TTable - таблица БД - (Table1) и свяжем ее с таблицей Country из базы данных DBDEMOS.

Так, как нам придется в памяти создавать изображение графиков и диаграмм, то в секции private нашего модуля разместим 3 вспомогательных объекта:

  Chart: TDBChart;    // график
  Series: TPieSeries; // последовательность данных
  Image: TImage;      // изображение

Вот мы и подошли к тому месту в нашем проекте, где определим как и по каким принципам будет работать наш web-сервер. Начнем рассмотрение (как и любого предмета или явления) - с рождения.

В обработчике OnCreate модуля разместим код, отвечающий за:

  • - соединение с таблицей БД;
  • - создание и настройку объекта нашего графика (Chart);
  • - создание и настройку последовательности данных (Series);
  • - создание и настройку объекта-изображения (Image).

procedure TWM.WebModuleCreate(Sender: TObject);
begin
  // открываю таблицу БД
  Table1.Open;
  // создаю график
  Chart := TDBChart.Create (nil);
  Chart.Width := 600;
  Chart.Height := 400;
  Chart.AxisVisible := False;
  Chart.Legend.Visible := False;
  Chart.BottomAxis.Title.Caption := 'Название';
  // создаю последовательность
  Series := TPieSeries.Create (Chart); // тип диаграммы -
                                       // круговая
  Series.ParentChart := Chart;
  Series.DataSource := Table1;    // источник данных
  Series.XLabelsSource := 'Name';
  Series.OtherSlice.Style := poBelowPercent;
  Series.OtherSlice.Text := 'Others';
  Series.OtherSlice.Value := 2;
  Chart.AddSeries (Series);   // связываю последовательность
                              // данных с графиком
  // создаю изображение в памяти
  Image := TImage.Create (nil);
  Image.Width := Chart.Width;
  Image.Height := Chart.Height;
end;

После того, как объекты были созданы, займемся обработкой пользовательских действий: ActionArea и ActionPopulation. В первом из них - ActionArea - настроим график и последовательность данных на отображение данных о странах.

procedure TWM.WMActionAreaAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  // установим значения
  Chart.Title.Text.Clear;
  Chart.Title.Text.Add ('Площадь стран');
  Chart.LeftAxis.Title.Caption := 'Площадь';
  Series.Title := 'Area';
  Series.PieValues.ValueSource := 'Area'; // связываем с полем таблицы
end;

Аналогично поступаем с действием ActionPopulation - численность населения.

procedure TWM.WMActionPopulationAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  // установим значения
  Chart.Title.Text.Clear;
  Chart.Title.Text.Add ('Численность населения');
  Chart.LeftAxis.Title.Caption := 'Популяция';
  Series.Title := 'Population';
  Series.PieValues.ValueSource := 'Population'; // связываем с полем таблицы
end;

Возврашаясь к аналогии с предметами и явлениями, отмечу, что и наш модуль также должен будет умереть, разрушиться. Но после себя он не должен ничего оставлять... :))) Нам же хуже будет. Вот так и поступим в обработчике OnDestroy модуля.

procedure TWM.WebModuleDestroy(Sender: TObject);
begin
  // высвобождаю ресурсы
  Chart.Free;
  Series.Free;
  Image.Free;
end;

Вы спросите: "А как же картинка?". Напомню, что мы создавали специализированный web-сервер, отвечающий на запросы пользователей и выводящий только изображения. Поэтому воспользуемся событием AfterDispatch, выполняющимся после выполнения обработки действий-отклика. Удобно, так как мы настраивали диаграммы в обработчиках разных действий, а вывод пользователю одинаковый! :)))

Формирование изображения происходит с помощью метода Draw объекта Chart. А подход к выводу изображения пользователю аналогичен тому, как мы поступили с графическим счетчиком: привязка изображения с объектом TJpegImage, сохранение этого объекта в поток в памяти (TMemoryStream), привязка потока со свойством ContentStream объекта TWebResponse. Да, и не забудим про MIME-тип содержимого: image/jpeg.

procedure TWM.WebModuleAfterDispatch(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  Jpeg: TJpegImage;
  MemStr: TMemoryStream;
begin
  // рисуем график на изображении в памяти
  Chart.Draw (Image.Canvas, Image.BoundsRect);
  // создаем JPEG-изображение и копируем в него график
  Jpeg := TJpegImage.Create;
  try
    Jpeg.Assign (Image.Picture.Bitmap); 
    MemStr := TMemoryStream.Create; // поток в памяти
    try
      // сохраняем в поток и возвращаем его пользователю
      Jpeg.SaveToStream (MemStr);
      MemStr.Position := 0;
      Response.ContentType := 'image/jpeg';
      Response.ContentStream := MemStr;  // связываем потоки
      Response.SendResponse;
    finally
      MemStr.Free;
    end;
  finally
    Jpeg.Free;
  end;
end;

Вот и вы стали знать чуточку больше. Уверен, что скоро многие поймут, что Perl - не панацея от всех бед web-программистов, Delphi что-то умеет тоже. Если вы читаете эти строчки, значит мой труд не прошел даром.

Дальнейшие темы можете подсказать и вы сами. Спасибо.

© Долгов Сергей 25.11.2000

 

[ В начало раздела ]


 

 

Все для web-дизана!!! Бард-Путеводитель Много Всего CGI-Гид. Лучшие скрипты... WDH - WebDesignHelp - CGI, JAVA, APPLETS, TOP100! Раскрутка, увеличение посещаемости и индекса цитируемости в поисковых системах.

© 2000-2002 Долгов Сергей

dolgov_sergei@mail.ru

X