Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Вниз

Проблема с переменной   Найти похожие ветки 

 
Alexey_T-O   (2005-08-04 14:00) [0]

Код:
var
 x:variant;
 rez:array [1..100,1..2] of variant;
 i:integer;
 p:variant;
begin
 x:=CreateOleObject("Excel.Application");
 x.workbooks.open(ExtractFilePath(ParamStr(0)) +"Test.xls");
 x.worksheets[1].Select;
 for i:=1 to 100 do
 begin
  rez[i,1]:=x.worksheets[1].Cells[i,1];
  rez[i,2]:=x.worksheets[1].Cells[i,5];
 end;

 x.quit;
 x:=Unassigned;

 p:="-1.00  (Glims)";  <<< Как можно отделить -1 от (Glims)?
 i:=1;
 for i:=1 to 100 do
 If rez[i,1]=p then showmessage("OK");

Почему выскакивает ошибка "Invalid variant operations" ? Ведь в ячейках EXCEL"я лежит как текст так и цифры.
P.S.За ранее спасибо.


 
Digitman ©   (2005-08-04 14:03) [1]

rez:array [1..100,1..2] of Olevariant

!!


> p:="-1.00  (Glims)";  <<< Как можно отделить -1 от (Glims)?


что значит "отделить" ? кастрировать что ли ?)


 
Alexey_T-O   (2005-08-04 14:25) [2]

>> p:="-1.00  (Glims)";  <<< Как можно отделить -1 от (Glims)?
>что значит "отделить" ? кастрировать что ли ?)

Да, имеется в виду как создать поиск в переменной где он будет брать значения до пробела или допустим после него?
P.S. Даже не могу выразить свою благодарность. Мучаюсь 2 недели с OLEvariant.


 
Alexey_T-O   (2005-08-04 14:46) [3]

>rez:array [1..100,1..2] of Olevariant

Все равно не работает. Также ругается.


 
Fay ©   (2005-08-04 14:52) [4]

Digitman ©   (04.08.05 14:03) [1]
>> Olevariant !!
Не критично в д.сл.


 
Digitman ©   (2005-08-04 15:03) [5]


> Fay ©   (04.08.05 14:52) [4]


> Не критично в д.сл.


Да, не критично, но когда-либо обязательно "выстрелит".


> Alexey_T-O   (04.08.05 14:46) [3]


> выскакивает ошибка "Invalid variant operations"


при попытке исполнения КАКОЙ конкретно строчки упомянутого кода ?


 
Fay ©   (2005-08-04 15:06) [6]

2 Digitman ©   (04.08.05 15:03) [5]
При сравнении строки  с null, судя по всему.
If rez[i,1]=p then


 
Alexey_T-O   (2005-08-04 15:22) [7]

ошибка вылазит при сравнении If rez[i,1]=p then А как обойти это нулевое значение?


 
Leonid Troyanovsky ©   (2005-08-04 15:25) [8]


> Alexey_T-O   (04.08.05 14:00)  

>   rez[i,1]:=x.worksheets[1].Cells[i,1];


Может .Value?
См. VBA Help.

--
Regards, LVT.


 
Fay ©   (2005-08-04 15:28) [9]

2 Alexey_T-O   (04.08.05 15:22) [7]
Да хоть так
If (VarIsNull(rez[i,1])) then
 rez[i,1]=p then showmessage("OK")


 
Digitman ©   (2005-08-04 15:28) [10]


> как обойти это нулевое значение?


его не надо обходить.

if (TVarData(rez[i,1]).VType = TVarData(p).VType) and (rez[i,1]=p) then ...


 
Alexey_T-O   (2005-08-04 17:12) [11]

if (TVarData(rez[,1]).VType = TVarData(p).VType) and (rezz=p) then
  showmessage(rez);
ошибка пропала, но showmessage выводит пустое окно, в любом случае равно rez = p или неравно.


 
Digitman ©   (2005-08-04 17:17) [12]

сие поведение сильно зависит от состояния опции "Свойств проекта"

Complete Boolean Eval = ??

мой расчет был направлен нат True..


 
Alexey_T-O   (2005-08-04 17:37) [13]

var
 x:variant;
 rezz:olevariant;
 p:Variant;
begin
 x:=CreateOleObject("Excel.Application");
 x.workbooks.open(ExtractFilePath(ParamStr(0)) +"test.xls");
 x.worksheets[1].Select;
  rezz:=x.worksheets[1].Cells[1,1];
 x.quit;
 x:=Unassigned;
 p:="123";
  if (TVarData(rezz).VType = TVarData(p).VType) and (rezz=p) then showmessage(rezz);
 
end;

Упрощаю вариант. в test.xls в позиции 1,1 пишу "123". Неработает. Complete Boolean Eval=True.


 
Digitman ©   (2005-08-04 17:44) [14]


> мой расчет был направлен на True..


тьфу ты !
пардон) на False, конечно же ..

иными словами, если условие

TVarData(rez[,1]).VType = TVarData(p).VType

ложно, то нехрена проверять следующее за and условие ...

трассировка пошаговая ЧТО показывает ?


 
Alexey_T-O   (2005-08-04 17:55) [15]

показывает ошибку "Invalid variant operations"
значения rezz=$0015ccdc а p=123 соответственно.


 
Alexey_T-O   (2005-08-04 18:01) [16]

Поправил. Ошибку не выдает. Сравнение на работает а при попытке showmessage(rezz) ругается что несоответствие dispatch и string.
можно както перевести Dispatch в String? И что такое Dispatch?


 
Digitman ©   (2005-08-04 18:03) [17]

так..

детализируем (учимся отладке) и меняем текст :

if (TVarData(rez[i,1]).VType = TVarData(p).VType) then //что видим здесь (*) ?
if rez[i,1]=p then   // что видим здесь, при условии что (*)=True


 
Alexey_T-O   (2005-08-05 10:24) [18]

if (TVarData(rez[i,1]).VType = TVarData(p).VType) then тут в rez и p лежит Unassigned. А до if rez[i,1]=p then так и не доходит.
А при Complete true rez = $0015B4FC а p=1 и до второй проверки недоходит.


 
Digitman ©   (2005-08-05 10:38) [19]


> тут в .. p лежит Unassigned


да быть того не может !

при этом присвоении

p:="-1.00  (Glims)";

VType тут же станет равным varString и более нигде, судя по твоему коду, не меняется

а ниже по тексту ты делаешь проверку

If rez[i,1]=p then

которая при "тут в rez .. лежит Unassigned" , разумеется, приведет к исключению "Invalid variant operations"


 
Digitman ©   (2005-08-05 11:25) [20]

x:=CreateOleObject("Excel.Application");
 try
   x.workbooks.open(ExtractFilePath(ParamStr(0)) +"test.xls");
   x.worksheets[1].Select;
   rezz:=x.worksheets[1].Cells[1,1];
 p:="1";
 if rezz.Value = p then showmessage(rezz.Value);

 finally
   x.quit;
   x:=Unassigned;
 end;


 
evvcom ©   (2005-08-05 12:23) [21]

и rezz:=Unassigned; в finally, а то не отпустится excel


 
Digitman ©   (2005-08-05 12:30) [22]


> evvcom ©   (05.08.05 12:23) [21]


угу.. упустил .. важное замечание


 
Alexey_T-O   (2005-08-05 13:17) [23]

Ураа. Работает идеально. Спасибо, всем огромное.



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

Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.038 c
14-1123225248
Skywalker
2005-08-05 11:00
2005.08.28
Нету исходников (((((


4-1121333131
Pig Pen
2005-07-14 13:25
2005.08.28
Полупрозрачная форма


14-1123239992
12DFBDDh
2005-08-05 15:06
2005.08.28
С днем железнодорожника!


1-1123585085
Андрей Жук
2005-08-09 14:58
2005.08.28
Приведение типов в наследниках


4-1120717532
dmitry501
2005-07-07 10:25
2005.08.28
Использование таймера в сервисе/службе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский