1) 首先,申明函數指針類型TFunctionParameter。
type
TFunctionParameter = function(const value : integer) : string;
2) 定義準備被做爲參數傳遞的函數
function One(const value : integer) : string;
begin
result := IntToStr(value) ;
end;
function Two(const value : integer) : string;
begin
result := IntToStr(2 * value) ;
end;
3) 定義將要使用動態函數指針參數的函數
function DynamicFunction(f : TFunctionParameter; const value : integer) : string;
begin
result := f(value) ;
end;
4) 上面這個動態函數的使用實例
var
s : string;
begin
s := DynamicFunction(One,2006) ;
ShowMessage(s) ; //will display "2006"
s := DynamicFunction(Two,2006) ;
ShowMessage(s) ; // will display "4012"
end;函數
一個指向函數的指針在賦值指向函數時,不須要顯示地取函數的地址。spa
例:.net
var F:function(X:Integer):Integer;指針
...接口
function aa(X:Integer):Integer;get
不須要: F:=^aa;原型
只要:F:=aa;就能夠了。回調函數
F:=aa多是一個函數類型變量賦值,也多是調用aa函數過程。string
若是F不是一個函數過程類型,它就是一個函數調用。io
可是隻要是出如今表達式中,就必定是函數過程的調用。
例:if A:=fun then
A:=fun必定是一個函數過程的調用,將返回值賦予A
注意,若是fun是一個過程(它沒有返回值)或它須要參數(須要寫上參數),那就會產生語法錯誤。
若是要顯示說明它是一個賦值語句而不是函數過程的調用,能夠這樣寫
@A是將A轉換成一個無類型指針(它自己就是以指針形式存在)
@fun是取得函數過程fun的地址
能夠經過@@A的方式取得該過程函數變量的地址,而不是它指向的函數過程的地址
void SetProcessDataProc(NOTISFYDATAISRECEIVED ProcessDataProc)
參數:ProcessDataProc —— 回調函數指針。
返回值:無
功能:設置數據到達通知函數。動態鏈接庫主動通知用戶有新數據到達,隨後用戶就能夠當即查詢相關數據。用戶調用此接口函數設置通知函數之後,每當新數據到達,動態鏈接庫就經過這個通知函數通知用戶。通知函數原型必須以下:(函數名稱和參數名稱能夠不一樣)
void ProcessDataProc(int iBedNo,unsigned char ucDataType,WPARAM wParam);
其中,iBedNo參數表示到達數據所對應的設備號。
ucDataType表示到達數據類型。ucDataType值與對應的數據包類型以及常調用的接口函數如表1所示。對於表中沒有列舉的數據包類型,數據包內沒有有用的數據。
wParam用於傳遞其餘信息,保留,暫時沒有使用。
因此,SetProcessDataProc接口函數的參數類型NOTISFYDATAISRECEIVED能夠定義以下:
typedef void(* NOTISFYDATAISRECEIVED)(int iBedNo,unsigned char ucDataType,WPARAM wParam);
這是一個動態鏈接庫中一個函數,我如今想在delphi中調用該函數,請問該如何定義上述類型和函數。
void ProcessDataProc(int iBedNo,unsigned char ucDataType,WPARAM wParam);
->
procedure ProcessDataProc(iBedNo: Integer; ucDataType:BYTE; wParam: WPARAM);stdcall;
typedef void(* NOTISFYDATAISRECEIVED)(int iBedNo,unsigned char ucDataType,WPARAM wParam);->type NOTISFYDATAISRECEIVED = procedure of(iBedNo: Integer; ucDataType:BYTE; wParam: WPARAM) of object;///