Переключение на Главную Страницу Страницы: 1 [2] 3 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Создание элемента на форме (число прочтений - 23539 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #15 - 17. Января 2008 :: 16:43
Печать  
Исходники этого дела находятся здесь: http://yoksel.cvs.sourceforge.net/yoksel/SpreadSheet/SheetController.cpp?revisio...

Все оказалось проще. GetFieldWnd объекта CGetDoc7 сразу возвращает нормальный CWnd * моего элемента управления.

Дальше все элементарно. Убеждаемся, что это CWnd именно моего элемента управления. Кастим CWnd * к указателю на мой элемент. Получаем из этого указателя смартпойнтер. На основе смартпойнтера автоматически создается контекстная обертка.

Насколько это реально/проще/сложнее для реализации в 1С++ не в курсе. Улыбка
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #16 - 17. Января 2008 :: 16:45
Печать  
Артур боялся что останется ссылка на объект, в то время как он уже умер. Как следствие 1С склеит ласты.

Такое не предусматривал?
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #17 - 17. Января 2008 :: 16:48
Печать  
Arta писал(а) 17. Января 2008 :: 16:45:
Артур боялся что останется ссылка на объект, в то время как он уже умер. Как следствие 1С склеит ласты.

Такое не предусматривал?

Насколько я понимаю, в моем случае такое не произойдет. Если будет убит последний объект типа "ТабличныйДокумент.ЭлементУправления", то автоматом будет убито окно с элементом управления. В этом случае при запросе CWnd будет выдаваться NULL.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #18 - 17. Января 2008 :: 16:53
Печать  
Хотя есть другая проблема. Если создать элемент управления не на основе кнопки или надписи, то при очистке переменной типа "ТабличныйДокумент.ЭлементУправления" 1С вылетит Улыбка Но если использовать кнопку или надпись, то все нормально. Вроде бы.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #19 - 17. Января 2008 :: 16:54
Печать  
Ты не понял.


1. Элемент = Т.ПолучитьЭлементУправленияИзЭлементаФормы (Форма, "ТабличныйДокумент");
2. Закрываем форму с Объектом, оставляя при этом ссылку на него в переменной
3. Обращаемся к свойству или методу переменной Элемент. Что я получу?

Проще попробовать Улыбка

  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #20 - 17. Января 2008 :: 16:55
Печать  
Arta писал(а) 17. Января 2008 :: 16:54:
Ты не понял.


1. Элемент = Т.ПолучитьЭлементУправленияИзЭлементаФормы (Форма, "ТабличныйДокумент");
2. Закрываем форму с Объектом, оставляя при этом ссылку на него в переменной
3. Обращаемся к свойству или методу переменной Элемент. Что я получу?

Проще попробовать Улыбка


Ничего плохого ты не получишь. Объект будет существовать до тех пор, пока на него есть хотя бы одна ссылка.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #21 - 17. Января 2008 :: 16:56
Печать  
Хотяяя... Там могут быть операции с HWND, который уже дохлый. Надо будет попробовать, что будет.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #22 - 17. Января 2008 :: 16:56
Печать  
Хмм.
и при этом форма уже закрыта?

Ладно, я все равно профан, пошел тестить...
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #23 - 17. Января 2008 :: 17:00
Печать  
Arta писал(а) 17. Января 2008 :: 16:56:
Хмм.
и при этом форма уже закрыта?

Конечно! Объект при этом не обязательно должен быть убитым. Сейчас проверил так.

В глобальник запихнул переменную гТест.

Процедуру поменял так:
Код
Выбрать все
Процедура Тест ()
	Т = СоздатьОбъект ("ТабличныйДокумент");
	Элемент = Т.ПолучитьЭлементУправленияИзЭлементаФормы (Форма, "ТабличныйДокумент");
	Сообщить (ТипЗначенияСтр (Элемент));
	Сообщить ("" + Элемент.Документ.ВысотаТаблицы ());
	гТест = Элемент;

	Элемент = Т.ПолучитьЭлементУправленияИзЭлементаФормы (Форма, "ВыбФайл");
КонецПроцедуры
 


Т.е. элемент записывается в гТест.

Далее закрываю форму. И запускаю такой код:

Код
Выбрать все
Процедура Тест2 ()
	Сообщить (гТест.Документ.ВысотаТаблицы ());
	Т = СоздатьОбъект ("ТабличныйДокумент");
	гТест.Документ = Т;
КонецПроцедуры
 



Все работает так, как и ожидалось.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #24 - 17. Января 2008 :: 17:04
Печать  
Т.е. ответственность за ссылки остается за разработчиком?
Опа... То что надо!!!  Смех


Сейчас на рабочей базе проверю, и отпишусь!
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #25 - 17. Января 2008 :: 17:08
Печать  
Arta писал(а) 17. Января 2008 :: 17:04:
Т.е. ответственность за ссылки остается за разработчиком?

Ну да, как и везде в 1С Улыбка Типа, если создал ТЗ мегов эдак на 200 и запихнул в ГМ, то сам себе мохнатый Буратино.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #26 - 17. Января 2008 :: 17:09
Печать  
Черт, работает метод же только ТабличнымДокументом... А я сперва раскатил губу, что с любым объектом на форме Улыбка

Пошел дальше смотреть Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #27 - 18. Января 2008 :: 05:31
Печать  
Артем, плиз, добавь в баг багзиллы описалово на решение Олега.
Освобожусь, постараюсь разобраться и поправить Улыбка
ЗЫ возможно, kms поучаствует для ТП, побеседуй с ним Улыбка
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #28 - 23. Января 2008 :: 14:18
Печать  
Кстати, из-за delete на элементах Йокселя нельзя создавать активиксы. Потому что ActiveX тупо вызовет delete для CWnd Йокселя. Соответственно, если на объект Йокселя где-то остались ссылки, то при их использовании будет ##па - т.к. объект уже будет удален. А если эти ссылки не использовать, то будет двойное удаление одной и той же памяти.

В общем, фигня этот delete. ИМХО, лучше всего использовать принцип - "не ты создал, не тебе удалять".
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Создание элемента на форме
Ответ #29 - 21. Февраля 2008 :: 09:12
Печать  
Вот как раз если не делать delete, а DestroyWindow, и будут утечки памяти.
Поясню.
DestroyWindow не делает ничего, кроме как вызова этой же апишной функции, которая разрушает окно, но НЕ УНИЧТОЖАЕТ объект CWnd.
А по поводу двойного удаления - в данном случае 1С НЕ ХРАНИТ указатели на CWnd контролов, а когда нужно, дергает GetDlgItem с нужным ID, и по полученному HWND делает CWnd::FromHandlePermanent, чтобы получить CWnd*. Это и позволяет создав окно с тем же идшником, подменить атрибут формы, и как показала практика, 1С при убитии формы, удаляет именно объект CWnd нового, нами созданного окошка.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 
ОтправитьПечать