volcanol的工控博客
Email : lilinly225@126.com 索要资料加QQ 点击进入 或 点击左侧的资料分享专用帖

volcanol ---- View OF Linux Can Appreciate Nature OF Linux

天行健,君子以自强不息

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  这里主要讨论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.

 

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

 

posted on 2016-04-05 12:38  volcanol  阅读(559)  评论(0编辑  收藏  举报
volcanol ----View OF Linux Can Appreciate Nature OF Linux。