Добрый день, коллеги.
Какая-то непонятка с этой внешней компонентой.
При вводе нового документа активирую весы стандартным кодом:
//инициализация
Весы = Новый COMОбъект("Ci2001A.Indic");
Весы.NumberOfCom = 4;
//инициализацию проходит на ура. Далее, начало работы:
//открытие
Попытка
Весы.Open();
Весы.Close();
COM4 = Истина;
Весы.NumberOfCom = 4;
Исключение
ПризнакАктивации = Ложь;
КонецПопытки;
И вот здесь вываливается в исключение до следующего сеанса работы с программой. Перезапускаю - все норм до ввода следующего документа. Потом - опять исключение. ЧЯДНТ??
Спасибо!
я конкретно с этим индикатором не работал. Но, может, сначала задать номер компорта, а потом уже открывать?
Посмотрите вот тут:
http://www.delphisources.ru/forum/showthread.php?t=22143 логика немножко не такая как у вас:
Ci2001ALib::IIndicPtr p("Ci2001A.Indic");
p->NumberOfCom = 1;
p->Open();
// Читаем данные
p->Update();
cout << p->Weight;
cout << p->Stab;
// Ждем пять сек.
Sleep(5000);
// Читаем данные
p->Update();
cout << p->Weight;
cout << p->Stab;
(1) ну я ж и слизывал с этого примера на сях.
Разобрался!
Если кому интересно: перед закрытием формы надо принудительно закрывать сеанс работы с библиотекой методом Весы.Close(). Я хз какое у него пространство имен, но он, по ходу, входит в ступор, когда пытается вновь открыть вновь созданный объект с таким же именем.
(3) конечно очевидно. Просто я закрываю библиотеку после каждого факта взвешивания. Получается, что где-то недозакрыл. Так я в форме нового документа пытался закрыть - ниче мне это не дало.
(4) А может, подумать в сторону... как с торговым оборудованием? Т.е. глобальный объект, открывается при старте программы, закрывается при завершении, а из формы только чтение с весов происходит. Не вариант?
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший