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

Delphi函式詳解:全域性函式,內部函式,類的成員函式,類的靜態方法

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函式:全域性函式,內部函式,成員函式,靜態方法

1. Delphi中的全域性函式 //要點: 需要給其他單元呼叫, 必須在 interface 宣告, 但必須在 uses 區後面 unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Cla

MySQL 的函式

完整性約束 什麼是資料完整性 資料的準確性和可靠性。 分類 實體完整性 記錄準確的。(記錄不能重複) 主鍵約束: 不能重複,不能為空。  Primary key 欄位唯一的。 不能使用業務欄位。 無意義的

Vue生命週期函式

 vue例項的生命週期 1 什麼是生命週期(每個例項的一輩子) 概念:每一個Vue例項建立、執行、銷燬的過程,就是生命週期;在例項的生命週期中,總是伴隨著各種事件,這些事件就是生命週期函式; 生命週期:例項的生命週期,就是一個階段,從建立到執行,再到銷燬的階段; 生命週期函式:在例項的生命週

goinit函式

init()函式會在每個包完成初始化後自動執行,並且執行優先順序比main函式高。init 函式通常被用來: 對變數進行初始化 檢查/修復程式的狀態 註冊 執行一次計算   包的初始化        為

linux 核心 - ioctl 函式

1. 概念 ioctl 是裝置驅動程式中裝置控制介面函式,一個字元裝置驅動通常會實現裝置開啟、關閉、讀、寫等功能,在一些需要細分的情境下,如果需要擴充套件新的功能,通常以增設 ioctl() 命令的方式實現。 在檔案 I/O 中,ioctl 扮演著重要角色,本文將以驅動開發為側重

assert.ifError()函式

assert.ifError(value) 如果 value 為真值時,丟擲 value。當測試在回撥函式裡的引數 error 時非常有用。 const assert = require('assert'); assert.ifError(0); // OK assert.ifError(1); //

assert.throws()函式

assert.throws(block[, error][, message]) 期望 block 函式丟擲一個錯誤。 如果指定 error,它可以是一個建構函式、正則表示式或驗證函式。 如果指定 message,如果 block 因為失敗而丟擲錯誤,message 會是由 AssertionError 提

Swoole Echo伺服器隨意搭建 及set函式

<?php //Server Class Server { private $serv; /** * 連結swoole伺服器 * Server constructor. */ public function __construct()

深入理解計算機系統配套實驗(一) data lab 函式

/* 135. * bitAnd - x&y using only ~ and | 136. * Example: bitAnd(6, 5) = 4 137. * Legal ops: ~ | 138. * Max ops: 8 139. *

fcntl函式

功能描述:根據檔案描述詞來操作檔案的特性。 #include <unistd.h> #include <fcntl.h>  int fcntl(int fd, int cmd);  int fcntl(i

Mysql 字元函式

MySql 所有字串函式函式詳解 ASCII(str) 返回str最左邊第一位字元的ASCII編碼,如果str為空,則返回 0 。如果str為NULL,則返回NULL -- 只返回a的ASCII編碼 SELECT ASCII('ab') - 97 SELECT ASCII('a') - 97

C++建構函式及顯示呼叫建構函式

                         

單鏈表,頭插法,尾插法各種函式

一:LinkList.cpp檔案 #include <stdio.h> #include <malloc.h> //malloc函式 用了<stdlib.h>中的 <malloc.h>標頭檔案 typedef int ElemT

Opencv基礎: Mat裡setTo函式

https://blog.csdn.net/oMoDao1/article/details/80324360 函式原型:   /** @brief Sets all or some of the array elements to the specified value. &n

keras:4)LSTM函式

LSTM層 keras.layers.recurrent.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uni

Socket通訊過程和函式

from:http://blog.csdn.net/tianmo2010/article/details/6542063 ①什麼是Socket    Socket介面是TCP/IP網路的API,Socket介面定義了許多函式或例程,程式設計師可以用它們來開發TCP/IP網路上的應用程式。要學

malloc和free函式(轉載只是為了查閱方便,若侵權立刪)

malloc和free函式詳解   本文介紹malloc和free函式的內容。   在C中,對記憶體的管理是相當重要。下面開始介紹這兩個函式:     一、malloc()和free()的基本概念以及基本用法: 1、函式原型及說明: void *malloc(lon

【深度學習】Tensorflow函式

  目錄 tf.truncated_normal tf.random_normal tf.nn.conv2d tf.nn.max_pool tf.reshape tf.nn.softmax tf.reduce_sum tf.reduce_max,tf.r

strlen函式

在c語言中,strlen函式,引用<string.h>標頭檔案,作用是計算字串長度。 定義  :      size_t   strlen ( const  char * str );     這裡有

函式 函式

函式詳解 補充 函式詳解 一、函式的定義   定義 import re def myadd(num1,num2): #函式頭 """ #函式介面 計算兩個數字的和 :p