powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Существует ли перевод PSafeArray To Variant?
10 сообщений из 10, страница 1 из 1
Существует ли перевод PSafeArray To Variant?
    #39859902
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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.

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

Заранее спасибо!
...
Рейтинг: 0 / 0
Существует ли перевод PSafeArray To Variant?
    #39859922
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OleVariant они разные бывают. Какой VarType нужен?
...
Рейтинг: 0 / 0
Существует ли перевод PSafeArray To Variant?
    #39859927
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUSOleVariant
Может быть и массивом, содержащим в себе другие OleVariant.
...
Рейтинг: 0 / 0
Существует ли перевод PSafeArray To Variant?
    #39859932
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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'
...
Рейтинг: 0 / 0
Существует ли перевод PSafeArray To Variant?
    #39859934
Игорь_UUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
компилятор ругается именно на

Код: pascal
1.
correctionInfo := fptr.getParamByteArray(fptr.LIBFPTR_PARAM_TAG_VALUE);
...
Рейтинг: 0 / 0
Существует ли перевод PSafeArray To Variant?
    #39859943
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь_UUS,

Курите

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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;
...
Рейтинг: 0 / 0
Существует ли перевод PSafeArray To Variant?
    #39860035
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://docwiki.embarcadero.com/Libraries/Rio/en/System.Variants.VarArrayAsPSafeArray

Есть вот такое. Посмотрите исходник, может обратным счетом получится сделать
...
Рейтинг: 0 / 0
Существует ли перевод PSafeArray To Variant?
    #39860045
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;


Так будет работать?
...
Рейтинг: 0 / 0
Существует ли перевод PSafeArray To Variant?
    #39860370
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteТак будет работать?Тогда уже VarArrayCreate()
...
Рейтинг: 0 / 0
Существует ли перевод PSafeArray To Variant?
    #39861300
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Существует ли перевод PSafeArray To Variant?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]