Delphi 2006 - 常规参数无类型

时间:2012-04-27 11:55:40

标签: delphi delphi-2006

在例程中可以有一个参数,它可以同时是一个类型,也可以是一个字符串?我知道我可以通过重载例程来实现这一点,我想是否有可能以另一种方式完成它。

假设我有这种类型 - TTest =(t1,t2,t3)。我希望有一个例程接受TTest类型的参数,但同时也是一个String,所以我可以称之为myproc(t1)或myproc('blabla')

2 个答案:

答案 0 :(得分:5)

您应该使用重载功能。

您已经拥有完美的问题解决方案,无需寻找其他方法。您可以尝试使用接收Variant的单个函数,但该函数也会收到任何意味着以下内容也是合法的:

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

使用重载可以保持编译时类型的安全性,并且在使用过载时绝对不会失去一般性。

答案 1 :(得分:0)

即使这可以通过重载功能轻松实现,考虑到它是一个很好的练习,基于David Hefferman和Sertac 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.

我也知道Variants很慢,必须只使用它。