Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.047 c
1-1121420117
granni
2005-07-15 13:35
2005.08.07
отладка dll


6-1114645111
Павлов_
2005-04-28 03:38
2005.08.07
TCP сервер на неблок. сокетах


8-1112156495
Steker
2005-03-30 08:21
2005.08.07
DelphiX


14-1120845166
gn
2005-07-08 21:52
2005.08.07
Тотальный контроль ожидается к 2010 году


14-1121405345
rentgen
2005-07-15 09:29
2005.08.07
Глюки форума или глюки у меня





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский