Здравствуйте! Очень помогла тема http://forum.vingrad.ru/faq/topic-156830.html ... Но остались проблемы... Найти решение нигде не могу, а быстро решить - тоже не получается... Надо передать массивы чисел из VBA кода в функцию dll на дельфи! Вот пример...
В надстройке Excel код:
| Код | Public Function ТФОК(Kotb As Double, kk As Object, tt As Object) As Double Dim k() As Double Dim t() As Double Dim j As Integer Dim i As Integer Dim ti As Double ' j = -1 ' For i = 1 To UBound(kk()) If tt(i) <> "" Then j = j + 1 ReDim Preserve k(j) ReDim Preserve t(j) k(j) = CDbl(kk(i)) t(j) = CDbl(tt(i)) End If Next i ' ti = SplineX3(Kotb, k(), t())' ТФОК = ti ' End Function 'ShareFunc_K Public Function КФОК(Tkip As Double, tt As Object, kk As Object) As Double Dim k() As Double Dim t() As Double Dim j As Integer Dim i As Integer Dim ki As Double ' j = -1 ' For i = 1 To UBound(kk()) If tt(i) <> "" Then j = j + 1 ReDim Preserve k(j) ReDim Preserve t(j) k(j) = CDbl(kk(i)) t(j) = CDbl(tt(i)) End If Next i 'Own cubic spline ki = SplineX3(Tkip, t(), k()) If ki < 0 Then ki = 0 If ki > 100 Then ki = 100 ' КФОК = ki ' End Function
|
Ф-ция SplineX3 спрятана в dll и объявлена следующим образом в надстройке Excel:
| Код | ' Function f_SplineX3(const v_x:Double; const v_xx, v_yy:Variant) :Double ; Private Declare Function SplineX3 Lib "C:\Calc\LibXLS\LibProperty.dll" Alias "f_SplineX3" _ (ByVal vX As Double, v_XX As Variant, v_YY As Variant) As Double
|
Делов том, что по сути эти массивчики v_XX и v_YY являются Double! И пробовал по всякому сделать это обявление и реализацию в дельфи, но что то не получилось...
| Код | Function f_SplineX3(const v_x:Double; const v_xx, v_yy:Variant) :Double ; begin //ar_X, ar_Y RangeToVector_M(v_xx, ar_X); RangeToVector_M(v_xx, ar_Y); Result := SplineX3(v_x, ar_X, ar_Y); end; //Function f_SplineX3() :Double ;
procedure RangeToVector_M(const rango: variant; var matriz: TNvector); var Rows, columns: longint; i, j: longint; begin Rows := VarArrayHighBound(rango,1); SetLength(matriz, Rows + 1); for i := 1 to Rows do matriz[i] := VarToDouble(Rango[i]); end; //procedure RangeToVector
function VarToDouble(const dato: variant): double; var temp: variant; begin try temp := varastype(dato, vardouble); except on EVariantError do begin tvardata(temp).vtype := vardouble; tvardata(temp).vdouble := 0.0; end; end; VarToDouble := tvardata(temp).vdouble; end; // function VarToDouble
|
Подскажите, пожалуйста, как же правильно передавать хотя бы одномерные (лучше динамические, но не обязательно...) массивчики чисел в dll на дельфи?
Неужели выход - только через строчку???
|