Главная страница
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.03 c
2-1130324508
serko
2005-10-26 15:01
2005.11.13
Отловить запуск другой программы


1-1130300515
MikeGipson
2005-10-26 08:21
2005.11.13
Не шевелится поток в ХР


6-1122645473
CAMCOH
2005-07-29 17:57
2005.11.13
Как отправить html письмо с помощью Insy IdSmtp


9-1120128029
D!m@N
2005-06-30 14:40
2005.11.13
Звук


2-1130077522
Vir
2005-10-23 18:25
2005.11.13
MS Excel