2014-02-05 115 views
2

因此,我已经开始使用SMS进行游戏,并且试图让一个程序(标签和按钮)通过发布请求打开网站并显示结果。如何使用TW3HttpRequest发送POST数据

我没有问题提示/警告/错误,一切看起来不错。以下代码是对现有示例的修改。

procedure TForm1.ExecuteCmd; 
var 
    whttp : TW3HttpRequest; 
    wParams : string; 
begin 
    wHttp := TW3HttpRequest.Create; 
    try 

    whttp.OnDataReady := lambda (Sender) 
     if (w3Label1.caption = '') then 
     w3Label1.caption := wHttp.ResponseText; 
    end; 

    whttp.OnReadyStateChange := lambda (Sender) 
     if (wHttp.ReadyState = 4) and (wHttp.Status = 200) then 
     begin 
     if (w3Label1.caption = '') then 
      w3Label1.caption := wHttp.ResponseText; 
     end; 
    end; 

    wParams := 'cmd=TestID1'; 
    whttp.open('POST','http://www.server1.com/executecmd.php'); 
    whttp.RequestHeaders['Content-type'] := 'application/x-www-form-urlencoded'; 
    whttp.Send(wParams); 
    finally 
    wHttp.free; 
    end; 
end; 

procedure TForm1.W3Button1Click(Sender: TObject); 
begin 
    ExecuteCmd; 
end; 

问题是这样的,当我真正按一下按钮我收到以下错误信息: 遗漏的类型错误:无法读取空的特性“readyState的” [行#6277]

,误差值在自动生成的代码,似乎与我写的具体没有关系。如果我从我的代码中删除对ReadyState的所有引用,我仍然会收到错误消息。

我错过了什么?我觉得它与Lambda函数有关。

回答

1

你的问题是,你期望whttp.Send阻止。因为它的JavaScript等效,它是异步的。在POST甚至可以执行之前,whttp对象被释放(在finally块中)。当调用回调函数(OnReadyStateChanged)时,whttp已被释放(现在为空),然后尝试在该释放的(空)对象上调用ReadyState

的另一个原因是困惑是,在Delphi object.Free的Windows/OS X销毁的对象,而在智能它只设置object参考nil和叶破坏,JavaScript的垃圾回收。这就是为什么whttpFree之后仍然活着,以及为什么要调用OnReadyStateChanged

这工作得很好:

uses 
    W3System, W3Graphics, W3Components, W3Forms, W3Fonts, W3Borders, W3Application, 
    W3Button, W3Inet, W3Memo; 

type 
    TForm1=class(TW3form) 
    procedure W3Button1Click(Sender: TObject); 
    private 
    {$I 'Form1:intf'} 
    whttp: TW3HttpRequest; 
    protected 
    procedure InitializeForm; override; 
    procedure InitializeObject; override; 
    procedure Resize; override; 
    end; 

implementation 

{ TForm1} 

procedure TForm1.W3Button1Click(Sender: TObject); 
var 
    wParams: string; 
begin 
    whttp := TW3HttpRequest.Create; 

    whttp.OnReadyStateChange := lambda (Sender) 
    if (whttp.ReadyState = 4) and (wHttp.Status = 200) then 
    begin 
     W3Memo1.Text := wHttp.ResponseText; 
     whttp.OnReadyStateChange := nil; 
     whttp := nil; 
    end; 
    end; 

    wParams := 'cmd=TestID1'; 
    whttp.open('POST','http://httpbin.org/post'); 
    whttp.RequestHeaders['Content-type'] := 'application/x-www-form-urlencoded'; 
    whttp.Send(wParams); 
end; 
+0

感谢贾布尔这正是问题了。通过取出'whttp.free;'解决了这个问题。一旦你解释了它,JavaScript是一种垃圾收集语言,它总是有意义的。我想如果我要尝试使用短信,我将不得不改变我对这些类型的事情的想法。 –

相关问题