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

Delphi-PointerMath编译指令

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

我们知道在C和C++里面声明一个指针,但是可以像数组一样去访问里面的成员.

在Delphi2009之后我们有了{$POINTERMATH ON}编译开关,我们也可以了.
一般在Delphi2009之前的版本中,我们会用如下几个方法:

1

1: var
   2:   P: PByteArray;
begin
   4:   P:= PByteArray(某指针);
   5:   P^[0]:= 1;
   6:   P^[1]:= 2;
   7:   ...
end;

2

   1: var
   2:   P: PByte;
begin
   4:   P:= PByte(某地址);
   5:   P^:= 1;
Integer(P)+需要偏移的地址);
   7:   P^:= 2;
   8:   ...
end;

3

   1: var
//或者PChar也可以
begin
   4:   P:= PByte(某地址);
   5:   P^:= 1;
//地址+1
   7:   P^:= 2;
//地址-1
   9:   P^:= 2;
end;

在用第2 和 3方法的时候,如果内存空间不是我们例子上面转换过来,而是自己申请的,那么释放的时候,请记得偏移后的指针一定要归位,所以一般在偏移前,我们会用一个临时变量来存放指针的初始位置.切记.

好,现在说说Delphi2009中POINTERMATH的用法:

ON}
procedure TForm4.btn1Click(Sender: TObject);
   3: var
   4:   P: PByte;
begin
   6:   GetMem(P, 4);
   7:   try
//01 03 05 07
   9:     P[0]:= 1;
  10:     P[1]:= 3;
  11:     P[2]:= 5;
  12:     P[3]:= 7;
//$07050301
//07050301
  15:   finally
  16:     FreeMem(P);
end;
end;
  19: {$POINTERMATH OFF}

和C++就一样了.
自己定义的结构体也可以.

   1: type
   2:   PRect = ^TRect;
   3: var
   4:   P: PRect;
begin
   6:   GetMem(P, 4 * SizeOf(TRect));
   7:   try
//01 03 05 07
Left:= 12;
  10:     P[1].Top:= 22;
Right:= 32;
  12:     P[3].Bottom:= 42;
//$07050301
//07050301
  15:   finally
  16:     FreeMem(P);
end;
end;
  19: {$POINTERMATH OFF}

再看一个有用的.下面是用GDIPlus对图像进行均值灰度化.

   1: uses
   2:   GdiPlus,GdiPlusHelpers;
   3:  
   4: {$R *.dfm}
   5: type
   6:   PABGR = ^TABGR;
//像素点的4个通道
   8:   TABGR = record
   9:     B,G,R,A: Byte;
end;
ON}
procedure TForm4.btn1Click(Sender: TObject);
  13: var
  14:   B: IGPBitmap;
  15:   RC: TGPRect;
  16:   BD: TGPBitmapData;
  17:   P: PABGR;
Integer;
begin
'C:\1.png');
//需要处理的图像的区域
//因为我们结构体定义的是4个字节的ABGR的,所以第3个参数必须是PixelFormat32bppARGB
  23:   BD:= B.LockBits(RC, [ImageLockModeRead, ImageLockModeWrite], PixelFormat32bppARGB);
  24:   try
//实际像素区域.
to BD.Width * BD.Height -1 do
begin
//防止溢出
  29:       P[I].B:= J div 3;
  30:       P[I].G:= P[I].B;
  31:       P[I].R:= P[I].B;
end;
  33:   finally
  34:     B.UnlockBits(BD);
end;
//画出灰度化的图像
end;
  38: {$POINTERMATH OFF}

实验发现在GDIPlus中我们必须用4字节的结构体,Packed Record的3字节的结构体会报错.

今天就只说这么点儿了.byebye各位.


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
DelphiXE6试用Android视频采集发布时间:2022-07-18
下一篇:
Delphi回车键切换焦点发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

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

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

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