1. 程式人生 > >Delphi函數詳解:全局函數,內部函數,類的成員函數,類的靜態方法

Delphi函數詳解:全局函數,內部函數,類的成員函數,類的靜態方法

obj val 如果 class str messages pro 需要 dct

1. Delphi中的全局函數
//要點: 需要給其他單元調用, 必須在 interface 聲明, 但必須在 uses 區後面
 unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;
{需要給其他單元調用, 必須在 interface 聲明, 但必須在 uses 區後面}
function MyFun(x,y: Integer): Integer; {函數聲明}
var
  Form1: TForm1;
implementation
{$R *.dfm}
function MyFun(x,y: Integer): Integer; {函數實現}
begin
  Result := x + y;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i := MyFun(1,2); //註意此時MyFun()是個全局函數
  ShowMessage(IntToStr(i)); {3}
end;
end.

2. Delphi中的內部函數---- unit中implementation區中的內部函數
//要點: implementation 區中的過程或函數, 只能在本單元調用 
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
{implementation 區中的過程或函數, 只能在本單元調用}
function MyFun(x,y: Integer): Integer; //此時這個函數僅供本unit調用
begin
  Result := x + y;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  i := MyFun(1,2); //註意此時MyFun()是個全局函數
 end;
end.


 
3. Delphi中的內部函數---- Procedure/Function中的內部函數
//Delphi 支持過程中的方法
 procedure TForm1.Button1Click(Sender: TObject);   
    procedure alert(s: string);  
    begin     
    ShowMessage(s);   
    end; 
begin   
  alert(‘Hello‘); 
end; 

4. Delphi類的成員函數
//要點: 如果聲明在 TForm1 類內, 那它就是 TForm1 類的一個方法了
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    function MyFun(x,y: Integer): Integer; {函數聲明在 TForm1 類的體內}
    {現在這個函數 MyFun 已經是 TForm1 類的一個方法了}
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
{函數在實現區必須有 TForm1. 作為前綴}
function TForm1.MyFun(x,y: Integer): Integer;
begin
  Result := x + y;
end;
{調用}
procedure TForm1.Button1Click(Sender: TObject); //相當於C++中TForm1::Button1Click();
var i: Integer; begin i := MyFun(1,2);//類的實現內部當然可以調用類的方法MyFun()了 ShowMessage(IntToStr(i)); {3} end;
end.
  
5. Delphi的類方法---類似於C++中類的靜態方法

//類方法就是通過類名就可以訪問的方法
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;
{類方法示例:}
TMyClass = class(TObject)
  class procedure alert(s: string); {類方法只是比靜態方法多了一個 class 指示字}
end;
{
  類方法不能在 private 和 protected 區;
  類方法不能是虛方法;
  類方法只能使用類中的、在對象實例化以前的數據.
}
var
  Form1: TForm1;
implementation
{$R *.dfm}
{ TMyClass }
class procedure TMyClass.alert(s: string);
begin
  ShowMessage(s);
end;
{類方法可以直接使用}
procedure TForm1.Button1Click(Sender: TObject);
begin
  TMyClass.alert(‘Hello world‘); 
end;
{類的對象當然也能使用}
procedure TForm1.Button2Click(Sender: TObject);
var
  MyClass: TMyClass;
begin
  MyClass := TMyClass.Create;
  MyClass.alert(‘Hello World‘);  
  MyClass.Free;
end;
end.
--------------------------------------------------------------------------------
//靜態類方法
{現在的 Delphi 不僅僅有類方法, 同時有: 
  類變量: class var
  類常量: class const
  類類型: class type
  類屬性: class property
  靜態類方法就是給類屬性來調用的, 它可以存在與私有區(private), 
  譬如下面的 SetName 就是一個靜態類方法:
}
TMyClass = class(TObject)
  private
    class var FName: string;
    class procedure SetName(const Value: string); static; {靜態類方法又多了一個 static 指示字}
  published
  class property Name: string read FName write SetName;
end;

6. Delphi中指針函數參數

{現在這個函數並沒有 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;

Delphi函數詳解:全局函數,內部函數,類的成員函數,類的靜態方法