Delphi中函数指针的使用

delphi中的函数指针如何定义和使用
var
  p:Pointer;
begin
  p:=@函数名称
end;

调用时
p(参数表);

就行了

{-----------------------------Delphi中函数指针的使用-----------------------------}

 

Delphi中可以通过函数指针把一个函数作为参数来传递,然后在另外一个函数中调用。

1) 首先,申明函数指针类型TFunctionParameter
    type
          TFunctionParameter = function(const value : integer) : string; //函数指针

2) 定义准备被作为参数传递的函数
    function One(const value : integer) : string;                            //函数-实例1
    begin
      result := IntToStr(value) ;
    end;

    function Two(const value : integer) : string;                            //函数-实例2
    begin
      result := IntToStr(2 * value) ;
    end;
     
3) 定义将要使用动态函数指针参数的函数
    function DynamicFunction(f : TFunctionParameter; const value : integer) : string;
    begin
      result := f(value) ;
    end;

4) 上面这个动态函数的使用实例
    var
      s : string;
    begin
      s := DynamicFunction(One,2006) ;
      ShowMessage(s) ; //will display "2006"

      s := DynamicFunction(Two,2006) ;
      ShowMessage(s) ; // will display "4012"
    end;


<====================================================================================================>
指向非对象(一般的)函数/过程的函数指针

 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针。函数指针的声明只需要参数列表;如果是函数,再加个返回值。例如声明一个过程类型,该类型带一个通过引用传递的整型参数:

type
  IntProc = procedure (var Num: Integer);

这个过程类型与任何参数完全相同的例程兼容,即用它声明的变量,可以指向任何此类函数,并通过其进行函数的调用。下面是一个兼容例程:

procedure DoubleTheValue (var Value: Integer);
begin
Value := Value * 2;
end;

函数指针能用于两种不同的目的:声明函数指针类型的变量;或者把函数指针作为参数传递给另一例程。利用上面给定的类型和过程声明,你可以写出下面的代码:

var
  IP: IntProc;
  X: Integer;
begin
  IP := DoubleTheValue;
  X := 5;
  IP (X);
end;

虽然这种调用方法比直接调用麻烦了,那么我们为什么要用这种方式呢?

(1)因为在某些情况下,调用什么样的函数需要在实际中(运行时)决定,你可以根据条件来判断,实现用同一个表达,调用不同的函数,很是灵活.

(2)利用函数指针我们可以实现委托,委托在.NEt中被发挥的淋漓尽致,但Delphi同样能实现

(3)实现回调机制

函数指针很有用啊,是高级程序员的必修。

例子

   1. {********************************************************
   2.   函数指针(指向一般函数和过程)
   3. UnitOwner:coco.zhang                          
   4.   Last Modified:2008-10-5  
   5. *********************************************************}
   6. unit DelegateUnit;
   7. interface
   8.      procedure Func1;
   9.      {定义两个函数型构相同但功能不同的函数}
  10.      function    FuncAdd(VarA , VarB : Integer):Integer;
  11.      function    FuncSub(VarA , VarB : Integer):Integer;
  12. type
  13.      DelegateFunc1 = procedure;
  14.      DelegateFuncCalc = function(VarA , VarB : Integer):Integer;
  15. var
  16.    I : Integer;
  17. implementation
  18.
  19.    procedure Func1;
  20.    begin
  21.        Writeln('Func1 was called!');
  22.    end;
  23.    function    FuncAdd(VarA , VarB : Integer):Integer;
  24.    begin
  25.         Result := VarA + VarB;
  26.    end;
  27.     function    FuncSub(VarA , VarB : Integer):Integer;
  28.    begin
  29.         Result := VarA - VarB;
  30.    end;
  31.    end.

客户端调用

   1. program Delegate;
   2. {$APPTYPE CONSOLE}
   3. uses
   4.   DelegateUnit;
   5. var
   6.    ADelegateFunc1 : DelegateFunc1;
   7.    ADelegateFuncCalc : DelegateFuncCalc;
   8. begin
   9.     {通过函数指针调用过程}
  10.     ADelegateFunc1  := Func1;
  11.     ADelegateFunc1 ;
  12.     {通过同种方式调用不同函数}
  13.     ADelegateFuncCalc  := FuncAdd;
  14.     Writeln(ADelegateFuncCalc(3,5));
  15.     ADelegateFuncCalc  := FuncSub;
  16.     Writeln(ADelegateFuncCalc(3,5));
  17. end.

运行结果
D:/Projects/Delphi7/src/GofProjects/Delegate>Delegate
Func1 was called!
8
-2

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Delphi使用libmysql动态库,可以通过以下几个步骤来实现: 1. 下载和安装libmysql动态库文件。可以在MySQL官方网站上下载或者通过MySQL安装程序来获取。 2. 在Delphi项目创建一个新的单元文件,在其声明libmysql动态库的函数和变量。例如,可以声明一个MySQL连接对象的类型和相关的函数,如mysql_init、mysql_real_connect等。 3. 在Delphi使用{$EXTERNALSYM}指令将每个函数的名称与libmysql动态库函数名称关联起来。这样编译器就知道在哪里找到正确的函数。 4. 使用LoadLibrary函数加载libmysql动态库文件。可以在程序的启动时调用LoadLibrary函数,或者在需要使用libmysql函数之前调用。 5. 使用GetProcAddress函数获取每个函数的地址。可以根据函数名称和libmysql动态库的句柄,使用GetProcAddress函数来获取具体函数的地址。 6. 通过函数地址调用libmysql动态库的函数使用函数地址可以直接调用libmysql动态库定义的函数,如mysql_init函数可以使用指向该函数的地址来进行调用。 7. 在程序结束时,通过FreeLibrary函数卸载libmysql动态库。确保在程序不再需要使用libmysql动态库函数时,调用FreeLibrary函数来释放相关的资源。 使用libmysql动态库可以方便地在Delphi对MySQL数据库进行操作。通过加载动态库、获取函数地址以及调用函数,可以实现对MySQL的连接、查询、插入等操作。这样可以提高开发效率,简化数据库操作的流程。同时,还可以利用MySQL提供的丰富功能,使得Delphi项目的数据库操作更加灵活和高效。 ### 回答2: 在Delphi使用libmysql动态库可以实现与MySQL数据库的连接和操作。以下是使用libmysql动态库的步骤: 1. 下载并安装MySQL Connector/C++:在MySQL官网上下载适用于你的操作系统的MySQL Connector/C++,并按照安装向导进行安装。 2. 在Delphi配置libmysql动态库:打开Delphi的项目,点击“项目”菜单,选择“选项”选项。在“目录和条件”的“库”选项卡,添加libmysql动态库文件的路径,例如在Windows是添加libmysql.dll的路径。 3. 在Delphi项目导入libmysql动态库:在项目的uses部分添加mySQL包含单元的引用,例如在Delphi XE版本使用“uses MySQL;”来导入。 4. 创建MySQL连接:使用TMySQLConnection组件创建与MySQL数据库的连接。设置TMySQLConnection的属性,包括服务器地址、用户名、密码等连接信息。 5. 连接MySQL数据库:调用TMySQLConnection的Connect方法来连接MySQL数据库。如果连接成功,则可以进行后续的数据库操作。 6. 执行MySQL查询:使用TMySQLQuery组件来执行MySQL查询语句。将查询语句赋值给TMySQLQuery的SQL属性,并调用Execute方法来执行该查询。 7. 处理MySQL查询结果:使用TMySQLQuery的方法和属性来处理查询结果。可以使用Fields属性来访问查询结果的字段,使用Next方法来逐行遍历查询结果。 8. 关闭连接和释放资源:在完成数据库操作后,调用TMySQLConnection的Disconnect方法来关闭与MySQL数据库的连接,并释放相关资源。 通过以上步骤,可以在Delphi成功使用libmysql动态库来连接和操作MySQL数据库。 ### 回答3: 在Delphi使用libmysql动态库,我们需要进行以下几个步骤: 1. 首先,我们需要将libmysql.dll文件拷贝到Delphi的工作目录。或者您也可以将其拷贝到Windows系统目录下,这样可以让所有的应用程序都能够访问到该动态库。 2. 在Delphi,我们需要使用SysUtils单元来引入LoadLibrary函数。通过该函数,我们可以在运行时加载libmysql.dll动态库。加载库时,我们需要获取库的句柄(Handle)。 3. 使用GetProcAddress函数,我们可以获取libmysql.dll每个函数的地址。通过将这些函数地址赋值给相应的函数指针,我们可以在Delphi使用这些函数。 4. 接下来,我们需要使用MySQL的函数库来连接数据库、执行查询等操作。在Delphi,可以使用TSQLConnection组件来建立与MySQL数据库的连接。需要在项目添加dbExpress单元,并在设计时设置连接数据库的参数,比如服务器地址、用户名、密码等。 5. 在代码,我们可以使用TSQLQuery组件来执行SQL查询语句,然后通过遍历查询结果集来获取数据。同时,如果需要执行更新或插入操作,可以使用TSQLQuery组件的ExecSQL方法。 总的来说,通过加载libmysql动态库和使用dbExpress组件,我们可以在Delphi方便地使用MySQL数据库。但是需要注意的是,在使用过程需要正确配置和处理数据库连接,以及正确释放资源,以避免内存泄漏或其他问题的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值