[英]Returning Excel Array from Delphi
我正在嘗試從Excel調用Delphi DLL,並返回一列變量數據值。 我讓dll返回一個短字符串,並且出現在單元格中。 現在,我試圖返回一列變量值。 可以進入我的代碼,但是excel中的數組全為0。
任何想法表示贊賞。
這是Excel中的宏注冊: =REGISTER("c:\\projects\\test\\delphixl.dll","GetPolicyData","KDD","GetPolicyData","Co,Pol",1,"Delphi")
我不確定參數后面的1是什么。 我在任何地方都找不到完整的文檔。
Excel中的范圍包括: {=GetPolicyData(C1,D1)}
下面是D7中的代碼。 根據用於注冊功能的excel文檔,這似乎可以。
K數據類型
K數據類型使用指向可變大小FP結構的指針。 您必須在DLL或代碼資源中定義此結構,如下所示:
typedef struct _FP
{
unsigned short int rows;
unsigned short int columns;
double array[1]; /* Actually, array[rows][columns] */
} FP;
Type
pPolicyData = ^tPolicyData;
tPolicyData = Record
Rows: word;
Cols: word;
data: variant;
End;
var
pd: tPolicyData;
Function GetPolicyData(co: pShortString; pol: pShortString): pPolicyData; Stdcall;
Var
polc: tpolcmst;
Begin
lpro := tlifepro.create;
lpro.opendatabases;
polc := tpolcmst.create(lpro);
Try
polc.read(co^, pol^);
pd.Rows := 2;
pd.Cols := 1;
pd.data := VarArrayCreate([0, 1], varVariant);
pd.data[0] := datetostr(polc.issuedate);
pd.data[1] := format('%.2f', [polc.modepremium]);
result := addr(pd);
Finally
lpro.closedatabases;
freeit(lpro);
End;
End;
您已將FP記錄的數據成員( TPolicyData )聲明為Variant 。 應該將其聲明為Double ,並且應該是所需尺寸的數組。
在這種情況下,行數= 2且列數= 1:
TPolicyData = record
Rows: word;
Cols: word;
data: array[0..1] of Double;
End;
如果行和列是動態的,那么您將需要計算FP記錄所需的內存並動態分配。 所需的內存將是:
2 bytes for "Rows" word
+ 2 bytes for "Cols" word
+ Rows x Cols x 8 bytes for "data" array of Doubles
使用Delphi 7,您將需要在數據存儲器中使用指針偏移量,以將值分配給“數組”中的各個Double元素。
但是,由於您沒有提到需要解決可變行和列的問題,因此我將不再贅述,因為這可能是多余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.