2012-04-27 91 views
0

在例程中可以有一個參數,它可以是一個類型,也可以是一個字符串?我知道我可以通過重載一個例程來實現這一點,我問是否有可能以另一種方式做到這一點。Delphi 2006 - 常規參數無類型

假設我有這種類型 - TTest =(t1,t2,t3)。我想要一個接受TTest類型參數的例程,但同時它是一個字符串,所以我可以稱之爲myproc(t1)或myproc('blabla')

+1

請參閱文檔中的[「untyped parameters」](http://docwiki.embarcadero.com/RADStudio/XE/en/Parameters_%28Delphi%29#Untyped_Parameters)。 – 2012-04-27 12:18:33

+0

@sertac如果使用了非類型化參數,函數將如何確定實際傳遞的類型? – 2012-04-27 12:21:27

+1

@大衛 - 我不在乎,那不是問題。他可以傳遞另一個參數(ThatsAString:Boolean).. – 2012-04-27 12:25:06

回答

0

即使這可以很容易地完成重載功能,考慮到這是一個很好的鍛鍊,基於大衛Hefferman和塞爾特克Akyuz答案我做了一個小例子來測試這兩個解決方案。它不完美,它只顯示兩種可能性。

unit Unit4; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 

type 
    ttest = (t1,t2); 
    TForm4 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    function my(aVar:Variant):String; 
    function MyUntype(const aVar):String; 
    end; 

var 
    Form4: TForm4; 

implementation 

{$R *.dfm} 

{ TForm4 } 

procedure TForm4.FormCreate(Sender: TObject); 
var aTestTypeVar : ttest; 
    aString : String; 
begin 
my(t1); 
my(t2); 
my('ssss'); 
//with untyped params 
aString := 'aaaa'; 
MyUntype(aString); 
aTestTypeVar := t1; 
aString := IntToStr(Ord(aTestTypeVar)); 
MyUntype(aString);//can not be a numeral due to delphi Help 
end; 

function TForm4.my(aVar: Variant): String; 
begin 
showmessage(VarToStr(aVar));//shows either the string, either position in type 
end; 

function TForm4.MyUntype(const aVar): String; 
begin 
//need to cast the parameter 
try 
    ShowMessage(pchar(aVar)) 
except 
    showmessage(IntToStr(Ord(ttest(aVar)))); 
end; 
end; 

end. 

另外我知道,變體是緩慢的,必須使用只需要。

+0

'MyUntype'不能保證能正常工作。 – 2012-04-27 12:57:20

+0

@DavidHeffernan - 它不是100%完美。這只是一個簡單的例子。 – RBA 2012-04-27 12:58:15

+0

Sertac的建議是,如果使用非類型化參數,您還傳遞一個參數來確定類型。另外,在我看來,變體的問題並不是速度,而是缺少編譯時類型檢查。有時你想運行時檢查,但在這種情況下,我認爲你需要編譯時檢查。此外,寫出一些代碼做得很好。這爲探索選項和理解利弊提供了很好的背景。 – 2012-04-27 13:03:30

5

您應該使用重載函數。

您已經有了完美的解決方案,並且不需要尋找其他方法來完成此操作。您可以嘗試與接收Variant單一的功能,但隨後該功能也將得到了什麼,這意味着下面也將是合法的:

myproc(0.5); 
myproc(intf); 
myproc(-666); 

使用過載可以讓你保持編譯時類型安全和有絕對不會損失使用過載的一般性。

+0

+1你是對的。我只想做一個小小的練習,找到另一種方法去做。 – RBA 2012-04-27 12:54:07

相關問題