Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Ошибка при создании вариантного массива   Найти похожие ветки 

 
WondeRu ©   (2005-07-19 10:40) [0]

Делаю так:

var
 AArray: Variant;
begin
 AArray := VarArrayCreate([1, 2], varInteger);


все работает, а вот так:

var
 AArray: Variant;
begin
 AArray := VarArrayCreate([1, 2], varInt64);


уже нет... пишет что "не могу создать массив"

В чем проблема?


 
dmitry501 ©   (2005-07-19 10:55) [1]

Интересно...
В справке varInt64 нет в списке TVarType, а в system.pas есть.


 
WondeRu ©   (2005-07-19 10:57) [2]

dmitry501 ©   (19.07.05 10:55) [1]
да есть в справке по слову "TVarType"...


 
Плохиш ©   (2005-07-19 10:58) [3]


> dmitry501 ©   (19.07.05 10:55) [1]

Крякнутую справку выкинь и поставь нормальную.


 
dmitry501 ©   (2005-07-19 11:02) [4]

Плохиш ©   (19.07.05 10:58) [3]
:)


 
Digitman ©   (2005-07-19 11:02) [5]

тип varInt64 не проходит проверку на ValidBase

цитирую VarUtils.pas (D7):

 CVarTypeToElementInfo: array [CMinArrayVarType..CMaxArrayVarType] of TVarTypeToElementInfo = (

   { * = unsupported as of VCLv6  }
   { varEmpty/vt_empty        $00 }
   (ValidBase: False; ValidElement:  True; Size:  0; Flags: ARR_NONE),
   { varNull/vt_null          $01 }
   (ValidBase: False; ValidElement:  True; Size:  0; Flags: ARR_NONE),
   { varSmallint/vt_i2        $02 }
   (ValidBase:  True; ValidElement:  True; Size:  2; Flags: ARR_NONE),
   { varInteger/vt_i4         $03 }
   (ValidBase:  True; ValidElement:  True; Size:  4; Flags: ARR_NONE),
   { varSingle/vt_r4          $04 }
   (ValidBase:  True; ValidElement:  True; Size:  4; Flags: ARR_NONE),
   { varDouble/vt_r8          $05 }
   (ValidBase:  True; ValidElement:  True; Size:  8; Flags: ARR_NONE),
   { varCurrency/vt_cy        $06 }
   (ValidBase:  True; ValidElement:  True; Size:  8; Flags: ARR_NONE),
   { varDate/vt_date          $07 }
   (ValidBase:  True; ValidElement:  True; Size:  8; Flags: ARR_NONE),
   { varOleStr/vt_bstr        $08 }
   (ValidBase:  True; ValidElement:  True; Size:  4; Flags: ARR_OLESTR),
   { varDispatch/vt_dispatch  $09 }
   (ValidBase:  True; ValidElement:  True; Size:  4; Flags: ARR_DISPATCH),
   { varError/vt_error        $0A }
   (ValidBase:  True; ValidElement:  True; Size:  4; Flags: ARR_NONE),
   { varBoolean/vt_bool       $0B }
   (ValidBase:  True; ValidElement:  True; Size:  2; Flags: ARR_NONE),
   { varVariant/vt_variant    $0C }
   (ValidBase:  True; ValidElement:  True; Size: 16; Flags: ARR_VARIANT),
   { varUnknown/vt_unknown    $0D }
   (ValidBase:  True; ValidElement:  True; Size:  4; Flags: ARR_UNKNOWN),
   {*varDecimal/vt_decimal    $0E }
   (ValidBase: False; ValidElement: False; Size: 14; Flags: ARR_NONE),
   {*unused/undefined         $0F }
   (ValidBase: False; ValidElement: False; Size:  0; Flags: ARR_NONE),
   { varShortInt/vt_i1        $10 }
   (ValidBase:  True; ValidElement:  True; Size:  1; Flags: ARR_NONE),
   { varByte/vt_ui1           $11 }
   (ValidBase:  True; ValidElement:  True; Size:  1; Flags: ARR_NONE),
   { varWord/vt_ui2           $12 }
   (ValidBase:  True; ValidElement:  True; Size:  2; Flags: ARR_NONE),
   { varSmallWord/vt_ui4      $13 }
   (ValidBase:  True; ValidElement:  True; Size:  4; Flags: ARR_NONE),
   { varInt64/vt_i8           $14 }
   (ValidBase: False; ValidElement:  True; Size:  8; Flags: ARR_NONE),
   {*varWord64/vt_ui8         $15 }
   (ValidBase: False; ValidElement: False; Size:  8; Flags: ARR_NONE));

почему это сделано для varInt64 - навскидку сложно сказать ..
прими пока как должное


 
WondeRu ©   (2005-07-19 11:07) [6]

в Variants.pas

....
if (not Odd(High(Bounds)) or (High(Bounds) > 127)) or
    (not VarTypeIsValidArrayType(AVarType)) then
 VarArrayCreateError;

....

function VarTypeIsValidArrayType(const AVarType: TVarType): Boolean;
begin
 Result := (AVarType in [CMinArrayVarType..CMaxArrayVarType]) and
           CVarTypeToElementInfo[AVarType].ValidBase;
end;

в VarUtils.pas
.....

   { varInt64/vt_i8           $14 }
   (ValidBase: False; ValidElement:  True; Size:  8; Flags: ARR_NONE),
....


короче  ValidBase у varInt64 "плохой" :(

как править?


 
WondeRu ©   (2005-07-19 11:09) [7]

Digitman ©   (19.07.05 11:02) [5]
:)
есть идеи как обойти?

ЗЫ. нашел извращенский способ:

var
 AArray: Variant;
begin
 AArray := VarArrayCreate([1, 2], varInteger);
 VarArrayPut(AArray, Int64Rec(ATemp).Lo, [1]);
 VarArrayPut(AArray, Int64Rec(ATemp).Hi, [2]);

но по идеологическим соображениям не подходит


 
Digitman ©   (2005-07-19 11:40) [8]


> WondeRu ©   (19.07.05 11:07) [6]


а что ты так зациклился на вариантных массивах ?
разных иных способов хранения такого рода данных разве нет ?


 
WondeRu ©   (2005-07-19 11:56) [9]

Digitman ©   (19.07.05 11:40) [8]
да нет... просто данные передаются между модулями...


 
Digitman ©   (2005-07-19 11:59) [10]

ну и передай TList ! .. элементами которого являются записи, содержащие Int64 ..

в чем проблема-то ?


 
Shuma ©   (2005-07-19 12:01) [11]

Попробуй конвертануть данные в строку и передать.


 
WondeRu ©   (2005-07-19 13:16) [12]

Digitman ©   (19.07.05 11:59) [10]
ну и передай TList ! .. элементами которого являются записи, содержащие Int64 ..

проблема в том, что данные могут находиться на другом компьютере и передаваться via DCOM


 
WondeRu ©   (2005-07-19 13:17) [13]

WondeRu ©   (19.07.05 13:16) [12]
тока в этом случае Variant заменю на OleVariant


 
Digitman ©   (2005-07-19 13:21) [14]


> via DCOM


возьми да и запиши содержимое TList в олей-вариантный массив


 
WondeRu ©   (2005-07-19 13:23) [15]

Digitman ©   (19.07.05 13:21) [14]
возьми да и запиши содержимое TList в олей-вариантный массив

)))
Тот же изврат ,что и в [7])


 
Digitman ©   (2005-07-19 13:27) [16]


> WondeRu ©   (19.07.05 13:23) [15]


значит весь MIDAS - тоже изврат

смотри, к примеру, модуль SConnect и метод Read/WriteVariant()


 
WondeRu ©   (2005-07-19 14:05) [17]

Digitman ©   (19.07.05 13:27) [16]
ну это не новость...)))
насчет TList ты загнул))) вот массив обычный можно.
из моего старого проекта:

 AValue := VarArrayCreate([1, 255], varWord);

 P := VarArrayLock(AValue);
 try
   CopyMemory(P, @Fxxxxx[1], 255 * 2);
 finally
   VarArrayUnlock(AValue);
 end;


но переписывание туда-сюда... некрасиво)


 
Digitman ©   (2005-07-19 14:08) [18]


> WondeRu ©   (19.07.05 14:05) [17]


ты, прежде чем "загнул - не загнул", почитал бы уже текст маршаллера ... из упомянутого модуля ...


 
WondeRu ©   (2005-07-19 14:19) [19]

Digitman ©   (19.07.05 14:08) [18]
носом ткни...
увидел тока конструкцию:

VList := VarArrayCreate([0, List.Count - 1], varOleStr);
for i := 0 to List.Count - 1 do
 VList[i] := List[i];


 
Digitman ©   (2005-07-19 15:10) [20]

Read/WriteVariant()



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.044 c
1-1121934083
cad2206
2005-07-21 12:21
2005.08.07
Упаковка строки


1-1121511757
Kreyl
2005-07-16 15:02
2005.08.07
Access Violation при использовании DATA MODULE


1-1121678132
granni
2005-07-18 13:15
2005.08.07
создание ресурсного файла


14-1121328888
Juice
2005-07-14 12:14
2005.08.07
Перевод исходников C++ <--> Delphi


14-1121765884
YurikGL
2005-07-19 13:38
2005.08.07
Хранение картинок в базе или в файле IB