Delphi_07_Delphi_Object_Pascal_基本语法_05_函数参数
这里主要讨论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_();
{ 传地址方法调用
1、swapInteger() 交换函数
2、调用IntToStr() 方法将整型转换为字符串类型
}
nVar1 := ;
nVar2 := ;
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();
//演示输出参数的调用情况
WriteLn('Before call outProcedure(), nVar2 = ' + IntToStr(nVar2));
outProcedure(,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}
、forward关键字可以用来声明方法或者函数, 和C语言一样方法或者函数必须先定义
后才能使用,而有时候可能需要推迟一下定义函数或方法,这时就可以利用forward
关键字先声明函数或方法,有点像C语言中先声明函数的原型。
*)
{
下面的函数演示forward的用法
}
procedure forwardKey_();
{ 方法或者函数的参数传递方式
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,);
WriteLn(strPath);
//申请内存后,输出全为 ????, 因此利用函数进行清零
FillMemory(@strPath,,);
//获取当前工作路径, 调用Win32 API
GetCurrentDirectory(,PWideChar(strPath));
currentPath:=strPath;
WriteLn(currentPath);
{ 命令行参数
1、Delphi程序也能获取命令行参数
2、通过 SysUtils 单元中的 ParamStr() 函数获取命令行参数
3、命令行参数编号从 0 开始, ParamStr()获取传递给应用程序的第一个参数
}
//通过调用Delphi提供的函数获取当前路径,带目录分隔符 \
currentPath := ExtractFilePath(ParamStr());
WriteLn(currentPath);
//不带目录分隔符 \
currentPath := ExTractFileDir(ParamStr());
WriteLn(currentPath);
end;
{ forward关键字的使用
1、如下所示,如果不用关键字 forward 就会编译出错
2、这里表示 forwardKey_1() 先声明原型然后再定义
3、如果将下面一行声明全注释,则在 forwardKey_2()中会提示 forwardKey_1()
没有定义
}
procedure forwardKey_();forward;
procedure forwardKey_();
begin
WriteLn('Call forwardKey_1() by used forward keyword.');
forwardKey_();
end;
procedure forwardKey_();
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 := ;
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.
欢迎转载,转载请注明来源。
Delphi_07_Delphi_Object_Pascal_基本语法_05_函数参数的更多相关文章
- 【C/C++】引用&的含义/语法/作为函数参数/函数返回值/本质/常量引用
含义 引用不产生副本,只是给原变量起了别名. 对引用变量的操作就是对原变量的操作. 基本语法 数据类型 &别名 = 原名 e.g. int a = 10; int &b = a; // ...
- Delphi_08_Delphi_Object_Pascal_基本语法_06_函数参数
发现Delphi中关于函数参数部分的内容还是比较多的,暂时说到这篇随笔为止吧,以后再继续讨论一下函数的参数部分的内容. 一 工程文件 program DefaultParameter; {$APPTY ...
- C++中对C的扩展学习新增语法——内联函数以及函数参数
内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个c ...
- python基础语法5 函数定义,可变长参数
函数 1.什么是函数 函数就是一种工具. 可以重复调用 2.为什么要用函数 1.防止代码冗(rong)余 2.代码的可读性差 3.怎么用函数 1.定义函数-->制造工具 2.调用函数--> ...
- Python基本语法_函数属性 & 参数类型 & 偏函数的应用
目录 目录 前言 软件环境 Python Module的程序入口 函数的属性 Python函数的创建 函数的参数 必备参数 缺省参数 命名参数 不定长参数 匿名参数 偏函数的应用 前言 Python除 ...
- ES6新增语法(二)——函数和参数
箭头函数 箭头函数:将原来函数的function关键字和函数名都删掉,并使用"=>"连接参数列表和函数体. 箭头函数语法: (参数1,参数2)=>{ 函数体 } 注意点 ...
- JS基础语法---函数---介绍、定义、函数参数、返回值
函数: 把一坨重复的代码封装,在需要的时候直接调用即可 函数的作用: 代码的重用 函数需要先定义,然后才能使用 函数名字:要遵循驼峰命名法 函数一旦重名,后面的会把前面的函数覆盖 Ctrl +鼠标左键 ...
- 深入理解javascript函数参数与闭包(一)
在看此文章,希望先阅读关于函数基础内容 函数定义与函数作用域 的章节,因为这篇文章或多或少会涉及函数基础的内容,而基础内容,我放在函数定义函数作用域 章节. 本文直接赘述函数参数与闭包,若涉及相关知识 ...
- Swift3.0P1 语法指南——函数
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
随机推荐
- ecshop验证码
<?php //仿制ecshop验证码(四位大写字母和数字.背景) //处理码值(四位大写字母和数字组成) //所有的可能的字符集合 $chars = 'ABCDEFGHIJKLMNOPQRST ...
- iOS 多线程之GCD的使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...
- Android中Fragment的两种创建方式
fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认 ...
- HashMap的工作原理
HashMap的工作原理 HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...
- SpringMVC初始化参数绑定--日期格式
一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 <!-- 包扫描器 --> <context:comp ...
- .NET Core dotnet 命令大全
dotnet 命令大全,让你理解dotnet 命令. 本文将以一个实例串起 dotnet 所有命令,让你玩转dotnet 命令. 本篇文章编写环境为windows 10 ,dotnet 命令同样适用于 ...
- 【腾讯优测干货分享】如何降低App的待机内存(二)——规范测试流程及常见问题
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/806TiugiSJvFI7fH6eVA5w 作者:腾讯TMQ专项测 ...
- 我叫Twenty,我是要成为博客王的博客框架
标题套用了路飞的格式,其实我想说的是大多数都不相信你的梦想,直到你快走到了. 不废话了,介绍一下twenty: 这是基于CMS框架 zerojs打造一个博客.zerojs 的架构介绍在这里http:/ ...
- Oracle11g CentOS7安装记录
1. 操作系统环境.安装包准备 宿主机:Max OSX 10.10.5 虚拟机:Parallel Desktop 10.1.1 虚拟机操作系统:CentOS-7-x86_64-DVD-1511.iso ...
- Java线程池解析
Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...