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

Вниз

Работа с Variant   Найти похожие ветки 

 
HEXO4YXA ©   (2005-10-26 11:33) [0]

Вопрос по работе с типом Variant

Функция Locate принимает тип Variant, в который я хочу засунуть динамический массив.

Динамический массив преобразуеться в тип Variant функцией DynArrayToVariant, но при этом возникает эксепшн EVariantTypeCastError "Invalid variant type conversion".

Что я делаю не так ?

вот код:

var KeyFields: string;
   KeyValues: Variant;
   a: array of integer;
   ss: TStringList;
begin with dm do begin
  KeyFields := "";
  if cbFindInst.Text <> "" then begin
     KeyFields := KeyFields + "INST";
     SetLength(a, 1);
     a[0] := 1;
  end;
  if eFindREGNUM.Text <> "" then begin
     KeyFields := KeyFields + ";REG_NUM";
     SetLength(a, 2);
     a[1] := StrToInt(eFindREGNUM.Text);
  end;
  if eFindREGYEAR.Text <> "" then begin
     KeyFields := KeyFields + ";REG_YEAR";
     SetLength(a, 3);
     a[2] := StrToInt(eFindREGYEAR.Text);
  end;

  if KeyFields <> "" then begin

     // Сдесь возникает эксепшн
     DynArrayToVariant(KeyValues, @a, TypeInfo(integer));

     fibFindCases.Locate(KeyFields, KeyValues, [loPartialKey]);
  end;  
end; end;


 
Плохиш ©   (2005-10-26 11:40) [1]

На разбирайся

var
   varSearch:  Variant;
   lstFields:  TStrings;
....
     varSearch := VarArrayCreate( [0, lstFields.Count-1], varVariant );
     for lCount := 0 to lstFields.Count-1 do
       varSearch[lCount] := tblMSSQL.FindField(lstFields.Strings[lCount]).Value;
     if lstFields.Count = 1 then
       Result := tblPostgre.Locate( strSearch, varSearch[0], [loCaseInsensitive] )
     else
       Result := tblPostgre.Locate( strSearch, Variant(varSearch), [loCaseInsensitive] );


 
Leonid Troyanovsky ©   (2005-10-26 12:13) [2]


> HEXO4YXA ©   (26.10.05 11:33)  

> Динамический массив преобразуеться в тип Variant функцией
> DynArrayToVariant, но при этом возникает эксепшн EVariantTypeCastError
> "Invalid variant type conversion".

> Что я делаю не так ?


Для того, чтобы пользоваться оной функцией нужно обладать
стальными нервами.
Т.е., проще всего собс-ручно создавть массив variant, благо
это гораздо проще. И, более того, нет уверенности, что Locate
нужно именно то самое.

--
Regards, LVT.

ЗЫ: Вот пример  преобразований:

type
 TLongArray = array of Longint;

procedure TForm1.Button1Click(Sender: TObject);
var
 a: array of Longint;
 v: Variant;
begin
 SetLength(a, 2);
 a[0] := 1;
 a[1] := 2;
 DynArrayToVariant(v, a, TypeInfo(TLongArray));
 SetLength(a,0);
 DynArrayFromVariant(Pointer(a), v, TypeInfo(TLongArray));
 Caption := Format("%d %d", [a[0], a[1]]);
end;


 
HEXO4YXA ©   (2005-10-26 15:39) [3]

да нервы вобщемто у меня стальные... только...

Тогда такой вопрос, как в тип Variant динамически добавить элемент ?


 
HEXO4YXA ©   (2005-10-26 15:41) [4]

извините... не в тип конечно, а в переменную типа Variant


 
Плохиш ©   (2005-10-26 15:48) [5]

VarArrayRedim, если это имелось в виду.



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

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

Наверх




Память: 0.48 MB
Время: 0.038 c
2-1130246477
syte_ser78
2005-10-25 17:21
2005.11.13
table.active


2-1129617492
TruthMan
2005-10-18 10:38
2005.11.13
Запись в таблицу через сервер Word


2-1129569313
Bogdan1024
2005-10-17 21:15
2005.11.13
типо createprocess


2-1129539802
kyn66
2005-10-17 13:03
2005.11.13
Как корректно закрыть файл лога?


2-1129895544
Quattro
2005-10-21 15:52
2005.11.13
Добавление строкв СтрингГрид