:: MVP ::
|
|
:: RSS ::
|
|
|
Что делать, если ваше приложение должно строить графики? Можно все сделать
самостоятельно, а можно воспользоваться готовыми решениями (сторонними
компонентами). Сегодня поговорим о втором способе, а именно, о компоненте
gl.ocx, который является частью пакета MathCad. Этот компонент обладает большим
количеством настроек: освещение, туман, внешний вид, перспектива и т.д., и
способен украсить любую вашу программу.
Если MathCad у вас установлен, запускаем Delphi, заходим в Component -> Import
ActiveX Control и выбираем Mathsoft 3-D Plot module (Version x.x), где x.x -
версия компонента (у меня 8.6). Если MathCad'а у вас нет, то скачиваем этот
компонент из интернета (например, в конце данной статьи). В этом случае вам
еще понадобятся библиотеки EfiUtils.dll, UIUtil.dll, VSFC90.dll (они также
включены в архив в конце статьи). Переписываем эти файлы в отдельный каталог,
заходим в Component -> Import ActiveX Control и нажимаем кнопку "Add...".
Находим gl.ocx и нажимаем "Install...". Компонент установится на вкладку ActiveX,
и будет называться OpenGL.
TOpenGL способен отображать 2D и 3D графики, а в качестве данных должен передаваться
одномерный или двухмерный массив типа OleVariant соответственно. Начнем с простого и
нарисуем синусоиду.
procedure TForm1.Button1Click(Sender: TObject);
const
Start = -pi;
Finish = pi;
Step = 50;
var
Diagram: OleVariant;
i: integer;
begin
Diagram := VarArrayCreate( [0,Step], varDouble );
for i := 0 to Step do
Diagram[i] := sin( Start + ( Finish - Start ) / Step * i );
OpenGL1.RemoveSurfaces;
OpenGL1.AddSurface( Diagram );
end;
|
Для TOpenGL, заполненный массив представляет собой поверхность, которую
нужно нарисовать, причем одновременно может быть отображено несколько таких
поверхностей. Просто создаем несколько массивов OleVariant, заполняем их,
и добавляем к списку поверхностей, которые должны быть построены, используя
функцию AddSurface. RemoveSurfaces полностью отчищает этот список.
Теперь посмотрим, как строится 3D график, на примере функции Cos(Sqrt(X*X+Y*Y)).
procedure TForm1.FormCreate(Sender: TObject);
var
Diagram: OleVariant;
i, j: integer;
k: integer;
begin
k := 36;
Diagram := VarArrayCreate( [0,k,0,k], varDouble );
for i := 0 to k do
for j := 0 to k do
Diagram[i,j] := Cos( Sqrt( ( i-k/2 ) * ( i-k/2 ) + ( j-k/2 ) * ( j-k/2 ) ) );
OpenGL1.RemoveSurfaces;
OpenGL1.AddSurface( Diagram );
end;
|
Теперь поговорим о распространении приложений, использующих этот компонент.
Не факт, что у пользователя, установившего вашу программу, установлен MathCad.
Следовательно, вместе с приложением придется распространять следующие файлы:
gl.ocx, EfiUtils.dll, UIUtil.dll, VSFC90.dll. Помимо этого следует помнить,
что gl.ocx необходимо зарегистрировать в системе.
Если вы будете распространять свое приложение в архиве, вам самим придется
позаботиться о регистрации компонента. Для этого в системе имеется штатная
утилита regsvr32. Регистрация выполняется следующим образом:
"regsvr32 c:\путь к файлу\gl.ocx". Обратное действие выполняется
так: "regsvr32 /u c:\путь к файлу\gl.ocx". Разумеется,
путь к файлу должен быть реальный.
Если вы будете распространять свое приложение в виде инсталляционного пакета,
то заботу о регистрации компонента можно возложить на него. Например, если вы
делаете инсталлятор в CreateInstall, то на вкладке "Мастер" выберите
"Регистрировать", и добавьте gl.ocx к списку файлов, которые нужно зарегистрировать.
А для Inno Setup это может выглядеть примерно так:
[Setup]
AppName=MathSoft 3-D plot module
AppVerName=MathSoft 3-D plot module 8.0
AppCopyright=MathSoft, Inc
DefaultDirName={sys}
[Files]
Source: "C:\distr\ActiveX\UiUtil.dll"; DestDir: "{sys}"
Source: "C:\distr\ActiveX\EfiUtils.dll"; DestDir: "{sys}"
Source: "C:\distr\ActiveX\VSFC90.dll"; DestDir: "{sys}"
Source: "C:\distr\ActiveX\gl.ocx"; DestDir: "{sys}"; Flags: regserver
|
Прилагаемый к статье пример отлично работает в Delphi 6, а вот в Delphi 7 и выше все на так хорошо, как хотелось бы.
Там, вместо координатных осей и графика, рисуется сплошной черный квадрат (точь в точь
как у Малевича!). Решение проблемы найти удалось, а вот объяснить его смогли бы разве что только разработчики компонента.
Фон поверхности, на которой расположен компонент (например, поверхность формы), не должен быть окрашен в системные цвета,
а именно такой цвет (clBtnFace) имеют по умолчанию все стандартные компоненты. Достаточно изменить цвет на clWhite, clYellow,
clSkyBlue или любой другой не системный цвет, и компонент начинает вести себя как ему и положено. Да, ни в коем случае не включайте
двойную буферизацию, кроме черного квадрата ничего не увидите!
На сегодня это все. Удачи в программировании.
.: Пример к данной статье :.
.: gl.ocx и необходимые библиотеки :.
|
При использовании материала - ссылка на сайт обязательна
|
|