delphi指针几个很奇怪的现象

alenwelkin 2004-03-18 04:54:38
1.
对于这样的定义
buffer: array[0..255] of char;

在function中使用

pointer(buffer),会提示非法类型转换

但若使用
zeromemory(buffer, 255)就不会, 而zeromemory的原型是

ZeroMemory(destination: pointer <----!!!!!! ....)

2.对于类定义

TMyClass = class
private
function abc: integer;
public
procedure foo;
end;

procedure foo;
type
TP = function: integer of object;
var
p: TP;
begin
move(p, publicfoo, sizeof(tp));
//publicfoo是一全局变量, 居然可以用这样的方法把类的private部分拷贝出去
end;

这应该是一种不好的做法,delphi对函数指针控制的还比较严格。没有那个of object就无法执行,想听听高手们的意见和相关心得

...全文
22 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjqyb 2004-03-19
  • 打赏
  • 举报
回复
你在试一下.....
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
var i:integer;
procedure showit;
public
{ Public declarations }
end;

pubproc = procedure;


var
Form1: TForm1;
foo: procedure;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
tp = procedure of object;
var
p: tp;
begin
p := showit;
move(p, foo, sizeof(pubproc));//不论是用pubproc还是tp,foo都可以正常显示
foo;
end;

procedure TForm1.showit;
begin
i:=200;
showmessage('abc');
end;
alenwelkin 2004-03-18
  • 打赏
  • 举报
回复
很感谢各位高手的指点,对于第一个问题很抱歉,回家试了试的确不行,可今天在公司里的时候确实是亲眼看见通过的,我总不至于哗众取宠吧,呵呵

明天去公司看看是怎么一回事再说

另外对于第二个问题
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure showit;
public
{ Public declarations }
end;

pubproc = procedure;


var
Form1: TForm1;
foo: procedure;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type
tp = procedure of object;
var
p: tp;
begin
p := showit;
move(p, foo, sizeof(pubproc));//不论是用pubproc还是tp,foo都可以正常显示
foo;
end;

procedure TForm1.showit;
begin
showmessage('abc');
end;
aiirii 2004-03-18
  • 打赏
  • 举报
回复
還有個問題, 你這樣
>>move(p, publicfoo, sizeof(tp));
應該有問題的!不是說會出錯,
zjqyb 2004-03-18
  • 打赏
  • 举报
回复
var buffer: array[0..255] of char;

zeromemory(buffer, 255)可以吗?

zeromemory(@buffer, 255)
没有那个of object就不是对象的方法指针,对象的方法指针当然不能和普通指针混用
TP = function: integer of object;(还隐含了self pointer)
Sizeof(TP)=8
TP = function: integer ;
Sizeof(TP)=4
postren 2004-03-18
  • 打赏
  • 举报
回复
但若使用
zeromemory(buffer, 255)就不会,//怎么可能?? 我这儿无法通过, D6

应该添加@符号才对
procedure TForm1.Button1Click(Sender: TObject);
var
Buffer: array [0..10] of Char;
a: Pointer;
begin
a := Pointer(@Buffer);
ZeroMemory(@Buffer, SizeOf(Buffer));
end;
aiirii 2004-03-18
  • 打赏
  • 举报
回复
平時是這樣操作
p := pointer(@buffer[0]);

2, 你對指針的內存區域進行拷貝,這個誰也阻止不了啊!
而且, 就是將 "这样的方法把类的private部分拷贝出去"
才能保證實例的完整啊
你能不能訪問到, 是另外一回事!

5,388

社区成员

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

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