Форум: "Основная";
Текущий архив: 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