2012-05-22 40 views
3

如何檢查函數參數是否未定義?檢查SmartMS中的函數參數是否未定義?

procedure Test(aValue: TObject); 
begin 
    if aValue <> nil then 
    ShowMessage('param filled')  <-- also when Test() is executed! 
    else 
    ShowMessage('no param filled') <-- not called, only when Test(nil) is called 
end; 

然而,當調用此函數在純JS沒有PARAM, 然後安勤=未定義,但<>零檢查被轉換爲== NULL!

例如,當你有一個回調JS函數:

type 
    TObjectProcedure = procedure(aValue: TObject); 

procedure FetchUrlAsync(aUrl: string; aCallback: TObjectProcedure) 
begin 
    asm 
    $().load(@aUrl, @aCallback); 
    end; 
end; 

你可以調用這個函數:

FetchUrlAsync('ajax/test.html', Test); 

人們現在依賴於jQuery的,如果「測試」之稱與一個參數或不。

+0

如果以這種方式聲明Test,則不能調用Test() - 它將不會編譯。你最近想做什麼? – gabr

+1

@gabr:在Smart中你不能調用Test(),這是正確的。但是你可以使用「Test」作爲JS回調函數,並且該函數可以執行這個回調函數而不需要任何參數! –

+0

現在它是有道理的。 – gabr

回答

4

在下一個版本中,您將能夠使用Defined()特殊功能,它將對未定義進行嚴格檢查(對於空值,它將返回true)。

if Defined(aValue) then 
    ... 

在當前版本中,可以定義一個函數來檢查

function IsDefined(aValue : TObject); 
begin 
    asm 
     @result = (@aValue!==undefined); 
    end; 
end; 
+0

傳遞TObject以定義結果語法錯誤「字符串預期」。 – gabr

+0

添加關於它應該出現在版本中的說明! –

0

在當前版本(1.0)可以用函數varIsValidRef(),以檢查是否一個值是未定義的。該函數是w3system.pas的一部分,所以它始終存在。它看起來像這樣:

function varIsValidRef(const aRef:Variant):Boolean; 
begin 
    asm 
    if (@aRef == null) return false; 
    if (@aRef == undefined) return false; 
    return true; 
    end; 
end; 

此檢查null和不確定的,所以你可以使用它針對的對象引用(類型THandle是變體),以及。

相關問題