OleGator22
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору В 32 Excel на протяжении почти 10 лет создана большая вычислительная DLL, написана сначала в Delphi, а потом продолжена в RAD Sudio XE-5... Я перешел на платформу 64 внутри XE-5, это легко, перекомпилировалось все просто, пару других модулей пере подключено и все! Увы когда то радость заканчивается! И вопрос уже не только в разнице объявлений, это сделано! Но и здесь могут быть нюансы какие то! В Excel ф-ции выдают ЗНАЧ ! Вот сделано, классика в переходе на 64 офис: #If VBA7 Then ' // 20-03-2019 Расчет т-ры г/о - для подборов! Public Declare PtrSafe Function ТСго3ф Lib "C:\InfoCalc\FuncExcel\LibXLS\PhChProp.dll" Alias "f_Calc3f_hydr_form" _ (Массы_i As Variant, _ Свойства As Variant, _ ВМР As Variant, _ ByVal TC As Double, _ ByVal Paта As Double, _ Optional ByVal Алгоритм As LongPtr = 0) As Double ... А похоже (думаю в этом причина!) в том, что не работает ранее работающая внутри дельфи обработка диапазонов... В дельфи активно работает процедура преобразователь типа: RangeToVector() Function f_Calc3f_hydr_form( const pWp_v, pArNSI, pWpi_WMS:Variant; const pTC, pPa:Double; // термобар. условия... const pAlg:byte = 0 // Алг. расчета! ):Double; stdcall; Begin // RangeToVector(pWp_v, Gi); // то вернем этот оператор ввода масс комп-тов! RangeToVector(pWp_v, Wpi); DoNorma100prc(Wpi); ... End; Это сложная обработка, я ее взял из другого форума, который как то не отвечает! Вот ее код, он ранее четко и быстро работал! Великолепно обрабатывал массивы чисел в виде диапазонов из Exel в массивы внутрь дельфи! Сейчас не пашет! Возможно что то еще? Но что? Есть подобная обработка и для матрицы, то есть двумерного диапазона... MTvector = array of Double; // объявлено в другом модуле... {= Данная процедура предназначена для преобразования варианта-диапазона из Excel в типовой вектор данных! =} procedure RangeToVector(const rango: variant; var matriz: MTVector); var Rows, columns: longint; i, j: longint; begin if ((tvardata(rango).vtype and vararray) = 0) and ((tvardata(rango).vtype and vartypemask) = vardispatch) then begin Rows := Rango.count; SetLength(matriz, Rows + 1); // здесь внесли изменения для перехода к [1..NN] for i := 1 to Rows do matriz[i] := VarToDouble(Rango.cells[i]); end else if ((tvardata(rango).vtype and vararray) <> 0) then begin rows := vararrayhighbound(rango, 1) - vararraylowbound(rango, 1) + 1; if VarArrayDimCount(rango) = 1 then begin setLength(matriz, rows+1); for i := 1 to rows do matriz[i] := vartodouble(rango[i]); end else begin columns := vararrayhighbound(rango, 2) - vararraylowbound(rango, 2) + 1; setlength(Matriz, Columns * Rows); for i := 1 to rows do for j := 1 to columns do try matriz[(i - 1) * columns + j] := VarToDouble(rango[i, j]); except on EVariantError do matriz[(i - 1) * columns + j] := 0; end; end end else begin rows := 1; setLength(matriz, rows+1); matriz[1] := vartodouble(rango); end; // end; //procedure RangeToVector Изнутри тест проходишь в исполняемом режиме (тестирование п/п) - ничего не видно! Данные адекватно преобразуются, а в длл - в Excel все ломается! Увы под вопросом весь мой труд... Перелопачивать все в VBA, как то не айс! Может кто подскажет путь? Где тут подводные камни? Я не понимаю логику этих новых данных... Такой подход очень хорош! Не позволяет вредителям вломится в выч. процедуры! Если не трудно, помогите! |