[分享] Delphi指针如何指向使用with开域语句创建的无名组件对象

lihuasoft 2008-12-16 10:15:49

procedure TForm1.Button1Click(Sender: TObject);
var
P: Pointer;
begin
P := nil;{洗得干干净净一尘不染}
with TButton.Create(Self) do begin
asm
mov P, eax
end;
TButton(P).Caption := 'All Right!';
Parent := Self;{以下是开域语句的常见用法了}
Left := 100;
Top := 100;
Width := 100;
Height := 30;
Show;
end;
end;


分享一下,^_^
其实挺简单的,没有什么技术含量。
...全文
225 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
不得闲 2008-12-17
  • 打赏
  • 举报
回复
呵呵,这样的帖子还是有意思的
至少说明了来源

当楼主第一次提这个问题的时候,我一看到就马上说了个EBP-4
原于,首先俺没把构造函数当成一个有返回值的函数,其二就是俺把对象当成了变量.
然而变量在函数中是存在于栈上的,而对象确是存在于堆上的.
日总是我哥 2008-12-16
  • 打赏
  • 举报
回复
嗯~学习


不过为了易读,还是声明一个变量比较好,要是delphi也可以像c/c++那样到处都可以声明,估计就不会有这样的写法了
僵哥 2008-12-16
  • 打赏
  • 举报
回复
其实类似的贴子本来就没有所谓笑话的说法。前提用错了个词,本意是“提示”打成了“说明”。

怎么说呢,象本贴当中的方法,看似一个小技巧,实际有点“孔乙己”说的那个“回”字的写法。直接用P就可以接收Create得到的内容,万没有必要再通过插入一段汇编。因为with的语法并不是最终的二进制码,只是为编译器所使用的。所以完全可以用p接收create的结果再变成with p do 。当然,每个人都不可能从一开始就想得到那么多。要不然“绕弯子”这个词就不会存在了。
lihuasoft 2008-12-16
  • 打赏
  • 举报
回复
承上。就因这个,所以俺没有在原贴贸然回答啊....于是在这里新开了一个贴子

:)
lihuasoft 2008-12-16
  • 打赏
  • 举报
回复
哦,不好意思哈僵哥

嗯,问题来源的那个贴子,我看不懂贴主用的数据类型(以及类型的方法),所以就写了“参考”两个字。
僵哥 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lihuasoft 的回复:]
嘿嘿,僵哥真逗,8楼可不就是在笑话“挺简单的,没有什么技术含量”嘛
10楼又转向另外的意思了
[/Quote]
没有笑话的意思。只是一个说明。刚才看了一下另外一个贴子。感觉上该贴当中说的问题跟楼主所提到的解决方案有点出入。如果Add是一个函数,那么可以直接使用指针接收返回值,如果是Add是一个过程,那么问题就复杂了。
lihuasoft 2008-12-16
  • 打赏
  • 举报
回复
嘿嘿,僵哥真逗,8楼可不就是在笑话“挺简单的,没有什么技术含量”嘛
10楼又转向另外的意思了
僵哥 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lihuasoft 的回复:]
哈哈
僵哥就不要笑话在下喽...

特意在主贴说了:“其实挺简单的,没有什么技术含量。”

^_^
[/Quote]
其实我觉得要增加的说明不是有没有技术含量,应该是提醒不要模仿。万一在begin后面加那么一行,或者是在mov p,eax前增加某些可能用于eax的,那结果就...
lihuasoft 2008-12-16
  • 打赏
  • 举报
回复
哈哈
僵哥就不要笑话在下喽...

特意在主贴说了:“其实挺简单的,没有什么技术含量。”

^_^
僵哥 2008-12-16
  • 打赏
  • 举报
回复
貌似只要懂点汇编的人都知道...EAX当中存放的是函数的返回值。
budded 2008-12-16
  • 打赏
  • 举报
回复
强!
lg19850320 2008-12-16
  • 打赏
  • 举报
回复
长知识。
gwhdaxia 2008-12-16
  • 打赏
  • 举报
回复
确实是好东西
aniugee 2008-12-16
  • 打赏
  • 举报
回复
有意思
panrongzeng 2008-12-16
  • 打赏
  • 举报
回复
学习提高
genispan 2008-12-16
  • 打赏
  • 举报
回复
学习
liangpei2008 2008-12-16
  • 打赏
  • 举报
回复
这样的贴子一定要顶
学习
starluck 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 lihuasoft 的帖子:]
Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject);
var
P: Pointer;
begin
P := nil;{洗得干干净净一尘不染}
with TButton.Create(Self) do begin
asm
mov P, eax
end;
TButton(P).Caption := 'All Right!';
Parent := Self;{以下是开域语句的常见用法了}
Left := 100;
Top := 100;
Width := 100;
Height := 30;
Show;
end;
end;



[/Quote]


今天挺熱鬧,可惜上午太忙了。
其實這個挺好。 不過EAX前面真的要說一下。。

不然壓進去了TBUTTON後再執行一個TLABEL,再吐出來TBUTTON就好玩了。。。。
lihuasoft 2008-12-16
  • 打赏
  • 举报
回复
结。小把戏,戳穿了就没什么意思了

^_^
lihuasoft 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 unsigned 的回复:]
其实类似的贴子本来就没有所谓笑话的说法。前提用错了个词,本意是“提示”打成了“说明”。

直接用P就可以接收Create得到的内容,万没有必要再通过插入一段汇编。因为with的语法并不是最终的二进制码,只是为编译器所使用的。所以完全可以用p接收create的结果再变成with p do 。
[/Quote]

僵哥是想表达类似
P := TOBJ.Create;
with TOBJ(P) do
这样的写法。

这与
Btn := TButton.Create(self);
with Btn do
实际上没有什么不同。
加载更多回复(2)

5,402

社区成员

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

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