Delphi 2006-例程参数非类型化

Delphi 2006-例程参数非类型化,delphi,delphi-2006,Delphi,Delphi 2006,在一个例程中可以有一个参数,它可以同时是一个类型,也可以是一个字符串?我知道我可以通过重载一个例程来实现这一点,我问是否可以用另一种方式来实现 假设我有这个类型-TTest=(t1,t2,t3)。我希望有一个例程,它接受类型为TTest的参数,但同时又是一个字符串,因此我可以将其称为myproc(t1)或myproc('blablabla')您应该使用重载函数 你已经有了这个问题的完美解决方案,没有必要寻找其他方法来解决这个问题。您可以尝试使用一个函数来接收变体,但该函数也会接收任何表示以下内容

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


假设我有这个类型-TTest=(t1,t2,t3)。我希望有一个例程,它接受类型为TTest的参数,但同时又是一个字符串,因此我可以将其称为myproc(t1)或myproc('blablabla')

您应该使用重载函数

你已经有了这个问题的完美解决方案,没有必要寻找其他方法来解决这个问题。您可以尝试使用一个函数来接收
变体
,但该函数也会接收任何表示以下内容也合法的内容:

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

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

您应该使用重载函数

你已经有了这个问题的完美解决方案,没有必要寻找其他方法来解决这个问题。您可以尝试使用一个函数来接收
变体
,但该函数也会接收任何表示以下内容也合法的内容:

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

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

考虑到这是一个很好的练习,基于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.

另外,我知道变体速度很慢,必须只在需要时使用。

考虑到这是一个很好的练习,基于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.

另外,我知道变量的速度很慢,只能在需要时使用。

请参阅文档中的。@sertac如果使用了非类型化参数,函数如何确定实际传递的类型?@David-我不在乎,这不是问题所在。他可以传递另一个参数(ThatsAString:Boolean)@Sertac,这与问题无关。所需的调用签名只有一个参数。@SertacAkyuz-请发布它,以便我可以对您的答案进行投票。请参阅文档中的内容。@sertac如果使用了非类型化的参数,函数将如何确定实际传递的类型?@David-我不在乎,这不是问题。他可以传递另一个参数(ThatsAString:Boolean)@Sertac,这与问题无关。所需的呼叫签名只有一个参数。@SertacAkyuz-请发布它,以便我可以投票表决您的答案。+1您是对的。我只是想做一个小练习,想找到另一种方法来做。我只想做一个小练习,找到另一种方法来做。@DavidHeffernan-它不是100%完美的。这只是一个简单的例子,Sertac的建议是,如果使用非类型化的参数,还可以传递一个参数来标识类型。另外,在我看来,变体的问题不是速度,而是缺少编译时类型检查。有时您需要运行时检查,但在本例中,我认为您需要编译时检查。另外,编写一些代码也做得很好。这提供了一个很好的环境来探索这些选项,并理解其利弊。此时,我需要一个小例子来向同事解释这一点。所以,这是一个又快又脏的:)。我同意你关于编译时类型检查的看法。@DavidHeffernan-它不是100%完美的。这只是一个简单的例子,Sertac的建议是,如果使用非类型化的参数,还可以传递一个参数来标识类型。另外,在我看来,变体的问题不是速度,而是缺少编译时类型检查。有时您需要运行时检查,但在本例中,我认为您需要编译时检查。另外,编写一些代码也做得很好。这提供了一个很好的环境来探索这些选项,并理解其利弊。此时,我需要一个小例子来向同事解释这一点。所以,这是一个又快又脏的:)。我同意你关于编译时类型检查的观点。