2013-07-31 58 views
2

某些函數需要一個變量來發送一個值。但有時候我不需要這個值,也不想定義一個變量來使用它作爲函數out參數。就像這樣:旁路函數「out」參數

procedure test(out SomeVar: string); 
begin 
    //... 
end; 

我想安全地執行這樣的:

test; 

回答

5

您可以創建一個包裝:

procedure test(); overload; 
var 
    SomeVar : string; 
begin 
    test(SomeVar); 
end; 

注意:您還必須標註其他版本overload,或者你可以打電話給你的包裝test以外的東西,並刪除overload

另一種選擇:(你單位的頂部,也許)某處聲明一個虛擬變量:

var 
    DummyStr : string; 

那麼你沒有你想調用的函數每次來聲明一個新的變量。

test(DummyStr); 
+0

這是唯一的辦法? IDK可以使用'nil'或其他東西而不是變量嗎? – SAMPro

+0

不怕。如果某個過程指定了輸出參數,則必須提供該參數。 – Blorgbeard

+0

添加了另一個選項.. – Blorgbeard

2

使用指針:

procedure test(SomeVar: PString = nil); 
begin 
    if SomeVal <> nil then SomeVar^ := ''; 
    //... 
    if SomeVal <> nil then SomeVar^ := ...; 
end; 

test; 

var 
    s: string; 

test(@s); 
+0

有一些系統函數具有'out'參數,我正在尋找它們的解決方案。我認爲一個包裝(@Blorgbeard)是唯一的解決方案(如果我不想使用全局變量)。謝謝 – SAMPro

3

可以重載的過程:

procedure test(out SomeVar: string); overload; 
begin 
    //... 
end; 

procedure test; overload; inline; 
var dummy: string; 
begin 
    test(dummy); 
end; 

請注意inline關鍵字,自Delphi 2005 AFAIR起可用。

我最常做的就是用的,而不是out參數指針:

procedure test(SomeVarP: PString=nil); 
begin 
    if SomeVarP<>nil then 
    SomeVarP^ := .... 
end; 

因此,你可以使用:

var s: string; 

test; 
test(@s); 
+0

我認爲它是在2006年推出的,而不是在2005年推出的 – OnTheFly