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;
分享一下,^_^
其实挺简单的,没有什么技术含量。

解决方案 »

  1.   

    貌似只要懂点汇编的人都知道...EAX当中存放的是函数的返回值。
      

  2.   

    其实我觉得要增加的说明不是有没有技术含量,应该是提醒不要模仿。万一在begin后面加那么一行,或者是在mov p,eax前增加某些可能用于eax的,那结果就...
      

  3.   

    没有笑话的意思。只是一个说明。刚才看了一下另外一个贴子。感觉上该贴当中说的问题跟楼主所提到的解决方案有点出入。如果Add是一个函数,那么可以直接使用指针接收返回值,如果是Add是一个过程,那么问题就复杂了。
      

  4.   

    其实类似的贴子本来就没有所谓笑话的说法。前提用错了个词,本意是“提示”打成了“说明”。怎么说呢,象本贴当中的方法,看似一个小技巧,实际有点“孔乙己”说的那个“回”字的写法。直接用P就可以接收Create得到的内容,万没有必要再通过插入一段汇编。因为with的语法并不是最终的二进制码,只是为编译器所使用的。所以完全可以用p接收create的结果再变成with p do 。当然,每个人都不可能从一开始就想得到那么多。要不然“绕弯子”这个词就不会存在了。
      

  5.   

    嗯~学习
    不过为了易读,还是声明一个变量比较好,要是delphi也可以像c/c++那样到处都可以声明,估计就不会有这样的写法了
      

  6.   

    lihuasoft 共享的知识点对于像我这样的菜鸟来说,还是很有意思的!
    由于本人基础太差,所以继续希望lihuasoft发一些汇编的小知识点!
    谢谢啊!
      

  7.   


    僵哥是想表达类似
    P := TOBJ.Create;
    with TOBJ(P) do
    这样的写法。这与
    Btn := TButton.Create(self);
    with Btn do
    实际上没有什么不同。
      

  8.   

    今天挺熱鬧,可惜上午太忙了。  
    其實這個挺好。  不過EAX前面真的要說一下。。不然壓進去了TBUTTON後再執行一個TLABEL,再吐出來TBUTTON就好玩了。
      

  9.   

    呵呵,这样的帖子还是有意思的
    至少说明了来源当楼主第一次提这个问题的时候,我一看到就马上说了个EBP-4
    原于,首先俺没把构造函数当成一个有返回值的函数,其二就是俺把对象当成了变量.
    然而变量在函数中是存在于栈上的,而对象确是存在于堆上的.