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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Создание элемента на форме
03. Января 2008 :: 14:08
Печать  
Дошел до этапа создания собственного элемента на форме. Смотрю как сделано в 1С++ в ActiveX. Метод CAXCtrlContainer::CreateContainer:

Код
Выбрать все
	CWnd* pOldWnd = pDoc->GetFieldWnd(pGetField);
	CWnd* pParent = pOldWnd->GetParent();

	CRect rect;
	pOldWnd->GetWindowRect(rect);
	pParent->ScreenToClient(rect);
	int id = pOldWnd->GetDlgCtrlID();
	delete pOldWnd;

 


Смущает меня последняя строка: "delete pOldWnd;" Не происходит ли в результате выполнения такого кода двойное удаление памяти? Ведь указатель-то из 1С никуда не девается и при удалении формы 1С (если там не наделано ликов) должна сама вызвать delete. Сейчас сделал по другому: что-то вроде pOldWnd->DestroyWindow (). При этом добиваемся чего хотим:
- в диалоге появляется контрол с ИД как у старого.
- объект 1С не удаляется - при закрытии произойдет корректное удаление живого объекта.

Интересно, есть ли у такого решения подводные камни? Интересуют также комментарии авторов решения с delete.
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #1 - 03. Января 2008 :: 15:10
Печать  
Ни одного тебя смущала такая конструкция.
  
Наверх
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #2 - 17. Января 2008 :: 10:23
Печать  
Кстати, замена delete на DestroyWindow дает еще одну небезынтересную фенечку. Свои элементы управления в этом случае можно создавать не только на надписи или кнопке, но и на других элементах управления. Создание элемента работает, в принципе, на всем, кроме ТЗ. А вот при использовании delete 1С вылетает уже на простом поле ввода.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #3 - 17. Января 2008 :: 10:38
Печать  
Может быть попробовать выложить сборку без delete для всестороннего тестирования?
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #4 - 17. Января 2008 :: 10:41
Печать  
А чего пробовать?
ИМХО Ужас прав, нужно заменять delete в ночной сборке
  

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: Создание элемента на форме
Ответ #5 - 17. Января 2008 :: 10:44
Печать  
Олег, а какие элементы хочешь помещать на форму?
Поделись планами Улыбка
  

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


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #6 - 17. Января 2008 :: 10:44
Печать  
artbear писал(а) 17. Января 2008 :: 10:41:
А чего пробовать?
ИМХО Ужас прав, нужно заменять delete в ночной сборке

Кто у нас этим участком "заведует"?
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #7 - 17. Января 2008 :: 10:47
Печать  
По идее автор Степан, но его что-то последнее время практически не видно и не слышно Печаль
Также в рефакторинге и правке ошибок участвовали Саша Орефков и я - трое нас было Улыбка
  

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: Создание элемента на форме
Ответ #8 - 17. Января 2008 :: 10:49
Печать  
artbear писал(а) 17. Января 2008 :: 10:44:
Олег, а какие элементы хочешь помещать на форму?
Поделись планами Улыбка

Да я уже все, что хотел - поместил Улыбка Это "ТабличныйДокумент.ЭлементУправления". Больше вроде нечего (пока). Это я так, работу над ошибками делаю, проверяю продукт на корректность. Чтобы быть насчет него совершенно спокойным.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #9 - 17. Января 2008 :: 11:25
Печать  
Олег, а может заодно, как бы между прочим Улыбка реализуешь это?
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



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

Фигасе, "между прочим" Улыбка ХЗ. Можно попробовать покопать вот в этом направлении:

Цитата:
CWnd::FromHandle
Returns a pointer to a CWnd object when given a handle to a window. If a CWnd object is not attached to the handle, a temporary CWnd object is created and attached.

Вот если эта хреновина возвращает действительный CWnd, которому соответствует HWND (а не временную хрень какую-нибудь), то из этого CWnd уже можно сконструировать нормальный контекст.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #11 - 17. Января 2008 :: 11:47
Печать  
Благодарствую, мил человек Улыбка
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Создание элемента на форме
Ответ #12 - 17. Января 2008 :: 11:51
Печать  
spock писал(а) 17. Января 2008 :: 11:50:
Попробуй так (как вариант):
Код
Выбрать все
CWnd::Detach() 


А это здесь при чем? Проблема как раз обратная - из HWND получить правильный CWnd.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



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


Для хохмы реализовал нечто подобное для Йокселя. В объект "ТабличныйДокумент" добавлен метод "ПолучитьЭлементУправленияИзЭлементаФормы", который возвращает объект типа "ТабличныйДокумент.ЭлементУправления", если на заданном элементе управления создан элемент табличного документа. Если на заданном элементе нет табличного документа, то метод выкидывает ошибку.

Модифицированную ВК прикладываю. Следом пойдет тестовая обработка.

В тестовой обработке создается элемент управления с табличным документом. По кнопке "Кнопка" срабатывает процедура следующего вида:

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

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



На последней строке будет выдано исключение, как и планировалось.
  

SpreadSheet_001.rar ( 803 KB | Загрузки )
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



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

Control.ert ( 8 KB | Загрузки )
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать