请教各位:LineDDA的用法及call back函数的定义及使用

largebeard 2002-01-09 11:32:30
LineDDA(p1,p2,p3,p4:integer;p5:LineDDAProc;p6:integer);
其中p5是一个Call Back 函数
LineDDAProc在Api定义为
VOID CALLBACK LineDDAProc(int X,int Y,LPARAM lpdata);
请问在Delphi 中如何定义此类函数?

还有在Delphi 中如何把 一个过程或函数的入口地址作为一个参数传递??

谢谢!!!!!!!!!!!!!!!!!!!!
...全文
235 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
largebeard 2002-01-11
  • 打赏
  • 举报
回复
up
up
largebeard 2002-01-11
  • 打赏
  • 举报
回复
upupup
largebeard 2002-01-11
  • 打赏
  • 举报
回复
aningstar(乘风破浪终有时) And
xzgyb(老达摩):

此方法在我自己定义的类中却出现问题,请帮助解决:
unit Glyph;

interface

uses
Windows,Forms,Graphics,Classes,ExtCtrls.............;

type
TGlyph=class(Tobject)
private
procedure c(X,Y:Integer;t:integer);stdcall;
procedure DrawTTFPolgon(p1,p2:Tpoint;cTotal:Cardinal);
..........
..........
end;

implementation

{$R *.DFM}

procedure TGlyph.DrawTTFPolgon(p1,p2:Tpoint;cTotal:Cardinal);
begin //假设p1=point(10,11),p2=point(13,14)
LineDDA(p1.x,p1.y,p2.x,p2.y,@TGlyph.c,-1);
end;

procedure TGlyph.c(X,Y:Integer;t:integer);//此处传递过来的参数有误X=11,Y=-1;
begin //而实际上此时应该为X=10,Y=11
.......... //每次调用时时都是X:=Y,Y:=t; 参数好象左移了一个
............. //这是为什么???
end;
end.
xzgyb 2002-01-11
  • 打赏
  • 举报
回复
哈哈,老兄说的真好
呵呵
largebeard 2002-01-11
  • 打赏
  • 举报
回复
谢谢各位特别是
大公无私提供代码的aningstar(乘风破浪终有时) 和 乐善好施的 xzgyb(老达摩)
多谢了!!!
WindXp 2002-01-11
  • 打赏
  • 举报
回复
谢谢各位特别是
大公无私提供代码的aningstar(乘风破浪终有时) 和 乐善好施的 xzgyb(老达摩)
多谢了!!!
xzgyb 2002-01-11
  • 打赏
  • 举报
回复
你如放在 LineDDA(p1,p2,p3,p4,@c,p6)之后
一着急忘写了
xzgyb 2002-01-11
  • 打赏
  • 举报
回复
procedure c(X,Y:Integer;t:integer);stdcall;
begin
.......
end;
你如放在 LineDDA(p1,p2,p3,p4,@c,p6)当然会报错,找不到
一个是放在LineDDA前面,在就是在Interface部分声明一下

在c中在类中声明回调函数好像用静态函数
而Delphi中有个类方法,但好像不行
largebeard 2002-01-11
  • 打赏
  • 举报
回复
jjjj
WindXp 2002-01-11
  • 打赏
  • 举报
回复
对呀,如何在类中申明回调函数呢???
largebeard 2002-01-11
  • 打赏
  • 举报
回复
up
up
up
largebeard 2002-01-11
  • 打赏
  • 举报
回复
xzgyb(老达摩)::
我在类的 [实现] 部分中直接写下面程序段
procedure c(X,Y:Integer;t:integer);stdcall;
begin
.......
end;

然后编译时会在LineDDA(p1,p2,p3,p4,@c,p6)的@c处会报错:C没有定义
那怎么办呢??如何解决??
WindXp 2002-01-11
  • 打赏
  • 举报
回复
upup
xzgyb 2002-01-11
  • 打赏
  • 举报
回复
procedure c(X,Y:Integer;t:integer);stdcall;
这里的过程c是类的方法不能用于回调函数, 而这样@TGlyph.c,虽然通过,但有问题
你在
procedure TGlyph.c(X,Y:Integer;t:integer);//此处传递过来的参数有误X=11,Y=-1;
begin //而实际上此时应该为X=10,Y=11
.......... //每次调用时时都是X:=Y,Y:=t; 参数好象左移了一个
............. //这是为什么???
end;
里取一下Self值,正好是真正的X值,正是因为c是类中的方法,它会多传一个Self参数


xzgyb 2002-01-10
  • 打赏
  • 举报
回复
delphi对指针的支持不象c的灵活
可用Inc(lpPoint, 1);
largebeard 2002-01-10
  • 打赏
  • 举报
回复
看到了,谢谢各位!
另外,
1.我定义了一个指向结构体的指针(设为lp),
但是我执行 lp:=lp+2;
却好像行不通,为什么?

2.我定义了一个指向array of TPoint的指针(设为lpPoint),
lpPoint:=lpPoint + 1;
也行不通,为什么?
是不是Delphi对指针的支持不好???
xzgyb 2002-01-09
  • 打赏
  • 举报
回复
procedure LineDDAProc(X, Y: Integer; lpdata: LPARAM); stdcall;

需要定义个过程类型
TLineDDAProc = procedure (X, Y: Integer; lpdata: LPARAM); stdcall;

在 procedure Func(AProc: TLineDDAProc);
hellion 2002-01-09
  • 打赏
  • 举报
回复
procedure LineDDAProc(X,Y: Integer; var data: PARAM); stdcall;


@ProcedureName
largebeard 2002-01-09
  • 打赏
  • 举报
回复
急 up
aningstar 2002-01-09
  • 打赏
  • 举报
回复
给你一个例子,你就明白了


来自:卷起千堆雪tyn, 时间:2001-12-24 22:10:00, ID:809383
YB老弟说我没有诚意,唉,那我就来点诚意,无私一把,给大家一点小小技巧----关于蚂蚁线

>以下程序在一个表单上放置一个Timer控件,设置Interval :=100;
>实现PhotoShop里的流动线效果.
>以下程序字节数<512,简练,高效;原来PhotoShop也不过如此~~

unit n;

interface

uses
Windows,Forms,Graphics,Classes,ExtCtrls;

type
TF=class(TForm)
m:TTimer;
procedure mTimer(Sender:TObject);
end;

var
F:TF;
a:Byte;

implementation

{$R *.DFM}

procedure c(X,Y:Integer;t:TCanvas);stdcall;
begin
a:=a shl 1;
if a =0 then a:=1;
if (a and 224)>0 then
t.Pixels[X,Y]:=clWhite
else
t.Pixels[X,Y]:=clBlack;
end;

procedure TF.mTimer(Sender:TObject);
begin
LineDDA(0,0,333,333,@c,LongInt(Canvas));
end;

end.

>运行之后,有没有看见象蚂蚁在爬呢?
加载更多回复(2)

5,931

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧