理解delphi的类---方法

本文详细介绍了Delphi程序设计中的过程和函数定义及使用方法,包括过程与函数的区别、参数传递方式及其注意事项,并通过实例演示了不同类型参数的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类中包含字段,方法,属性(属性包含事件);字段是靠方法组织 与操作的;属性也只是方便和规范了字段与方法的使用。

  先从非类中的方法谈起;离开类的怀抱,我们更喜欢把方法叫做过程或函数。

//要点1: 过程用procedure定义,函数用function定义;过程没返回值,函数有返回值

procedure MyProc;
begin
  ShowMessage('ok');
end;

function MyFun: string;
begin
  Result := 'ok';
end;
//过程和函数都可以有一个或多个参数;参数用;号分开

procedure MyProc(i: Integer);
begin
  ShowMessage(IntToStr(i));
end;

function MyFun(x: Integer; y: Integer): Integer;
begin
  Result := x + y;
end;

//要点3: 在调用时, 参数使用 , 分割的
function MyFun(x: Integer; y: Integer): Integer;
begin
  Result := x + y;
end;

{调用}
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i := MyFun(1,2);
end;

要点4: 多个相同类型的参数可以简化写法
function MyFun(str: string; x,y,z: Integer): string;
begin
  Result := str + IntToStr(x + y + z);
end;

//要点10: 过程和函数都可以有一个或多个默认参数; 但必须在非默认参数后面
function MyFun(s1: string; s2: string='好人'): string;
begin
  Result := s1 + s2;
end;

{调用}
procedure TForm1.Button1Click(Sender: TObject);
var
  str1,str2: string;
begin
  str1 := '万一';
  str2 := '坏蛋';

  ShowMessage(MyFun(str1));      {万一好人}

  ShowMessage(MyFun(str1,str2)); {万一坏蛋}
end;

//要点11: 参数可以分为: 默认参数(传值)、var(传址)(比如C++中的指针变量或引用)、out(输出)、const(常数)四类

{默认参数是传值, 不会被改变}
function MyF1(x: Integer): Integer;
begin
  Inc(x);
  Result := x;
end;

{var参数是传址, 会被改变}
function MyF2(var x: Integer): Integer;
begin
  Inc(x);
  Result := x;
end;

{out参数是为支持Com的, 和 var 的结果是一样的, 一般我们用不着它}
function MyF3(out x: Integer): Integer;
begin
  Inc(x);
  Result := x;
end;

{const参数是绝对不可以赋值的, 这是被编译器优化的方式, 尽量多用}
function MyF4(const x: Integer): Integer;
begin
  //Inc(x); {这句会出错, 因为带 const 前缀的参数是不可以更改的}
  Result := x;
end;


//调用测试
procedure TForm1.Button1Click(Sender: TObject);
var
  a: Integer;
begin
  a := 6; MyF1(a);
  ShowMessage(IntToStr(a));  //6

  a := 6; MyF2(a);
  ShowMessage(IntToStr(a));  //7

  a := 6; MyF3(a);
  ShowMessage(IntToStr(a));  //7

  a := 6; MyF4(a);
  ShowMessage(IntToStr(a));  //6
end;
 
//静态数组做参数, 不能这样使用:
function MyFun(arr: array[0..9] of Integer): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i in arr do Result := Result + i;
end;
 
//应该先把数组定义成一个类型
Type
  IntArray = array[0..9] of Integer; {先把需要的数组定义成一个类型}

 
//给一个静态数组求和的函数

function MyFun(arr: IntArray): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i in arr do Result := Result + i;
end;


{测试}
procedure TForm1.Button1Click(Sender: TObject);
const
  intArr: IntArray = (1,2,3,4,5,6,7,8,9,10);
var
  x: Integer;
begin
  x := MyFun(intArr);       {调用函数}
  ShowMessage(IntToStr(x)); {55}
end;
 
{现在这个函数并没有 var 前缀, 也就是说参数应该不会被修改的}  
function MyFun(p: PInteger): Integer; {PInteger 是 Integer 的指针类型}
begin
  p^ := p^ * 2;
  Result := p^;
end;


{测试}
procedure TForm1.Button1Click(Sender: TObject);
var
  i,x: Integer;
begin
  i := 8;

  x := MyFun(@i);           {调用函数}
  ShowMessage(IntToStr(x)); {16}

  {现在 i 的值应该不会被修改, 但...}
  ShowMessage(IntToStr(i)); {16}

{
  没有 var 或 out 前缀的参数, 应该是传值的;
  有 var 或 out 的参数是传地址的;
  
  指针就是一个地址, 尽管没有指定传地址, 但事实上就是给了一个地址, 
  所以参数值也会改变!
}
end;

{给这个函数可以赋常数变量}
function Fun1(x,y: Integer): Integer;
begin
  Result := x + y;
end;

{这个函数不能赋予常数变量}
function Fun2(var x,y: Integer): Integer;
begin
  Result := x + y;
end;


{测试}
procedure TForm1.Button1Click(Sender: TObject); var
  i,a,b: Integer;
const
  j = 6;
  k = 8;
begin
  i := Fun1(1,2);
  ShowMessage(IntToStr(i)); {3}

//i := Fun2(1,2); {这样是 Fun2 是错误的, 它的参数是传地址的, 必须用变量}
//i := Fun2(j,k); {这样也不行}

  {应该:}
  a := 2;
  b := 4;
  i := Fun2(a,b);
  ShowMessage(IntToStr(i)); {6}
end;

转载于:https://www.cnblogs.com/hxy00/archive/2011/07/18/seven.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值