程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi_06_Delphi_Object_Pascal_基本語法_05_函數參數,delphiobjectpascal

Delphi_06_Delphi_Object_Pascal_基本語法_05_函數參數,delphiobjectpascal

編輯:Delphi

Delphi_06_Delphi_Object_Pascal_基本語法_05_函數參數,delphiobjectpascal


  這裡主要討論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}
3、forward關鍵字可以用來聲明方法或者函數, 和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.

 

  歡迎轉載,轉載請注明來源。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved