Ошибка invalid variant type conversion

 
Ольга
 
(2006-11-20 11:18)
[0]

Программа нормально подключает *.mdb через ADOConnection, но при активизации каждой adotable пишет ошибку «invalid variant type conversion». Правда, продолжает работать. Очень раздражает при многократной компиляции. А готовый exe-шник запускается без ошибок. Может, подскажете, в чем у меня ошибка?


 
clickmaker ©
 
(2006-11-20 11:23)
[1]


> Может, подскажете, в чем у меня ошибка?

например, попытка получить данные из пустого поля.
И зачем активизировать adotable при компиляции?


 
Ольга
 
(2006-11-20 11:25)
[2]

Пустых полей ни в одной таблице нет. Активизировать, чтобы данные сразу при загрузке формы отображались.


 
clickmaker ©
 
(2006-11-20 11:32)
[3]


> чтобы данные сразу при загрузке формы отображались

так а зачем это на этапе сборки?
Если уж на то пошло, то в OnCreate сделай Active := true


 
Ольга
 
(2006-11-20 11:36)
[4]

Итак на OnCreate. Мне надо продемонстрировать работу не только в исполняемом файле, но и объяснить, как она работает в Delphi. Нехорошо, что выпадают ошибки при компиляции.


 
clickmaker ©
 
(2006-11-20 11:47)
[5]


>  ошибки при компиляции

это не ошибка компиляции. Это значит, что неверно приводятся типы при получении данных из adotable. Значит, процесс подключения в дизайн-тайме отличается чем-то от рантайма, либо где-то умышленно гасится exception. Ищи в этом направлении


 
Stanislav ©
 
(2006-11-20 11:49)
[6]

Либо подключаешься на разные базы.


 
sniknik ©
 
(2006-11-20 12:03)
[7]

> либо где-то умышленно гасится exception.
точно точно, такое есть даже в генофонде и именно при переводе в конкретные типы из вариантов (вроде для строк это точно есть)

но тут вряд ли оно самое (модуль dcu не должен давать ексепта, он уже скомпилен, это если только исходники в перекомпиляцию попали…)

вообще это не проблема… гораздо больший глюк в том что используется adotable, а не adodataset.


 
Ольга
 
(2006-11-20 12:14)
[8]

В процессе работы отключала исключения, но сейчас ничего такого нет. С *.mdb работала первый раз, не знала, что лучше table или dataset. Работает без глюков кроме этого. Ладно, так сдам, все готово. Большое спасибо.


 
Umnik
 
(2006-11-20 12:17)
[9]

Вообще в Delphi можно отключить вывод ошибок, т.е. будет работать как exe, но помоему лучше разобраться.


 
Ольга
 
(2006-11-20 12:22)
[10]

Да потом как-нибудь. Включить/выключить вывод ошибок наши преподы и сами сумеют. А вот разобраться, в чем ошибка, не могут. Уже показывала. Это я уж для себя.


 
Плохиш ©
 
(2006-11-20 12:37)
[11]

Во народ :-) уже больше часа на полном серьёзе ищут ошибку в 17й строке :-)


 
Ольга
 
(2006-11-20 13:36)
[12]

Кстати, при использовании ADODataSet вместо ADOTable та же ошибка


 
Плохиш ©
 
(2006-11-20 13:44)
[13]


> Ольга   (20.11.06 13:36) [12]
> Кстати, при использовании ADODataSet вместо ADOTable та
> же ошибка

Простой заменой типов объктов ошибка в 17й строке не может быть исправлена.

PS. Так проблемный код будет или нет?
PPS. Проблемным является код, на котором останавливается отладчик, при возникновении исключения, указанного в [0].


 
Ольга
 
(2006-11-20 13:48)
[14]

код: form1.ADOTable1.Active:=true;


 
Ольга
 
(2006-11-20 13:49)
[15]

проблемный.
на котором ошибка.


 
Куб
 
(2006-11-20 13:52)
[16]

А DataSource к какому визуальному компоненту подключен? Возможно это он ругается.


 
Куб
 
(2006-11-20 13:55)
[17]

А вообще:
Меню: ToolsDebbuger optionsLanguage Exceptions — Stop on Delphi Exceptions (убрать галку)


 
Ольга
 
(2006-11-20 13:58)
[18]

в том смысле, что какой визуальный компонент подключен в датасорсу:
гриды и эдиты


 
Ольга
 
(2006-11-20 14:02)
[19]

umnik при это меню и писал


 
Куб
 
(2006-11-20 14:06)
[20]

Если у гридов и едитов убрать DataSource — ругается?


 
Куб
 
(2006-11-20 14:06)
[21]

[20]
+
при form1.ADOTable1.Active:=true;


 
Ольга
 
(2006-11-20 14:41)
[22]

да


 
Плохиш ©
 
(2006-11-20 16:05)
[23]


> Ольга   (20.11.06 14:41) [22]

Какие обработчики событий имеются у этого form1.ADOTable1?

> Ольга   (20.11.06 13:48) [14]
> код: form1.ADOTable1.Active:=true;

Враньё…


 
sniknik ©
 
(2006-11-20 20:58)
[24]

>> код: form1.ADOTable1.Active:=true;
> Враньё…
да нет, возможно, даже если там никаких обработчиков вобще… не факт что в этом случае так оно и есть, но возможно.

это не первый подобный вопрос сдесь, были раньше, тогда в одном случае я даже проверял, дотрассировывал до того места в генофонде где ексепт возбуждался (и гасился в обработке выше уровнем… т.е. так была сделана конвертация в строку). правда с тех пор уже поставлено два sp-ка на 7ку, т.что возможно обработка изменена, не найти… да и не собираюсь искать неизвестно что (прошлый раз были конкретные условия, база, строка подключения, на каком поле возникает. и т.д. т.е был более адекватный собеседник). но то что это было, именно такая ошибка, и именно при открытии, и гдето в генофонде(не в собственных обработчиках) это точно.
вместо поисков могу только посоветовать обновить jet, и поставить все sp на дельфи…


 
Плохиш ©
 
(2006-11-21 01:54)
[25]


> sniknik ©   (20.11.06 20:58) [24]

Сталкивался с таким в пятёрке без сервиспаков, в семёрке не приходилось.
А судя по form1, тут ни какой телепатор не поможет.


 
sniknik ©
 
(2006-11-21 12:24)
[26]

кстати да, возможно это было еше в 5-6ке, уж очень смутные воспоминания о подобном глюке, давно было.

просто не исключаю вероятности, может он както воспроизвел условия при которых этот старый «глюк»(вернее обработчик с использованием ексепта, глюком в полном смысле это назвать нельзя) восстановился…
например раньше (в 5ке) я делал подключение модуля ADODB в проект и правил там кое что (таймауты в основном, они не менялись по нормальному), это чтобы генофонд не трогать. вот. если откопать какойнибудь очень старый мой проект с подключенным и таскаемым с собой модулем из пятерки то в семерке он может и откомпилится с минимальными правками но обработчики то будут старые… т.е. вариант номер раз.
недавно тут узнал есть такая Delphi 7.2 SE… (у борланда такой нет у него максимум 7.1.1 (SP 1.1)). это «энтузиасты» вытрясли из дельфей все «лишнее»… и позиционируют ее как развитие семерки (версия больше), все бы ничего, но в ней всплывают глюки которых в семерке отродясь не было, но были раньше… т.е. ктото там (кроме вытрясания «веса») основательно покопался в гефонде… какойто поклонник более старой версии, а то и не думая вообще старые модули туда перенес (они дают размер меньше… а там именно за размер так понимаю борьба была). — т.е. это вариант номер два.
и кстати, когда узнал про эту версию стало понятно откуда столько вопросов с возмущениями «чего вы меня в хелп посылаете, его у меня нет»… хелп это дополнительный размер… наверное его оттуда тоже убрали как лишнее, а пользуются этой версией похоже многие.


 
Ольга
 
(2006-11-21 12:33)
[27]

Эх, мужчины. Вы же тоже наверняка не знаете, как надалить успешное грудное вскармливание, но вас никто не называет неадекватными собеседниками. А обработчиков событий, кстати, нет. А работу я уже сдала. Будьте здоровы.


 
sniknik ©
 
(2006-11-21 12:46)
[28]

> но вас никто не называет неадекватными собеседниками.
если бы я вдруг это спросил, ничего в этом не соображая и без желания научится… то я именно таким бы и был, неадекватным. мог бы называть, не обиделся бы.

> А работу я уже сдала.
вот вот, цель не научится/разобраться в чем дело, цель спихнуть курсовой, и забыть все как страшный сон..


 
clickmaker ©
 
(2006-11-21 12:48)
[29]


> [28] sniknik ©   (21.11.06 12:46)
> > А работу я уже сдала.
> вот вот, цель не научится/разобраться в чем дело, цель спихнуть
> курсовой, и забыть все как страшный сон..

А зачем девушке Дельфи? Не женское это дело.
> успешное грудное вскармливание
вот это дело


 
ЮЮ ©
 
(2006-11-21 12:51)
[30]


> Вы же тоже наверняка не знаете, как надалить успешное грудное
> вскармливание,

Почему же тоже? Я даже и слова такого не знаю надалить :)


 
sniknik ©
 
(2006-11-21 13:00)
[31]

> А зачем девушке Дельфи? Не женское это дело.
тогда пусть и не лезет, пусть вскармливает, но я не уверен что это девушка.

посмотри на темы, от него три вопроса все по разным базам  парадокс, аксесс, mssql… учился в институте? тебе задавали по одному курсу (тут видимо базы) три разнотипных курсовика??? вот, вот. тут скорее не девушка пишущая программы в перерывах между вскармливаниями, тут волонтер за деньги делающий несколько курсовиков одногрупникам (тремя не ограничено, у него скорее всего еще темы под другими именами есть…).
девушкой подобного волонтера мне чтото совсем не представляется…


 
Ольга
 
(2006-11-21 13:14)
[32]

Не хотела больше писать, но это неправда. Может, в других темах тоже есть Ольги (отнюдь не редкое имя), но я не из числа таких волонтеров. Ты мне, что ли, собрался запретить одновременно получать высшее образование и рожать? Желчный пузырь надо проверить.


 
Плохиш ©
 
(2006-11-21 13:19)
[33]

Kirche, Küche, Kinder


 
clickmaker ©
 
(2006-11-21 13:21)
[34]


> одновременно получать высшее образование и рожать?

вот одновременно как раз не стоит.
Важные дела лучше не совмещать


 
Ольга
 
(2006-11-21 13:27)
[35]

Уж не беспокойтесь, в порядке очередности. И вообще, мы все сейчас не в теме.


 
clickmaker ©
 
(2006-11-21 13:34)
[36]


> мы все сейчас не в теме.

дык курсовой сдан, тема закрыта. Можно и так потрещать, разве нет?


 
Ольга
 
(2006-11-21 13:37)
[37]

неа, у меня еще Kirche, Küche и Kinder.


 
Плохиш ©
 
(2006-11-21 13:41)
[38]


> Ольга   (21.11.06 13:37) [37]
> неа, у меня еще

Это не «ещё», это вместо…


 
Anatoly Podgoretsky ©
 
(2006-11-21 13:41)
[39]

> sniknik  (21.11.2006 12:24:26)  [26]

> недавно тут узнал есть такая Delphi 7.2 SE… (у борланда такой нет у него максимум 7.1.1 (SP 1.1)).

Надо Борланду продать и у них будет.


 
Anatoly Podgoretsky ©
 
(2006-11-21 13:45)
[40]

> clickmaker  (21.11.2006 13:34:36)  [36]

Не закрыта, автора сменил тему на более животрепещую, как мужику вскормить ребенка грудью.


I’m having trouble with variables on FastReport…

I added the function AnsiReplaceStr to my FastReport, using the AddFunction method and the OnUserFunction event… It appears to be added correctly, but when I tried to call the function, I get the error «Invalid variant type conversion»…

This error appears for me everytime I try to use a variable on FastReport…

I created a variable on Fast and I tried to use it that way:

procedure MemoCliOnBeforePrint(Sender: TfrxComponent);
Var wI : Integer;
begin
    MemoCli.Memo.Clear;
    MemoCli.Memo.Add( 'A' );
    For wI := 1 To StrToInt( Copy( VarToStr( <wCliSpaces> ), 1, 2 ) ) Do
        MemoCli.Memo.Add( ' ' );
End;

But the error appears here too…

Finally, how to use variables on FastReport? Where is my error?

Best regards.

>
Перегнать динамический массив
, в OleVariant

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
27.07.06, 10:06

    Full Member

    ***

    Рейтинг (т): 11

    Привет всем! Суть вопроса в следующем: у меня есть COM объект, через один из методов которого надо вернуть динамический массив структур (record’ов).

    ExpandedWrap disabled

      type

        TUserList=record

           uid, compname, uname, cstat, utype: string;

           end;

           TULMas=array of TUserList;

    Сделать это видимо прийдется через OleVariant (обычный variant в библиотеке типов задать не получается). Делаю в 2 этапа: 1. Преобразовать массив к варианту. 2. преобразовать Variant к OleVariant.
    Проблема уже на первом этапе — не получается ни в какую преобразовать динамический массив к варианту!
    Делал так:

    ExpandedWrap disabled

      aa: Variant;

      ULMas: TULMas;

      …..

      DynArrayToVariant(aa, ULMas, inf);

    Выдает ошибку «invalid variant type conversion».
    Пробовал создать массив варианта и потом поэлементно перегнать в него мой динамический массив:

    ExpandedWrap disabled

      Aa := VarArrayCreate([0, length(ULMas)-1], varVariant);

            for i:= 0 to length(ULMas)-1 do

            begin

              aa[i]:= ULMas[i];

            end;

    Тогда просто говорит, что не совместимые типы variant и TUserList.
    Как тут быть? Заранее спасибо!

    PS: поиском я пользовался и ничего подходящего не нашел. Если вопрос уже обсуждался, буду очень признателен за ссылку или за ключевые слова для поиска.


    Testudo



    Сообщ.
    #2

    ,
    27.07.06, 10:26

      А кто тебе сказал, что в Variant и OLEVariant можно пихать что попало? Там есть свой список типов…


      SilverShield



      Сообщ.
      #3

      ,
      27.07.06, 10:30

        Full Member

        ***

        Рейтинг (т): 11

        Я не спорю. Вопрос в том, как тогда задачу решить? Надо как-то передать этот динамический масив…


        Romkin



        Сообщ.
        #4

        ,
        27.07.06, 10:42

          1. Берешь переменную OleVariant
          2. Через VarArrayCreate делаешь в нем нужный массив
          3. Делаешь VarArrayLock — копируешь память — Делаешь VarArrayUnlock (в finally конечно)
          3а Или просто пользуешься этим массивом :)

          Добавлено 27.07.06, 10:47
          А в случае, когда у тебя запись — увы, не так все просто. В варианте только простые типы есть, там SafeArray. Почему бы тебе не сделать отдельный интерфейс для передачи коллекции?


          SilverShield



          Сообщ.
          #5

          ,
          27.07.06, 11:02

            Full Member

            ***

            Рейтинг (т): 11

            Цитата Romkin @ 27.07.06, 10:42

            Почему бы тебе не сделать отдельный интерфейс для передачи коллекции?

            имеешь в виду сделать отдельный инерфейс с той структурой, что у меня сейчас в record? Но я ведь все равно не смогу передавать массив, только элементы по отдельности… Или я неправильно понял?


            Testudo



            Сообщ.
            #6

            ,
            27.07.06, 11:08

              Не в том разделе спрашиваешь, есть ведь раздел для OLE/COM…

              Profi

              Shaggy



              Сообщ.
              #7

              ,
              27.07.06, 11:10

                Moderator

                *****

                Рейтинг (т): 130

                uid, compname, uname, cstat, utype длиннее 255 символов?
                если нет, то использовать ShortString или String[Х] и передавать просто массив байт

                Master

                jack128



                Сообщ.
                #8

                ,
                27.07.06, 11:15

                  Moderator

                  ******

                  Рейтинг (т): 181

                  сохраняешь данные в Stream в каком хочешь формате и перегоняешь этот стрим в OleVariant по методике Romkin’a.

                  Добавлено 27.07.06, 11:15

                  Цитата Testudo @ 27.07.06, 11:08

                  есть ведь раздел для OLE/COM…

                  олей тут слабо пахнет…


                  Romkin



                  Сообщ.
                  #9

                  ,
                  27.07.06, 11:57

                    Цитата SilverShield @ 27.07.06, 11:02

                    имеешь в виду сделать отдельный инерфейс с той структурой, что у меня сейчас в record? Но я ведь все равно не смогу передавать массив, только элементы по отдельности… Или я неправильно понял?

                    По методу коллекции. На мой взгляд, строки так передавать удобнее. Объявляешь у себя в библиотеке типов record, и интерфейс с методами доступа к i-й записи (Минимум — в IEnumVariant, стандарт — см TCollection). Правда, с записями я не работал.
                    А вот коллекцию делали, для передачи таблицы БД через интерфейс, там интерфейс доступа к коллекции интерфейсов :)

                    Добавлено 27.07.06, 11:59
                    Просто надо понимать, что типы, объявленные в библиотеке типов, при ее использовании становятся известными. А там можно объявить и перечисление, и запись…


                    SilverShield



                    Сообщ.
                    #10

                    ,
                    28.07.06, 06:28

                      Full Member

                      ***

                      Рейтинг (т): 11

                      :wacko: Наверное когда начну делать, станет понятней… Спасибо всем!


                      SilverShield



                      Сообщ.
                      #11

                      ,
                      28.07.06, 08:18

                        Full Member

                        ***

                        Рейтинг (т): 11

                        Цитата Romkin @ 28.07.06, 06:28

                        А вот коллекцию делали, для передачи таблицы БД через интерфейс, там интерфейс доступа к коллекции интерфейсов

                        Romkin, можно здесь поподробней? Собственно это и есть изначальная задача: передать таблицу БД.
                        Технология какая получается: создаю коллекцию (TColumns компонент TDBGrid), заполняю ее данными из моего запроса. При помощи методов типа GetRec(i) интерфейса выбираю по очереди из нее все записи, заталкиваю их в заготовленный record (интерфейса). А на другой стороне разгребаю эти record ы интерфеса…

                        Сообщение отредактировано: SilverShield — 28.07.06, 08:23


                        Romkin



                        Сообщ.
                        #12

                        ,
                        28.07.06, 10:36

                          Так писал бы сразу универсальный набор интерфейсов. На будущее. А то потом еще одну табличку перегнать понадобится, мало ли :)
                          И почему TDBGrid, неужели Fields датасета недостаточно?
                          Сделай проще: реализуй интерфейс IMyRecords как минимум с методами навигации и BOF/EOF, а из его проперти Fields возвращай другой интерфейс, коллекцию полей. А у него методы Count и ItemName(i) — BSTR (WideString), ItemValue(i) — здесь Variant возвращай. Достаточно будет. Понятно, берешь этот интерфейс, и когда у его владельца next вызвано — его методы возвращают значения полей другой записи. Вот так и перегонишь.
                          Кстати, а что, через ADO напрямую — никак? Там вообще ничего писать не надо, соединяешься — и вперед.


                          SilverShield



                          Сообщ.
                          #13

                          ,
                          28.07.06, 11:07

                            Full Member

                            ***

                            Рейтинг (т): 11

                            Romkin, спасибо! Будет чем заняться в выходные :)

                            Цитата Romkin @ 28.07.06, 10:36

                            Кстати, а что, через ADO напрямую — никак?

                            Я с FireBird работаю, потому и пользую IBX, через ADO то да, можно просто _Recordset через тотже OleVariant передать.


                            Romkin



                            Сообщ.
                            #14

                            ,
                            28.07.06, 11:18

                              Если хватает возможеностей FreeIBProvider — то это будет самое простое. Ничего передавать не надо. Ничего писать не надо. Установить провайдер — и вперед. ADO легко работает через позднее связывание, из любого VBA спокойно подключишься.
                              В 1С небось? Там тоже элементарно доступ через ADO получить. Правда, в 8 версии они накосячили с СОМ, так что…


                              SilverShield



                              Сообщ.
                              #15

                              ,
                              28.07.06, 11:37

                                Full Member

                                ***

                                Рейтинг (т): 11

                                Нет, это не 1С, это я сам намудрил :)

                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                0 пользователей:

                                • Предыдущая тема
                                • Delphi: Общие вопросы
                                • Следующая тема

                                [ Script execution time: 0,0427 ]   [ 16 queries used ]   [ Generated: 7.06.23, 08:27 GMT ]  

                                Below I am providing two examples of converting a dynamic array of some data to a variant. In first example array holds Integers, in second example array holds TMyEnums.

                                I would think that both examples are pretty simmilar, however, the second example returns an error «Invalid variant type conversion» during runtime.

                                program Project128;
                                
                                {$APPTYPE CONSOLE}
                                
                                uses
                                  SysUtils, Variants;
                                
                                type
                                  TIntegerArray = array of Integer;
                                
                                type
                                  TMyEnum = (meOne, meTwo, meFour, meTen);
                                  TMyEnumArray = array of TMyEnum;
                                
                                var
                                  LVar1, LVar2: Variant;
                                  LIntArray : TIntegerArray;
                                  LMyEnumArray: TMyEnumArray;
                                begin
                                  SetLength(LIntArray, 2);
                                  DynArrayToVariant(LVar1, LIntArray, TypeInfo(TIntegerArray)); //Works
                                
                                  SetLength(LMyEnumArray, 2);
                                  DynArrayToVariant(LVar2, LMyEnumArray, TypeInfo(TMyEnumArray)); //Invalid variant type conversion
                                end.
                                

                                Is it possible to convert array of enums to a variant? I know that I could use array of integers and cast them back to enums but I do not want to do this.

                                Понравилась статья? Поделить с друзьями:
                              • Ошибка intel widi
                              • Ошибка install failed no matching abis
                              • Ошибка invalid username or password
                              • Ошибка intel undi
                              • Ошибка invalid use of incomplete type class