• volcanol的工控博客


      这里主要讨论Delphi中函数、方法的相关内容。 

    一、工程文件

    {       Delphi语法方法和函数
    1、方法
    2、函数
    }
    
    program Routine;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils,
      Unit1 in 'Unit1.pas';
    
    {   方法
    1、在工程文件中定义方法不需要在接口声明
    }
    procedure foo();
    begin
        WriteLn('这是在工程文件中定义的方法');
    end;
    
    var
        nVar1:integer;
        nVar2:integer;
        varString:string;
    
    begin
        //调用工程文件中的方法
        foo();
    
        //调用单元文件unit1中的方法
        //writeCurrentDir();
    
        forwardKey_2();
    
        {  传地址方法调用
        1、swapInteger() 交换函数
        2、调用IntToStr() 方法将整型转换为字符串类型
        }
        nVar1 := 10;
        nVar2 := 20;
        varString := 'Before swap nVar1 =' + IntToStr(nVar1) +' ;nVar2 =' +
                     IntToStr(nVar2);
        WriteLn(varString);
        //调用的时候,参数列表中的参数用 逗号分隔
        swapInteger(nVar1,nVar2);
        varString := 'After swap nVar1 =' + IntToStr(nVar1) +' ;nVar2 =' +
                     IntToStr(nVar2);
        WriteLn(varString);
    
        //演示传值参数的调用情况
        varString := 'In the call function the value of nVar1 = ' + IntToStr(nVar1);
        WriteLn('Befor call valueProcedure');
        WriteLn(varString);
        valueProcedure(nVar1);
    
        varString := 'In the call function the value of nVar1 = ' + IntToStr(nVar1);
        WriteLn('After call valueProcedure');
        WriteLn(varString);
    
        //演示常量参数的调用情况
        constProcedure(100);
    
        //演示输出参数的调用情况
        WriteLn('Before call outProcedure(), nVar2 = ' + IntToStr(nVar2));
        outProcedure(1000,nVar2);
        WriteLn('After call outProcedure(), nVar2 = ' + IntToStr(nVar2));
    
    
        ReadLn;
    end.

    二、单元文件 unit1

    {       方法和函数
    1、方法
    2、函数
    }
    
    unit Unit1;
    
    interface
    
    uses
        Windows,    //Win32 API
        SysUtils;   //Delphi系统功能
    
    
    {           方法
    1、在单元文件中,必须如果要被其他文件引用,则方法必须在接口部分声明原型
    2、定义方法的关键字是procedure
    }
    procedure writeCurrentDir();
    
    (*       其他关键字
    1、external用于引用其他编译单元的函数或方法,例如引用DLL、其他obj文件的函数
    2、如果要引用其他obj文件的函数或方法,则需要使用引用其他obj文件,通过编译开关
      {$L BLOCK.obj}
    3forward关键字可以用来声明方法或者函数, 和C语言一样方法或者函数必须先定义
       后才能使用,而有时候可能需要推迟一下定义函数或方法,这时就可以利用forward
       关键字先声明函数或方法,有点像C语言中先声明函数的原型。
    *)
    {
        下面的函数演示forward的用法
    }
    procedure forwardKey_2();
    
    {       方法或者函数的参数传递方式
    1、按地址传递, 在定义参数的时候使用关键字 var
    2、按值传递,不用其他关键字,默认的传递方式
    3、按常量方式传递, 利用关键字 const 定义形式参数
    4、按输出方式传递, 利用关键字 out 来定义形参
    5、参数列表的分隔符是分号 ;  注意这个与C语言的区别
    }
    {   演示按地址传递方式的方法
    1、利用关键字 var 定义形式参数
    2、交换两个变量的值, 经典函数swap
    3、要注意与传递指针的区别
    }
    procedure swapInteger(var nVar1:integer;var nVar2:integer);
    
    //procedure swapIntegerByPointer();
    
    {       传值方式
    1、传值方式为默认的传递方式
    }
    procedure valueProcedure(nVar:integer);
    
    {       常量方式传递参数
    1、这个函数演示按常量方式传递参数
    }
    procedure constProcedure(const nVar:integer);
    
    
    {       输出参数
    1、在Delphi中默认的是方法不能返回值到调用函数,函数可以返回值到调用函数
    2、函数通过函数名返回值,或者通过缺省的result变量返回值。
    3、还有一种方式可以返回值,就是定义输出参数
    4、输出参数用 out 关键字定义
    5、注意输出参数和传地址、指针变量的区别
    }
    procedure outProcedure(nVar1:integer;out nVar2:integer);
    
    
    implementation
    
    procedure writeCurrentDir();
    //在过程中定义,过程作用域的局部变量
    var
        strPath:WideString;
        currentPath:ansistring;
        nPathLen:integer;
    begin
        //要使用字符串必须先初始化,如果没有初始化的话就必须先申请内存
        SetLength(strPath,255);
        WriteLn(strPath);
    
        //申请内存后,输出全为 ????, 因此利用函数进行清零
        FillMemory(@strPath,255,0);
    
        //获取当前工作路径, 调用Win32 API
        GetCurrentDirectory(255,PWideChar(strPath));
        currentPath:=strPath;
        WriteLn(currentPath);
    
        {   命令行参数
        1、Delphi程序也能获取命令行参数
        2、通过 SysUtils 单元中的 ParamStr() 函数获取命令行参数
        3、命令行参数编号从 0 开始, ParamStr()获取传递给应用程序的第一个参数
        }
        //通过调用Delphi提供的函数获取当前路径,带目录分隔符 
        currentPath := ExtractFilePath(ParamStr(0));
        WriteLn(currentPath);
    
        //不带目录分隔符 
        currentPath := ExTractFileDir(ParamStr(0));
        WriteLn(currentPath);
    end;
    
    {   forward关键字的使用
    1、如下所示,如果不用关键字 forward 就会编译出错
    2、这里表示 forwardKey_1() 先声明原型然后再定义
    3、如果将下面一行声明全注释,则在 forwardKey_2()中会提示  forwardKey_1()
       没有定义
    }
    procedure forwardKey_1();forward;
    
    procedure forwardKey_2();
    begin
        WriteLn('Call forwardKey_1() by used forward keyword.');
        forwardKey_1();
    end;
    
    procedure forwardKey_1();
    begin
        WriteLn('This is forwardKey_1().');
    end;
    
    {       传地址方式例子
    1、swap 函数
    }
    procedure swapInteger(var nVar1:integer;var nVar2:integer);
    var
        nVar:integer;
    begin
        nVar := nVar1;
        nVar1 := nVar2;
        nVar2 := nVar1;
    end;
    
    {       传值方式的例子
    1、直接输出参数
    }
    procedure valueProcedure(nVar:integer);
    var
        str:string;
    begin
        str:='Before change in function valueProcedure nVar= ' + IntToStr(nVar);
        WriteLn(str);
    
        nVar := 100;
        str := 'After change in function valueProcedure nVar= ' +IntToStr(nVar);
        WriteLn(str);
    end;
    
    {       常量方式的参数
    1、用于保护不让在函数里面改变传递给实际参数的值
    2、这里有一点与C语言里面类似,就是指针的指向和指针指向变量的值的关系,需要注意
    }
    procedure constProcedure(const nVar:integer);
    var
        nVar1:integer;
    begin
        //因为形式参数 nVar 定义为 const,所以下面的语句编译不能成功
        //nVar:=300;
    
        //可以访问变量。
        nVar1:= nVar;
        WriteLn('nVar1 = ' + IntToStr(nVar1));
    end;
    
    
    {       输出参数
    1、输出参数的定义用关键字 out 实现
    2、如果接触过西门子PLC的话,就会很容易理解输出参数的用法
    }
    procedure outProcedure(nVar1:integer;out nVar2:integer);
    begin
        nVar2 := nVar1;
    end;
    
    
    end.

      欢迎转载,转载请注明来源。

  • 相关阅读:
    深入理解memcached
    如何查看你的 memcached 的状态
    转: Linux 技巧:让进程在后台可靠运行的几种方法
    centos 如何用 rsyslog 搭建本地日志服务(续1: omprog模块与php deamon的配合使用)
    转: 解决MSYS2下的中文乱码问题
    解决windows下vim方向键变成 ABCD 的问题
    centos 如何用 rsyslog 搭建本地日志服务
    转:理解 Linux 的硬链接与软链接
    php include include_once require require_once 的区别与联系
    让块级元素水平垂直居中
  • 原文地址:https://www.cnblogs.com/volcanol/p/5354581.html
Copyright © 2020-2023  润新知