Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Объект класса и его форма? (число прочтений - 3915 )
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Объект класса и его форма?
05. Августа 2009 :: 09:04
Печать  
Народ, подскажите, как лучше связать класс и форму. Мне нужно, скажем так, симитировать объект некий "Документ". Хочу реализовать это как объект класса.
Никогда не пользовался ООП в 1С. Подскажите, правильно ли я делаю:
класс:
Код
Выбрать все
Перем КонтФормы;
//==========================================
Процедура Конструктор()

	//#curmeth
	стрПуть = СтрЗаменить(я().ПолучитьПуть(),"\FormCls.ert","\Form.ert");
	ОткрытьФорму("Обработка.Form#",КонтФормы,стрПуть);
	//я().ЗаменитьЭксзБазовогоКласса("ГрупповойКонтекст",КонтФормы)
	Перехватчик = СоздатьОбъект("Перехватчик");
    Перехватчик.ПерехватитьСобытияГК(КонтФормы, я());

КонецПроцедуры	// Конструктор
//==========================================
Процедура Деструктор()

	//#curmeth
	Если ПустоеЗначение(КонтФормы) = 0 Тогда
		КонтФормы.Форма.Закрыть();

	КонецЕсли;


КонецПроцедуры	// Деструктор
//==========================================
Процедура Событие_ПриЗакрытии() Экспорт
	//#curmeth

	я().ОтправитьСообщениеМодулюХоз(я(),"KillMe","");


КонецПроцедуры	// Событие_ПриЗакрытии 


Т.е., получается в конструкторе класса, я открываю форму, в которой реализован интерфейс для документа.
При закрытии формы, событие закрытия перехватывается. отсылается сообщение модулю-хозяину, который уничтожит объект.
В деструкторе класса, форма закроется(вместе с уничтожением объекта).
Хочу спросить, это нормальный подход или есть более правильный вариант?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Объект класса и его форма?
Ответ #1 - 05. Августа 2009 :: 11:02
Печать  
Сразу говорю - открытие, закрытие формы в конструкторе/деструкторе неверно практически всегда Печаль
лучше сделай так:
есть форма обработки, которая эмулирует нужный тебе документ.
Эта форма может открываться из специального метода класса, а также она
1) может пользоваться методами класса.
2) либо весь код формы состоит из перенаправления вызовов в класс.
так более точно будет выражено то, что ты хочешь.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Объект класса и его форма?
Ответ #2 - 05. Августа 2009 :: 12:18
Печать  
Спасибо!
Еще нупский вопрос, ничего не могу понять, вчера дома разбирался, аналогично делал, все работало. Сегодня на работе что-то ничего не взлетает.

1cpp.dll 3.0.1.23
Класс(FormCls.ert):
Код
Выбрать все
Перем КонтФормы;
//==========================================
Процедура Конструктор()

	//#curmeth


КонецПроцедуры	// Конструктор
//==========================================
Процедура Деструктор()

	//#curmeth
	Если ПустоеЗначение(КонтФормы) = 0 Тогда
		КонтФормы.Форма.Закрыть();

	КонецЕсли;


КонецПроцедуры	// Деструктор
//==========================================
Процедура ОткрытьФорму_() Экспорт

	стрПуть = СтрЗаменить(я().ПолучитьПуть(),"\FormCls.ert","\Form.ert");
	ОткрытьФорму("Обработка.Form#",КонтФормы,стрПуть);
	Перехватчик = СоздатьОбъект("Перехватчик");
    Перехватчик.ПерехватитьСобытияГК(КонтФормы, я());

КонецПроцедуры	// ОткрытьФорму_
//==========================================
Процедура Событие_ПриОткрытии() Экспорт
	//#curmeth
КонецПроцедуры	// ПриОткрытии
//==========================================
Процедура Событие_ПриЗакрытии() Экспорт
	//#curmeth

	я().ОтправитьСообщениеМодулюХоз(я(),"KillMe","");


КонецПроцедуры	// Событие_ПриЗакрытии
 


Форма(Form.ert)
Код
Выбрать все
Процедура ПриОткрытии()

	Сообщить("Form.ert::ПриОткрытии");
КонецПроцедуры	// ПриОткрытии
//=========================================
Процедура ПриЗакрытии()

	Сообщить("Form.ert::ПриЗакрытии");
КонецПроцедуры	// ПриЗакрытии
//========================================= 


тестовая обработка(test.ert):
Код
Выбрать все
Перем сп;

//=======================================
Процедура Сформировать()

	УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
	УправлениеНастройками.Включить("ПерехватитьСобытияГК");

	MyForm = СоздатьОбъект("MyForm");

	MyForm.ОткрытьФорму_();

	сп.ДобавитьЗначение(MyForm);
КонецПроцедуры
//=======================================
Функция ОбработкаСобытияОтКласса(отКого, стрСобытие, Данные)

	поз = сп.НайтиЗначение(отКого);

	сп.УдалитьЗначение(поз);
	Сообщить("поз = " + поз);


	Сообщить("отКого = " + отКого);
	Сообщить("стрСобытие = " + стрСобытие);
	Сообщить("Данные = " + Данные);

КонецФункции	// ОбработкаСобытияОтКласса
//=======================================


сп = СоздатьОбъект("СписокЗначений");
 


Сейчас происходит следующее
1) если запустить в тестовой обработке процедуру Сформировать. Создается объект MyForm, открывается форма(вызывается метод ОткрытьФорму_())
в окне сообщений вижу

i > MyForm::Конструктор()
> > Form.ert::ПриОткрытии
i > MyForm::Деструктор()

Почему запускается Деструктор объекта сразу не могу понятьПечаль Объект у меня в списке значений. Ссылка на него жива. При этом пробовал вызвать тестовый метод объекта после вызова Деструктора - работает.
Т.е. если так, например,
Код
Выбрать все
Процедура Сформировать()

	УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
	УправлениеНастройками.Включить("ПерехватитьСобытияГК");

	MyForm = СоздатьОбъект("MyForm");

	MyForm.ОткрытьФорму_();

	сп.ДобавитьЗначение(MyForm);

        сп.ПолучитьЗначение(1).Событие_ПриОткрытии();
КонецПроцедуры 



в окне сообщений видим

i > MyForm::Конструктор()
> > Form.ert::ПриОткрытии
i > MyForm::Деструктор()
i > MyForm::Событие_ПриОткрытии()

как это после Деструктора объекта, можно вызвать его метод?

2) Событие ПриЗакрытии формы Form.ert не перехватывается
3) Если в тестовой обработке убрать MyForm.ОткрытьФорму_();, то поведение логичное. Т.е.
Запускаю процедуру Сформировать тестовой обработки. В окне сообщений вижу
i > MyForm::Конструктор()
Закрываю тестовую обработку - уничтожается переменная сп с моим объектом MyForm
в окне сообщений вижу
i > MyForm::Деструктор()

Подозреваю, то ли я где-то туплю. То ли, может какая-то путаница в реестре с установленными компонентами?(в 1С в параметрах пишет 3.0.1.23). Вчера из дома делал ну буквально все блин аналогично, все работалоУлыбка

  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Объект класса и его форма?
Ответ #3 - 05. Августа 2009 :: 12:37
Печать  
Сделай готовый тест, выложи его в архиве в ветке.
Я завтра посмотрю, в чем у тебя проблема.
Вроде все логично Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Объект класса и его форма?
Ответ #4 - 05. Августа 2009 :: 12:41
Печать  
Проверь также строчку установки перехват на контекст формы.
Без нее работает или нет?
Попробуй в этой строке поставить вирт() вместо я()
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Объект класса и его форма?
Ответ #5 - 05. Августа 2009 :: 14:45
Печать  
Хотел сделать тестовую конфу для проверки. Сделал - там все работает.
Стал копать..уж не знаю может я еще что-то походу зацепил.
Но все стало работать после того как переименовал в реестре ветку
HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Options\1C++ Components & Class\test2\V7\МоеИмяПользователя
в
HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Options\1C++ Components & Class\test2\V7\default

test2 - это конфа, в которой изначально не работало

воспроизвести на тестовой конфе это не получилосьПечаль
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Объект класса и его форма?
Ответ #6 - 06. Августа 2009 :: 22:00
Печать  
фух..я таки понялУлыбка для того чтобы работал перехватчик должна быть установлена настройка EnableTurboBL(ну и EnableHookEventsGroupContext).
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Объект класса и его форма?
Ответ #7 - 07. Августа 2009 :: 11:42
Печать  
Вполне может быть.
Просто я без ТурбоБЛ 1С++ не представляю Улыбка
Поэтому она у меня всегда включена в классе автозагрузки.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
traeiria
YaBB Newbies
*
Отсутствует


мультфильм

Сообщений: 3
Зарегистрирован: 14. Августа 2008
Re: Объект класса и его форма?
Ответ #8 - 06. Ноября 2009 :: 19:59
Печать  
artbear писал(а) 07. Августа 2009 :: 11:42:
Вполне может быть.
Просто я без ТурбоБЛ 1С++ не представляю Улыбка
Поэтому она у меня всегда включена в классе автозагрузки.


Я на с++ программирую и совсем нечаянно попал на этом форуме. неужели ООП Российский появился.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Объект класса и его форма?
Ответ #9 - 07. Ноября 2009 :: 07:00
Печать  
traeiria писал(а) 06. Ноября 2009 :: 19:59:
artbear писал(а) 07. Августа 2009 :: 11:42:
Вполне может быть.
Просто я без ТурбоБЛ 1С++ не представляю Улыбка
Поэтому она у меня всегда включена в классе автозагрузки.


Я на с++ программирую и совсем нечаянно попал на этом форуме. неужели ООП Российский появился.  

Давно уже, но только для применения в среде 1С 77.
Правда, и для 8-ки есть наработки, но там все сложнее Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать