Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка при создании вариантного массива


WondeRu ©   (2005-07-19 10:40:00) 

Делаю так:

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


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

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


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

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


Digitman   (2005-07-19 15:10:00) [1]

Read/WriteVariant()


WondeRu   (2005-07-19 14:19:00) [2]

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 14:08:00) [3]


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


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


WondeRu   (2005-07-19 14:05:00) [4]

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 13:27:00) [5]


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


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

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


WondeRu   (2005-07-19 13:23:00) [6]

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

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


Digitman   (2005-07-19 13:21:00) [7]


> via DCOM


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


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

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


WondeRu   (2005-07-19 13:16:00) [9]

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

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


Shuma   (2005-07-19 12:01:00) [10]

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


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

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

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


WondeRu   (2005-07-19 11:56:00) [12]

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


Digitman   (2005-07-19 11:40:00) [13]


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


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


WondeRu   (2005-07-19 11:09:00) [14]

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]);

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


WondeRu   (2005-07-19 11:07:00) [15]

в 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 "плохой" :(

как править?


Digitman   (2005-07-19 11:02:00) [16]

тип 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 - навскидку сложно сказать ..
прими пока как должное


dmitry501   (2005-07-19 11:02:00) [17]

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


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


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

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


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

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


dmitry501   (2005-07-19 10:55:00) [20]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо