1. 程式人生 > >Delphi:記錄型別、過程指標、函式(方法)指標欄位的應用

Delphi:記錄型別、過程指標、函式(方法)指標欄位的應用

       由於工作關係使用delphi已經有一年時間,在使用中我也在不斷的摸索,在以後的實踐中我會陸續把心得寫下來,以備查閱。本文的主題是Delphi中 record型別使用中的幾點總結。

       我們知道Delphi的記錄型別與C/C++的struct型別有相似之處,也有不同。我覺得最大的不同便是關於欄位的初始化賦值,delphi不允許在宣告記錄型別時賦值欄位,而C/C++允許在宣告時複製欄位。當然今天不討論這一點,今天的重點是Delphi 中 record 型別中函式指標的使用技巧。

       過程或函式(方法)指標是一種資料型別,“資料型別是指一個值的集合以及定義在這個值集上的一組操作“(引自《百度百科》”

資料型別“詞條)。簡單地講,過程或函式(方法)指標就是一種簡單的類,即過程、函式(方法)的”類“,這種”類“簡單到只定義了符合”類“的格式。

      舉例1:

      type
     TFun1 = procedure(sender: ClassA);
     TFun2 = function(sender: ClassA): ClassB;
      end;

例1中TFun1是一個過程的指標資料型別,TFun2 是一個方法(函式)的指標資料型別:

TFun1這個資料型別對應的過程格式是

procedure (sender: ClassA);

而TFun2這個資料型別對應的函式(方法)格式是

function(sender: ClassA): ClassB;

舉例2:

var
   sd:ClassA;
    fun1:TFun1;
    fun2:TFun2;

例2中聲明瞭兩個指標變數,然而卻沒有賦值,接下來我們可以宣告並定義相應過程和函式:
procedure fun1def(sender:ClassA);
    begin
          //填寫執行程式碼
    end;
function fun2def(sender:ClassA):ClassB;
    begin
          //填寫執行程式碼
    end;

fun1 := fun1def;
    fun2 := fun2def;

 引用fun1、fun2時可以直接這樣做fun1(sd)、fun2(sd)。以上便是過程、函式(方法)指標的用法。下面進入主題:用record來做class做的事。

        我們知道,類與結構體(記錄型別)的最大區別就是在於類可以包含方法和函式,但是宣告類有時候又過於繁瑣,所以我想用宣告和使用簡單的記錄型別來做”類“可以做的事。首先宣告一個record和它的一個指標,在這個record中可以宣告一個函式指標,指標指向的函式的引數也宣告在這個record中,或者更簡單的是我們可以直接在宣告指標型別的時候把這個型別的函式(過程)的引數設為上面宣告的record的指標,這樣更為簡單。

        廢話少說,上菜。。一個完整的例子

 舉例3:

unit Usrct;

interface
type
  PTstruct = ^Tstruct;
  TFun1 = procedure(sender: PTstruct);
  TFun2 = procedure();
  Tstruct = record
    sender: TObject;
    fun1: TFun1;
    fun2: TFun2;
  end;
procedure fun1def(sender: PTstruct);
procedure fun2def();
procedure funRun();
var
  srct: Tstruct;

implementation

procedure fun1def(sender: PTstruct);
begin
  //要執行的程式碼
end;

procedure fun2def();
var
  scr: PTstruct;
begin
  scr := @srct;
  //要執行的程式碼
end;

procedure funRun();
begin
  srct.fun1 := fun1def;
  srct.fun2 := fun2def;
end;
end.
在使用中需要注意的是record、指標型別、結構體指標的宣告順序。