• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

深入浅出CChart 每日一课——快乐高四第三十一课 再上光明顶,Delphi直接调用Dll版的C ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

前面介绍了ActiveX控件版的CChart在Delphi中的应用。其实,对于Delphi这么强大的工具,完全可以不用ActiveX,直接用Dll版的CChart。下面给出一个简单的例子。

Delphi使用的语言是Object Pascal,CChart用的语言是C++,C++的类接口无法在Delphi下使用。但是,通过Dll,Delphi可以调用C++的函数,这样我们前面提到的C风格代码又可以发挥作用了。

Object Pascal中C++函数声明格式如下:

Function FunName(i:integer): integer; cdecl; external ‘aaa.dll’; name ’realName’
Procedure FunName(i:integer); cdecl; external ‘aaa.dll’; name ’realName’

其中realName是函数在Dll中的实际名称。在CChart发行版中,实际名称需要到CChartu_EXPORTS.txt这个文件中查询。

下面正式开始。

第一步,打开Delphi7,将自动建立Form1窗体。点击菜单“File”->“Save Project As…”,保存文件LessonA31文件夹。

第二步,通过Object Inspector添加Form1的OnCreate函数、OnDestroy函数和OnResize函数。

第三步,在Unit1.pas文件里,{$R *.dfm}的下一行,添加函数导入代码。

procedure CreateChart(); cdecl; external 'CChartu.dll' name '[email protected]@@YAXXZ'
procedure DestroyChart(); cdecl; external 'CChartu.dll' name '[email protected]@@YAXXZ'
function Attach(hWnd:HWND):integer; cdecl; external 'CChartu.dll' name '[email protected]@@[email protected]@@Z'
function SetType(charttype:integer):boolean; cdecl; external 'CChartu.dll' name '[email protected]@@[email protected]'
procedure SetFieldFcn(field:FieldFunction); cdecl; external 'CChartu.dll' name '[email protected]@@[email protected]@Z'
procedure SetPlotRange(x1:double; x2:double; y1:double; y2:double); cdecl; external 'CChartu.dll' name '[email protected]@@[email protected]'
procedure SetTitle(title:PWideChar); cdecl; external 'CChartu.dll' name '[email protected]@@[email protected]'
function SetConfineRect(rect:TRect):Boolean; cdecl; external 'CChartu.dll' name '[email protected]@@[email protected]@@Z'
procedure ReDraw(); cdecl; external 'CChartu.dll' name '[email protected]@@YAXXZ

这里导入了CChartu.dll文件中的一些函数,后面将用到。同样,这是这里工作量的最大头。

这里,我们需要把CChart发行包里的CChartu.dll文件拷贝到LessonA31文件夹。

第四步,在上面代码的前面,添加一个函数指针的定义。

type
    FieldFunction=function(x:double; y:double):double;cdecl;

第五步,编写场函数。

function fieldfcn(x:double; y:double):double;cdecl;
begin
    fieldfcn:=1.0/(x*x + y*y + 1.0);
end;

第六步,完成OnCreate函数。

procedure TForm1.FormCreate(Sender: TObject);
begin
    CreateChart();
    Attach(Handle);
    SetType(6);
    SetTitle('Delphi标题');
    SetFieldFcn(@fieldfcn);
    SetPlotRange(-2.0, 2.0, -2.0, 2.0);
end;

注意到,Handle就是主窗体的句柄。

第七步,完成OnDestroy函数。

procedure TForm1.FormDestroy(Sender: TObject);
begin
    DestroyChart();
end;

第八步,完成OnResize函数。

procedure TForm1.FormResize(Sender: TObject);
var
    lpRect: TRect;
begin
    Windows.GetClientRect(Handle, lpRect);
    SetConfineRect(lpRect);
    ReDraw();
end;

最后的效果如图。

可以看到,效果和C++里面没有什么不一样的地方。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap