Адрес этой странички : http://doc-prg.narod.ru/art_00070/art_00070.htm 
Дата обновления : 26.12.2009
 

(c) Sergey Popov, Usinsk, Komi, 2007

© 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 Сергей Попов

 


Hosted by uCoz
-->