Адрес этой странички :
http://doc-prg.narod.ru/art_00070/art_00070.htm
Дата обновления : 26.12.2009
© 26.12.2009 Сергей Попов
Здесь следует отметить, что приведенная ниже статья носит чисто
иллюстративный характер и не претендует на бОльшее.
Для серьезной и углубленной проработки специальных вопросов информационного
обмена крайне рекомендуется использовать фирменное техническое описание системы
1Cv8.
1Cv8 + Delphi-5 .. 7.
OLE (COM).
Глюк в 1Cv80 ... 1Cv82, связанный с открытием форм в InProc COM-Server.
Статью в виде файла (1.7 Мб) можно скачать здесь: art_00070.zip
Проведем простой эксперимент (в среде
Delphi-5 создадим простейший внутрипроцессный
COM-сервер).
Ниже приведены "картинки" по-шагово
иллюстрирующие этот процесс.
Сохраним наш проект в какую-либо папку под
каким- либо именем.
Например так, как показано ниже :
Далее :
В результате Delphi сгенерирует следующий код :
Далее, создадим простую диалоговую форму :
И изменим сгенерированный по умолчанию текст следующим образом :
Далее, откроем текст модуля cipd5_MyFunc.pas (см. рисунок выше) и внесем след. изменения :
Скомпилируем наш проект и "зарегистрируем"
DLL-ку (InProc COM-server) :
Создадим новую внешнюю обработку в среде 1Cv82 (или 1Cv80) :
Сохраним обработку в файл :
Создадим форму обработки :
Создадим для формы обработчик события "ПриОткрытии" :
И внесем следующие изменения в текст модуля формы :
Положим на форму кнопку и создадим обработчик нажатия на эту кнопку :
Теперь протестируем метод ShowMyForm_1 нашего COM-сервера :
Запустим 1Cv82 в режиме RunTime и откроем файл нашей обработки :
И "нажмем" на кнопку ShowMyForm_1
:
На экране появится окно нашей диалоговой
формы.
Теперь, нажмем на кнопку OK или Cancel (нашей диалоговой формы) :
Т.е.,
все "как и всегда" - предсказуемо ...
Так, как и должно быть.
Хочу
обратить внимание на то, что ссылка на нашу
диалоговую форма TOKBottomDlg
объявлена,
как локальная переменная метода ShowMyForm_1
:
procedure TTools.ShowMyForm_1;
Var
fMyDialog_TMP : TOKBottomDlg;
begin
fMyDialog_TMP := TOKBottomDlg.Create(nil);
TRY
fMyDialog_TMP.Execute;
FINALLY
FreeAndNil(fMyDialog_TMP);
END;
end;
Теперь
закроем программу 1Cv82 и сделаем следующие
изменения в тексте
модуля cipd5_MyFunc нашего
COM-сервера :
Т.е., теперь
ссылка на нашу
диалоговую форма TOKBottomDlg
объявлена,
как свойство COM-объекта.
Скомпилируем наш проект и доработаем форму внешней обработки COM_InProc_d5_test.epf :
Повторим тестирование нашего COM-сервера.
Сначала проверим, как работает метод ShowMyForm_1
(который мы уже тестировали, см.выше).
Как видно - ничего не изменилось (все
работает, как и должно быть) ...
Теперь протестируем метод COM-сервера ShowMyForm_2 (для этого нужно нажать на кнопку ShowMyForm_2 на форме внешней обработки).
Результат :
Вроде бы тоже все - как и должно быть ...
Вроде бы, да не все ...
Теперь эта "сладкая парочка"
(1Cv8 + COM-сервер) безнадежно зависла.
На какие кнопки не нажимай - бестолку.
И без диспетчера задач теперь не обойтись ...
:-)
Вот такой вот глюк в программе 1C:Предприятие 8 (8.0 ... 8.2, включая релиз: 8.2.9.356) ...
Впрочем, ЗДЕСЬ представлен способ, как можно легко "побороть" этот глюк ...
А здесь
- еще один ...
:-)
Исходники тестируемого COM-сервера
можно скачать
здесь (191 кб).
Внешнюю обработку - здесь
(3.5 кб).
Для сравнения - здесь (187 кб) можно скачать пример тестовой программы (сформированной в среде D5), которая эмулирует те же действия, что и рассмотренная выше внешняя обработка 1Cv8. Но без каких-либо глюков ...
Статью в виде файла (1.7 Мб) можно скачать здесь: art_00070.zip
© 26.12.2009 Сергей Попов