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

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

Проблема с переменной [D7, WinXP]


Страницы:   1 2

Alexey_T-O ©   (2005-08-04 14:00:00) 

Код:
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.За ранее спасибо.


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

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


Digitman   (2005-08-05 12:30:00) [2]


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


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


evvcom   (2005-08-05 12:23:00) [3]

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


Digitman   (2005-08-05 11:25:00) [4]

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;


Digitman   (2005-08-05 10:38:00) [5]


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


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

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

p:='-1.00  (Glims)';

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

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

If rez[i,1]=p then

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


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

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-04 18:03:00) [7]

так..

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

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


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

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


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

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


Digitman   (2005-08-04 17:44:00) [10]


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


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

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

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

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

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


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

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:17:00) [12]

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

Complete Boolean Eval = ??

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


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

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


Digitman   (2005-08-04 15:28:00) [14]


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


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

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


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

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


Leonid Troyanovsky   (2005-08-04 15:25:00) [16]


> Alexey_T-O   (04.08.05 14:00)  

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


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

--
Regards, LVT.


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

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


Fay   (2005-08-04 15:06:00) [18]

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


Digitman   (2005-08-04 15:03:00) [19]


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


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


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


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


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


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


Fay   (2005-08-04 14:52:00) [20]

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


Страницы:   1 2

Наверх

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