2014-02-05 2 views
2

SMS로 게임을 시작했으며 게시 요청이있는 웹 사이트를 방문하고 결과를 표시하는 프로그램 (레이블 및 버튼)을 만들려고했습니다.TW3HttpRequest를 사용하여 POST 데이터를 보내려면 어떻게해야합니까?

힌트/경고/오류에는 아무런 문제가 없으며 모든 것이 나에게 잘 어울립니다. 다음 코드는 기존의 몇 가지 예제를 다시한데 모은 것입니다. catch되지 않은 형식 오류 : [라인 # 6277] 널 (null)의 특성 'readyState의'를 읽을 수 없습니다

오류가있는

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에 대한 모든 참조를 코드에서 제거한 후에도 오류가 발생합니다.

무엇이 누락 되었습니까? 나는 그것이 Lambda 함수와 관련이 있다고 느낍니다.

답변

1

whttp.Send이 (가) 차단 될 것으로 예상됩니다. Send은 JavaScript와 동일한 비동기입니다. POST이 실행되기 전에 whttp 개체가 해제됩니다 (finally 블록에 있음). 콜백 (OnReadyStateChanged)이 호출되면 whttp은 이미 해제되었으므로 이제 null입니다. 그러면 해제 된 (null) 개체에 ReadyState을 호출하려고합니다.

혼란에 대한 또 다른 이유는 스마트에 단지 nilobject 참조를 설정하고 자바 스크립트의 가비지 컬렉션에 파괴를 유지하는 동안 오브젝트를 파괴 윈도우/OS의 X에 대한 델파이 object.Free 것입니다. 그렇기 때문에 Free 다음에 whttp이 아직 살아 있고 왜 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

감사 gabr은. 'whttp.free;를 꺼내서 문제를 해결했습니다. 설명을 마치면 자바 스크립트는 쓰레기 수거 언어이므로 총체적으로 이해할 수 있습니다. 나는 SMS를 사용하려고 시도한다면 이런 유형의 사고에 대한 생각을 바꾸어야한다고 생각합니다. –

관련 문제