You need some basic objects to create Excel XLL Add-Ins with Delphi. At first, we need a structure to exchange data with Excel. Therefore, Microsoft describes the XLOPER
and XLOPER12
structures inside the Excel Software Development Kit (SDK).
You should download and install the current Excel SDK to become a licensee. It contains very useful information. Please, take notice of the enclosed EULA. The Excel 97 Software Development Kit (3 parts!) is still available if you like.
The XLOPER
type is a simple structure, which consists of two parts. That’s an 8-byte data part and a field, which defines the type of that data. It’s not recommended to use the packed
keyword in your definition. The standard alignment {$A+}
or {$ALIGN 8}
makes sure that your record will get the right size. As a result, your XLOPER
has a size of 16 bytes. You can read more about data alignment here.
You can do a line-by-line transformation. The variable data part, which is defined as a C union, will be converted to a variant record with the case
statement. We can use the xltype
constants within the case
statement for better reading. Include Windows.pas
to get no trouble with types.
unit dXLCall; // Delphi XLCALL interface uses Windows; {$A+} {...} type LPXLOPER = ^XLOPER; XLOPER = record val : record case Word of xltypeNum: (num : Double); xltypeStr: (str : LPSTR); {...} xltypeSRef: (sref : record count : Word; ref : XLREF; end); {...} end; xltype: Word; end;
We can do the same with the XLOPER12
type. This type will result in a 32-byte structure. And we can use it to benefit from the features introduced with Excel 2007.
type LPXLOPER12 = ^XLOPER12; XLOPER12 = record val: record case Word of xltypeNum: (num : Double); xltypeStr: (str : LPWSTR); {...} xltypeSRef: (sref : record count : Word; ref : XLREF12; end); {...} end; xltype: LongWord; end; implementation end.
There are many pitfalls in converting C code. I suggest the good article I read on this topic. The Excel 97 Developer’s Kit gives advice on the size issue mentioned above (note on page 152.) But even the greatest book about Excel XLL Development assumes a size of 20 byte for a XLOPER12
(page 127.) I have cited a possible translation of the SRef
-part in the exemplification for that reason. I count 18 bytes plus 2 bytes for alignment. The data part (val
field) has a size of 24 bytes because the record is aligned to the largest alignment of the fields in the record (xltypeNum
.)
At this point, we have caught the first objects and more to follow.
And another query – are there any constraints on the delphi downloads you’ve kindly provided?
Thanks.
Restrictions are implied by the Legal Notice page of this blog. Particular download archives include a note if special terms are applicable. Sorry for the delay in responding.