我可以使用类型

时间:2019-01-19 15:41:30

标签: delphi

我有一个程序,可以使用五个DLL的任意组合来完成某些工作。所有DLL具有相同的接口,相同的导出函数和过程,只是它们的实际作用不同。

为了简化操作,我想只定义一次函数,然后在任何东西之间共享定义单元。那么问题就是要定义给定类型的函数。

想象:

type
  TMyFunc = function(inP : Integer): outP : Boolean;

我现在可以定义一个名为doit的函数,并强制其定义为TMyFunc类型,而无需重新定义所有内容吗?

我不能只输入:

function doit: TMyFunc;

有什么办法吗?

这确实会使定义一切变得更容易,更安全等。

现在,所有内容都定义了多次,并且一次更改了必要的接口意味着我需要记住到处去重复更改(重复是不好的)。如果我只能在一个地方进行声明,那么如果我忘记进行更改,则编译会失败,那就太好了。

2 个答案:

答案 0 :(得分:1)

  

有什么办法吗?

答案很简单,不,您不能这样做。声明函数时,必须包括其完整的参数列表,返回类型等。

答案 1 :(得分:0)

这是错误的:

type
  TMyFunc = function(inP : Integer): outP : Boolean;

一个函数不能有两种返回类型(outP和Boolean)!

INSTEAD:

type
    outP = Longint; // or whatever you want outP to be.

    TMyFunc1 = function (inP : Integer): outP;
    TMyFunc2 = function (inP : Integer): Boolean;

现在,您可以定义一个名为doit1的函数变量,并强制其定义为TMyFunc1类型。同样:doit2的类型为TMyFunc2。

var
    doit1 : TMyFunc1;
    doit2 : TMyFunc2;

如果您具有功能:

const
    DllName1 = 'MyFirstDLL.DLL';
    DllName2 = 'MySecondDLL.DLL';

function TestFunc1(inP : Integer): outP; external DllName1;

function TestFunc2(inP : Integer): Boolean; external DllName2;

然后您可以将这些功能分配给占位符doit1,doit2:

procedure AssignPlaceholders;
begin
    doit1 := TestFunc1;
    doit2 := TestFunc2;
end;

注意:您必须声明占位符类型(TMyFunc1,TMyFunc2)与真实函数完全相同,包括诸如stdcall,cdecl等说明符。

在调用AssignPlaceholders之后,您可以像其他任何函数一样调用doit1和/或doit2。