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

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

Работа с Variant


HEXO4YXA ©   (2005-10-26 11:33:00) 

Вопрос по работе с типом 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 15:48:00) [1]

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


HEXO4YXA   (2005-10-26 15:41:00) [2]

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


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

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

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


Leonid Troyanovsky   (2005-10-26 12:13:00) [4]


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


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

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

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


Наверх

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