Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Существует ли перевод PSafeArray To Variant?  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 652
Добрый день

Приходится делать интеграцию с кассой от производителя Атол (приходится)) потому как они сворачивают поддержку "старого" драйвера, где всё работает как часики)) эххх).

Вопрос такой, я получаю массив в виде "PSafeArray" из драйвера ККТ Атол и этот массив нужно передать в этот же драйвер в виде OleVariant.

var
    date                   : TDateTime;
    SafeArrayCorrectionInfo: PSafeArray;
    CorrectionInfo         : Variant;
begin

    date := StrToDate('02.01.2018');
    FDriverATOL.setParam(1177, 'Согласованная коррекция');
    FDriverATOL.setParam(1178, date);
    FDriverATOL.setParam(1179, '<без номера>');
    FDriverATOL.utilFormTlv;
    SafeArrayCorrectionInfo := FDriverATOL.getParamByteArray(FDriverATOL.LIBFPTR_PARAM_TAG_VALUE);

// Могу сказать одно, нужно передать собранный Tlv одним параметром, видимо
// в драйвере предусмотрели функцию, которая это всё дело облегчает "FDriverATOL.getParamByteArray"
// т.е. 3 разных параметра собираем в один Tlv
// Возвращается в PSafeArray

// Далее необходимо собранный параметр передать в драйвер

    FDriverATOL.setParam(1174, SafeArrayCorrectionInfo);

// Но тут проблема, в FDriverATOL.setParam передаются только как OleVariant.. не совпадение типов((


Получается мне необходимо PSafeArray как то преобразовать в Variant.

Такое возможно?
В тех. поддержке Атол похоже не могут ответить на данный вопрос (жду пол дня у моря погоды), возможно тут ответ найдётся?!

Заранее спасибо!
10 сен 19, 15:34    [21967820]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли перевод PSafeArray To Variant?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11152
OleVariant они разные бывают. Какой VarType нужен?
10 сен 19, 16:04    [21967860]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли перевод PSafeArray To Variant?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25760
Игорь_UUS
OleVariant

Может быть и массивом, содержащим в себе другие OleVariant.
10 сен 19, 16:08    [21967868]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли перевод PSafeArray To Variant?  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 652
_Vasilisk_,

подозреваю ByteArray т.к. Tlv сборку получаю из getParamByteArray, в документации по интеграции на этот счёт ничего не сказано, приведён нерабочий пример:

var
    date: TDateTime;
    correctionInfo: Variant;
begin
    date := StrToDate('02.01.2018');
    fptr.setParam(1177, 'Документ основания коррекции');
    fptr.setParam(1178, date);
    fptr.setParam(1179, '№1234');
    fptr.utilFormTlv;
    correctionInfo := fptr.getParamByteArray(fptr.LIBFPTR_PARAM_TAG_VALUE);

    fptr.setParam(fptr.LIBFPTR_PARAM_RECEIPT_TYPE, fptr.LIBFPTR_RT_SELL_CORRECTION);
    fptr.setParam(1173, 1);
    fptr.setParam(1174, correctionInfo);
    fptr.openReceipt;


компилятор ругается:
[dcc32 Error] igUKKTDriverATOL.pas(1531): E2010 Incompatible types: 'Variant' and 'PSafeArray'
10 сен 19, 16:16    [21967876]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли перевод PSafeArray To Variant?  [new]
Игорь_UUS
Member

Откуда: г. Екатеринбург
Сообщений: 652
компилятор ругается именно на

correctionInfo := fptr.getParamByteArray(fptr.LIBFPTR_PARAM_TAG_VALUE);
10 сен 19, 16:17    [21967878]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли перевод PSafeArray To Variant?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11152
Игорь_UUS,

Курите

function GetVarDataArrayInfo(const AVarData: TVarData; out AVarType: TVarType;
  out AVarArray: PVarArray): Boolean;
begin
  // variant that points to another variant?  lets go spelunking
  if AVarData.VType = varByRef or varVariant then
    Result := GetVarDataArrayInfo(PVarData(AVarData.VPointer)^, AVarType, AVarArray)
  else
  begin

    // make sure we are pointing to an array then
    AVarType := AVarData.VType;
    Result := (AVarType and varArray) <> 0;

    // figure out the array data pointer
    if Result then
      if (AVarType and varByRef) <> 0 then
        AVarArray := PVarArray(AVarData.VPointer^)
      else
        AVarArray := AVarData.VArray
    else
      AVarArray := nil;
  end;
end;
10 сен 19, 16:34    [21967899]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли перевод PSafeArray To Variant?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1551
http://docwiki.embarcadero.com/Libraries/Rio/en/System.Variants.VarArrayAsPSafeArray

Есть вот такое. Посмотрите исходник, может обратным счетом получится сделать
10 сен 19, 20:36    [21968107]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли перевод PSafeArray To Variant?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1551
var
  sa: PSafeArray;
  v: Variant;
  ov: OleVariant;
begin
  sa := SafeArrayCreateVector(VT_I4, 0, 9);
  TVarData(v).VType := varArray or varInteger;
  TVarData(v).VArray := PVarArray(sa);
  ov := v;
end;

Так будет работать?
10 сен 19, 21:36    [21968145]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли перевод PSafeArray To Variant?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11152
X-Cite
Так будет работать?
Тогда уже VarArrayCreate()
11 сен 19, 15:29    [21968608]     Ответить | Цитировать Сообщить модератору
 Re: Существует ли перевод PSafeArray To Variant?  [new]
Cobalt747
Member

Откуда:
Сообщений: 2116
см. http://forum.atol.ru/index.php?s=&showtopic=37427&view=findpost&p=285178
13 сен 19, 09:33    [21970081]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить