Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите. Как сделать правильно? (число прочтений - 17034 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Помогите. Как сделать правильно?
18. Апреля 2008 :: 08:39
Печать  
Пишу класс "ТПЗапросТЗ". Его родители: "ТабличноеПоле", "ЗапросSQL" и "Форма"
Код
Выбрать все
Процедура Конструктор()
	_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле");
	_БазаФорма = Этот(Контекст).ПолучитьБазовыйКласс("Форма");
	_БазаЗапрос = Этот(Контекст).ПолучитьБазовыйКласс("ЗапросSQL");
КонецПроцедуры // Конструктор

//------------------------------------ ------------------------------------
Процедура Создать(идЭлементаНаформе) Экспорт
	Сам().СоздатьЭлементУправленияНаФорме(Сам().ПолучитьКонтекстОкружения().Форма, "ТабличноеПоле", идЭлементаНаформе);
КонецПроцедуры// Создать 



В тестовой обработке делаю:
Код
Выбрать все
Процедура ПослеСозданияФормы()
	тпНаФорме=СоздатьОбъект("ТПЗапросТЗ");
	тпНаФорме.Создать("тпНаФорме");
	НоваяКолонка=тпНаФорме.Колонки.Добавить("НомСтр");
КонецПроцедуры	// ПослеСозданияФормы 


Создаётся нормально, но на последней 3-й строке ругается:
Цитата:
НоваяКолонка=тпНаФорме.Колонки.Добавить("НомСтр");
{...: Значение не представляет агрегатный объект (Добавить)

Что я делаю не так?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #1 - 18. Апреля 2008 :: 08:50
Печать  
+ как это сделать в самом классе?
В классе пишу:
Код
Выбрать все
Процедура СоздатьКолонку(идКолонки) Экспорт
		НоваяКолонка=Сам().Колонки.Добавить(идКолонки);
		НоваяКолонка.Заголовок=идКолонки;
		НоваяКолонка.Данные=идКолонки;
КонеуПроцедуры 


та же самая ошибка... Нерешительный
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Помогите. Как сделать правильно?
Ответ #2 - 18. Апреля 2008 :: 09:15
Печать  
Вопрос в том, что есть "Колонки" внутри этого класса.
Переменной такой не объявлено, случайно?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #3 - 18. Апреля 2008 :: 09:21
Печать  
Нет, не объявлено.
я так понял, что надо чуть подправить процедуру в классе:
Код
Выбрать все
Процедура Создать(идЭлементаНаформе) Экспорт
	тп = Сам().СоздатьЭлементУправленияНаФорме(Сам().ПолучитьКонтекстОкружения().Форма, "ТабличноеПоле", идЭлементаНаформе);
КонецПроцедуры// Создать 


+ создать переменную класса "тп", а от неё уже плясать: тп.Колонки.Добавить(имяКолонки);
Но что-то мне кажется, что это не есть гуд и вообще это не правильно.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #4 - 18. Апреля 2008 :: 09:23
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 09:21:
ПолучитьКонтекстОкружения

Зря ты. Лучше контекст в класс передавай.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #5 - 18. Апреля 2008 :: 09:25
Печать  
Arta писал(а) 18. Апреля 2008 :: 09:23:
JohnyDeath писал(а) 18. Апреля 2008 :: 09:21:
ПолучитьКонтекстОкружения

Зря ты. Лучше контекст в класс передавай.

Почему? И это ладно, пол беды.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #6 - 18. Апреля 2008 :: 09:28
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 09:25:
Почему? И это ладно, пол беды.

1. Этот метод официально заявлен неподдерживаемым.
2. Ты теряешь удобство использования класса. При таком варианте его не везде использовать можно, например в сложной иерархии классов...
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #7 - 18. Апреля 2008 :: 10:20
Печать  
Ладно, понял. А по теме кто-нибудь выскажется?  Нерешительный
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Помогите. Как сделать правильно?
Ответ #8 - 18. Апреля 2008 :: 10:41
Печать  
kms писал(а) 18. Апреля 2008 :: 09:15:
Вопрос в том, что есть "Колонки" внутри этого класса.

Ты пока не ответил (тип значения).
  

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #9 - 18. Апреля 2008 :: 10:42
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 08:39:
Пишу класс "ТПЗапросТЗ". Его родители: "ТабличноеПоле", "ЗапросSQL" и "Форма"
...
Что я делаю не так?

Наследование - это отношение типа "является". Мне лично сложно представить объект, который одновременно является и формой и табличным полем на форме и запросом.
Скорее тут подходит взяимоотношения типа "входит в состав". Табличное поле входит в состав формы. А запрос входит в состав табличного поля.
Я к тому, что тут скорее нужно применять не наследование, а агрегирование.

А в результате применения наследования - конструкция получается слишком сложной для понимания. Вот и ты в результате не можешь понять, что там у тебя происходит, и нам не можешь передать информацию в количестве, достаточном для того, чтобы мы поняли, что же у тебя там происходит.

Цитата:
Ладно, понял. А по теме кто-нибудь выскажется?

По теме... Проще надо быть. Не пытаться нагромоздить сразу и немедлено суперсложную конструкцию из наследующихся друг от друга классов. Любой рефакторинг должен приводить к облегчению понимания человеком текста программы, а не к усложнению.
  
Наверх
www  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #10 - 18. Апреля 2008 :: 10:52
Печать  
Т.к. я сижу на ДБФ, хочу иметь класс, который строил бы ТП по ТЗ, которая формировалась бы по запросу к базе через OLEDB.
Я просто устал один и тот же код таскать из модуля в модуль.
Хотелось просто:
Код
Выбрать все
//так создаём:
	тпНаФорме=СоздатьОбъект("ТПЗапросТЗ");
	тпНаФорме.Создать("тпНаФорме");

//а так выполняем:
ТекстЗапроса="МойТекстЗапросаКБазеЧерезОлеДБ";
	тпНаФорме.УстановитьТекстовыйПараметр("Параметр",Параметр);
	тпНаФорме.ВыполнитьИОтобразить(ТекстЗапроса,0);//выполняется запрос и отображется ТП на форме с данными запроса
	Рез=тпНаФорме.Выполнить(ТекстЗапроса,0);//А так можнло получить результат запроса в виде ТЗ не отрисовывая её на форме в ТП 


Можно обойтись и без наследования от "формы" и от "ЗапросSQL", но, КМК, это не решит проблему.
Да, я согласен, что где-то я что-то делаю не так (может быть даже в корне не так), но именно поэтому я и спрашиваю как можно(=нужно) сделать нормально...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #11 - 18. Апреля 2008 :: 11:01
Печать  
fez писал(а) 18. Апреля 2008 :: 10:42:
JohnyDeath писал(а) 18. Апреля 2008 :: 08:39:
Пишу класс "ТПЗапросТЗ". Его родители: "ТабличноеПоле", "ЗапросSQL" и "Форма"
...
Что я делаю не так?

Наследование - это отношение типа "является". Мне лично сложно представить объект, который одновременно является и формой и табличным полем на форме и запросом.
Скорее тут подходит взяимоотношения типа "входит в состав". Табличное поле входит в состав формы. А запрос входит в состав табличного поля.
Я к тому, что тут скорее нужно применять не наследование, а агрегирование.

А в результате применения наследования - конструкция получается слишком сложной для понимания. Вот и ты в результате не можешь понять, что там у тебя происходит, и нам не можешь передать информацию в количестве, достаточном для того, чтобы мы поняли, что же у тебя там происходит.

Цитата:
Ладно, понял. А по теме кто-нибудь выскажется?

По теме... Проще надо быть. Не пытаться нагромоздить сразу и немедлено суперсложную конструкцию из наследующихся друг от друга классов. Любой рефакторинг должен приводить к облегчению понимания человеком текста программы, а не к усложнению.

+1 По всем пунктам.
  

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: Помогите. Как сделать правильно?
Ответ #12 - 18. Апреля 2008 :: 11:05
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 10:52:
Т.к. я сижу на ДБФ, хочу иметь класс, который строил бы ТП по ТЗ, которая формировалась бы по запросу к базе через OLEDB.
Я просто устал один и тот же код таскать из модуля в модуль.
Хотелось просто:
Код
Выбрать все
//так создаём:
	тпНаФорме=СоздатьОбъект("ТПЗапросТЗ");
	тпНаФорме.Создать("тпНаФорме");

//а так выполняем:
ТекстЗапроса="МойТекстЗапросаКБазеЧерезОлеДБ";
	тпНаФорме.УстановитьТекстовыйПараметр("Параметр",Параметр);
	тпНаФорме.ВыполнитьИОтобразить(ТекстЗапроса,0);//выполняется запрос и отображется ТП на форме с данными запроса
	Рез=тпНаФорме.Выполнить(ТекстЗапроса,0);//А так можнло получить результат запроса в виде ТЗ не отрисовывая её на форме в ТП 


Можно обойтись и без наследования от "формы" и от "ЗапросSQL", но, КМК, это не решит проблему.
Да, я согласен, что где-то я что-то делаю не так (может быть даже в корне не так), но именно поэтому я и спрашиваю как можно(=нужно) сделать нормально...

Вот и получается, что у тебя основное назначение класса - работа с ТП, т.е. можно класс сделать наследником ТП, а остальные предки не наследовать, а агрегировать.

А на самом деле лучше иметь несколько классов, которые взаимодействуют между собой.
Кстати, можно почитать по паттерны Фасад или Мост, например Улыбка
  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #13 - 18. Апреля 2008 :: 11:24
Печать  
Немного переделал класс. Теперь он наследник только ТП:
Код
Выбрать все
Перем _БазаТП;
Перем _Конт;
Перем БД,Запрос;
//--------------------------------------------
Функция Выполнить(ТекстЗапроса, флОтладка=0) Экспорт
	Запрос.Отладка(флОтладка);
	Возврат Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
КонецФункции	// Выполнить

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

	//Сам().ОбновитьСтроки();
	Возврат тзИсточник;
КонецФункции// ВыполнитьИОтобразить
//--------------------------------------------
Процедура УстановитьТекстовыйПараметр(идПараметра,Параметр) Экспорт
	Запрос.УстановитьТекстовыйПараметр(идПараметра,Параметр);
КонецПроцедуры	// УстановитьТекстовыйПараметр
//--------------------------------------------
Процедура Создать(идЭлементаНаформе, КонтФормы) Экспорт
	БД=СоздатьОбъект("OLEDBData");
	СтрокаСоединения="Provider=VFPOLEDB.1;Deleted=Yes;Data Source="+КаталогИБ()+";Mode=ReadWrite;Collating Sequence=Machine";
	Рез=БД.Соединение(СтрокаСоединения);
	Запрос=БД.СоздатьКоманду();

	_Конт=КонтФормы;
	Форма=СоздатьОбъект("Форма");
	тпНаФорме=Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТабличноеПоле", идЭлементаНаформе);
КонецПроцедуры// Создать 



Ошибки те же и там же... Печаль
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите. Как сделать правильно?
Ответ #14 - 18. Апреля 2008 :: 11:38
Печать  
Уже напарывался
http://www.1cpp.ru/forum/YaBB.pl?num=1208158731
Код
Выбрать все
Функция Создать(Конт, ЭлементДиалога) Экспорт  

ОбъектФорма=СоздатьОбъект("Форма");
ОбъектФорма.УстановитьФорму(Конт.Форма);
ТаблПоле=ОбъектФорма.СоздатьЭлементУправления("ТабличноеПолеДБФ", ЭлементДиалога);

Возврат ТаблПоле;
КонецФункции   



Вызов из формы
Код
Выбрать все
перем тпТовары,ЛокальнаяФорма,ОбъектТпТовары;
Процедура ФормаПриСоздании()
ОбъектТпТовары=СоздатьОбъект("ТабличноеПолеДБФ");
тпТовары=ОбъектТпТовары.Создать(Контекст,Форма.тпТестДБФ);
КонецПроцедуры    

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #15 - 18. Апреля 2008 :: 11:53
Печать  
kiruha писал(а) 18. Апреля 2008 :: 11:38:
Уже напарывался
http://www.1cpp.ru/forum/YaBB.pl?num=1208158731
Код
Выбрать все
Функция Создать(Конт, ЭлементДиалога) Экспорт  

ОбъектФорма=СоздатьОбъект("Форма");
ОбъектФорма.УстановитьФорму(Конт.Форма);
ТаблПоле=ОбъектФорма.СоздатьЭлементУправления("ТабличноеПолеДБФ", ЭлементДиалога);

Возврат ТаблПоле;
КонецФункции   



Примерно про это я говорил в 3-м посте
Но, мне показалось, что это как-то некрасиво выглядит.
Т.е. если я захочу в своей обработке добавить колонку к ТП я должен буду написать:
Код
Выбрать все
тпНаФорме=СоздатьОбъект("ТПЗапросТЗ");
ЕщёОдноТП=тпНаФорметпНаФорме.Создать("тпНаФорме", Контекст);
НоваяКолонка=ЕщёОдноТП.Колонки.Добавить() 


и в классе обрабатывать, добавив глобальную переменную ТаблПоле:
Код
Выбрать все
НоваяКолонка=ТаблПоле.Колонки.Добавить() 



другого выхода нет?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите. Как сделать правильно?
Ответ #16 - 18. Апреля 2008 :: 12:02
Печать  
Не понял насчет обрабатывать в классе.
Работает без обработки в классе.
Достаточно только
Код
Выбрать все
НоваяКолонка=ЕщёОдноТП.Колонки.Добавить()
 


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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #17 - 18. Апреля 2008 :: 12:02
Печать  
А кто мешает выполнить замену базового класса через ЗаменитьБазовыйОбъект ?
Если уж другие вариант не проходят, кстати, их еще нужно проанализировать, неужели простые варианты исчерпаны?
  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #18 - 18. Апреля 2008 :: 12:05
Печать  
kiruha писал(а) 18. Апреля 2008 :: 12:02:
Не понял насчет обрабатывать в классе.
Работает без обработки в классе.
Достаточно только
Код
Выбрать все
НоваяКолонка=ЕщёОдноТП.Колонки.Добавить()
 



В классе есть процедура:
Код
Выбрать все
Процедура СоздатьКолонкиПоИсточнику(тзСсылка, фИзменениеРазмера=1, фНомерСтроки=0) Экспорт
	Перем Заголовок, Ширина, Положение;
	Если фНомерСтроки=1 Тогда
		НоваяКолонка=ТаблПоле.Колонки.Добавить("НомерСтроки"); ///ВОТ ТУТ ХОТЕЛ САМ()
		НоваяКолонка.Заголовок="№ строки";
		НоваяКолонка.Данные="НомерСтроки";
		НоваяКолонка.Ширина=30;
		НоваяКолонка.ИзменениеРазмера=фИзменениеРазмера;
	КонецЕсли;
	Для ъ=1 По тзСсылка.КоличествоКолонок() Цикл
		идКолонки=тзСсылка.ПолучитьПараметрыКолонки(ъ,,,, Заголовок, Ширина,, Положение);
		Если тзСсылка.ВидимостьКолонки(идКолонки)=0 Тогда Продолжить; КонецЕсли;
		НоваяКолонка=ТаблПоле.Колонки.Добавить(идКолонки); //И ТУТ ТОЖЕ ХОТЕЛ САМ()
		НоваяКолонка.Заголовок=Заголовок;
		НоваяКолонка.Данные=идКолонки;
		НоваяКолонка.ГоризонтальноеВыравнивание=Положение;
		НоваяКолонка.Ширина=?(Ширина>0, Ширина, 15)*6.2;
		НоваяКолонка.ИзменениеРазмера=фИзменениеРазмера;
	КонецЦикла;
КонецПроцедуры 


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

	//Сам().ОбновитьСтроки();
	Возврат тзИсточник;
КонецФункции// ВыполнитьИОтобразить 

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите. Как сделать правильно?
Ответ #19 - 18. Апреля 2008 :: 12:09
Печать  
В СоздатьКолонкиПоИсточнику
Код
Выбрать все
Этот=Сам(Контекст);
ТекБазовыйКласс=Этот.ПолучитьБазовыйКласс();
ТекБазовыйКласс.Колонки.Добавить()
 

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #20 - 18. Апреля 2008 :: 12:11
Печать  
artbear писал(а) 18. Апреля 2008 :: 12:02:
А кто мешает выполнить замену базового класса через ЗаменитьБазовыйОбъект ?
Если уж другие вариант не проходят, кстати, их еще нужно проанализировать, неужели простые варианты исчерпаны?

А можешь поподробнее для тугодумов?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #21 - 18. Апреля 2008 :: 12:14
Печать  
kiruha писал(а) 18. Апреля 2008 :: 12:09:
В СоздатьКолонкиПоИсточнику
Код
Выбрать все
Этот=Сам(Контекст);
ТекБазовыйКласс=Этот.ПолучитьБазовыйКласс();
ТекБазовыйКласс.Колонки.Добавить()
 


Пробовал с самого начала:
Код
Выбрать все
Перем _БазаТП;
Процедура Конструктор()
	_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле");
КонецПроцедуры // Конструктор 


и в проц-ре "СоздатьКолонкиПоИсточнику":
Код
Выбрать все
НоваяКолонка=_БазаТП.Колонки.Добавить("НомерСтроки"); 


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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите. Как сделать правильно?
Ответ #22 - 18. Апреля 2008 :: 12:23
Печать  
_БазаТП должна быть Экспорт ,
или экземпляр класса должен быть определен в вызыв форме в секции перем
или _БазаТП должна быть определена в момент создания колонок -
без этого она не сохранится
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #23 - 18. Апреля 2008 :: 12:38
Печать  
Либо я куда-то не туда поехал, либо мне вообще за руль садиться нельзя.
В классе в процедуре "ВыполнитьИОтобразить" пишу:
Код
Выбрать все
тзИсточник=Сам().Выполнить(ТекстЗапроса, флОтладка);
	Сам().ПоставщикДанных = "";
	НоваяКолонка=Сам().ПолучитьБазовыйКласс().Колонки.Добавить("Первая"); 


Всё то же самое  Плачущий
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #24 - 18. Апреля 2008 :: 13:00
Печать  
Покажи описание класса в прм-файле
  

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


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Помогите. Как сделать правильно?
Ответ #25 - 18. Апреля 2008 :: 13:01
Печать  
Ну, я подожду, когда тебе захочется ответить на мой вопрос.
Впрочем, не особо настаиваю, я же понимаю фан от найденного самостоятельно решения. Подмигивание
  

De quelle planète es-tu?
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #26 - 18. Апреля 2008 :: 13:08
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:00:
Покажи описание класса в прм-файле

Цитата:
class ТПЗапросТЗ = #Классы\ТПЗапросТЗ.ert : ТабличноеПоле
{};
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите. Как сделать правильно?
Ответ #27 - 18. Апреля 2008 :: 13:09
Печать  
Код
Выбрать все
Функция Сам(Конт) Возврат Конт; КонецФункции
Процедура СоздатьКолонкуТП(идКолонки)   Экспорт

	    НоваяКолонка=Сам(Контекст).Колонки.Добавить(идКолонки);
		НоваяКолонка.Заголовок=идКолонки;
КонецПроцедуры  



Проверил - прекрасно отрабатывает и без базового класса  Озадачен
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #28 - 18. Апреля 2008 :: 13:11
Печать  
kms писал(а) 18. Апреля 2008 :: 13:01:
Ну, я подожду, когда тебе захочется ответить на мой вопрос.
Впрочем, не особо настаиваю, я же понимаю фан от найденного самостоятельно решения. Подмигивание

Если ты про это:
Цитата:
Ты пока не ответил (тип значения).

То вот:
Цитата:
типзначенияСтр(Колонки) = ""
типЗначенияСтр(_БазаТП.Колонки) = ""
типЗначенияСтр(_БазаТП) = "ТабличноеПоле"
ТипЗначенияСтр(Сам()) = "ТПЗапросТЗ"
ТипЗначенияСтр(Сам().Колонки) = ""

Или опять не про это? Ты если что - тычь, не стесняйся. Я не прикидываюсь, что не понимаю.  Смущённый

Найденное самостоятельное решение изначально показалось мне явно беспонтовым, поэтому и пришёл спрашивать знающих людей о нормальном решении.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #29 - 18. Апреля 2008 :: 13:11
Печать  
А теперь список всех Переменных класса.
Всю секцию до первой функции Улыбка
  

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: Помогите. Как сделать правильно?
Ответ #30 - 18. Апреля 2008 :: 13:15
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 13:11:
Цитата:
типзначенияСтр(Колонки) = ""
типЗначенияСтр(_БазаТП.Колонки) = ""
ТипЗначенияСтр(Сам().Колонки) = ""


Ну вот и ответ Печаль
У тебя же в классе есть Перем Колонки Экспорт.
Тебе на это давно намекали Улыбка
  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #31 - 18. Апреля 2008 :: 13:15
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:11:
А теперь список всех Переменных класса.
Всю секцию до первой функции Улыбка

Перем _БазаТП Экспорт;
Перем _Конт;
Перем БД,Запрос;
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #32 - 18. Апреля 2008 :: 13:19
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:15:
JohnyDeath писал(а) 18. Апреля 2008 :: 13:11:
Цитата:
типзначенияСтр(Колонки) = ""
типЗначенияСтр(_БазаТП.Колонки) = ""
ТипЗначенияСтр(Сам().Колонки) = ""


Ну вот и ответ Печаль
У тебя же в классе есть Перем Колонки Экспорт.
Тебе на это давно намекали Улыбка

Нету. На основе чего вы это утверждаете?

Вот текст всего класса:
Код
Выбрать все
// ТПЗапросТЗ

Перем _БазаТП Экспорт;
Перем _Конт;
Перем БД,Запрос;

Функция Этот(Конт) Возврат Конт; КонецФункции
Функция Сам() Возврат Этот(Контекст) КонецФункции

//------------------------------------ ------------------------------------
Процедура Конструктор()
	_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле");
КонецПроцедуры // Конструктор
//--------------------------------------------
Процедура СоздатьКолонкиПоИсточнику(тзСсылка, фИзменениеРазмера=1, фНомерСтроки=0) Экспорт
	Перем Заголовок, Ширина, Положение;
	Если фНомерСтроки=1 Тогда
		НоваяКолонка=_БазаТП.Колонки.Добавить("НомерСтроки");
		НоваяКолонка.Заголовок="№ строки";
		НоваяКолонка.Данные="НомерСтроки";
		НоваяКолонка.Ширина=30;
		НоваяКолонка.ИзменениеРазмера=фИзменениеРазмера;
	КонецЕсли;
	Для ъ=1 По тзСсылка.КоличествоКолонок() Цикл
		идКолонки=тзСсылка.ПолучитьПараметрыКолонки(ъ,,,, Заголовок, Ширина,, Положение);
		Если тзСсылка.ВидимостьКолонки(идКолонки)=0 Тогда Продолжить; КонецЕсли;
		//НоваяКолонка(тпСсылка, идКолонки, Заголовок, Ширина, ИзменениеРазмера, Положение, 0);
		Сообщить(""+идКолонки,"i");
		НоваяКолонка=_БазаТП.Колонки.Добавить(идКолонки);
		НоваяКолонка.Заголовок=Заголовок;
		НоваяКолонка.Данные=идКолонки;
		НоваяКолонка.ГоризонтальноеВыравнивание=Положение;
		НоваяКолонка.Ширина=?(Ширина>0, Ширина, 15)*6.2;
		НоваяКолонка.ИзменениеРазмера=фИзменениеРазмера;
	КонецЦикла;
КонецПроцедуры
//--------------------------------------------
Функция Выполнить(ТекстЗапроса, флОтладка=0) Экспорт
	Запрос.Отладка(флОтладка);
	Возврат Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
КонецФункции	// Выполнить

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

	//Сам().ОбновитьСтроки();
	Возврат тзИсточник;
КонецФункции// ВыполнитьИОтобразить
//--------------------------------------------
Процедура СоздатьКолонкуТП(идКолонки)   Экспорт
	НоваяКолонка=Сам().Колонки.Добавить(идКолонки);
	НоваяКолонка.Заголовок=идКолонки;
КонецПроцедуры
//--------------------------------------------
Процедура УстановитьТекстовыйПараметр(идПараметра,Параметр) Экспорт
	Запрос.УстановитьТекстовыйПараметр(идПараметра,Параметр);
КонецПроцедуры	// УстановитьТекстовыйПараметр
//--------------------------------------------
Функция Создать(идЭлементаНаформе, КонтФормы) Экспорт
	БД=СоздатьОбъект("OLEDBData");
	СтрокаСоединения="Provider=VFPOLEDB.1;Deleted=Yes;Data Source="+КаталогИБ()+";Mode=ReadWrite;Collating Sequence=Machine";
	Рез=БД.Соединение(СтрокаСоединения);
	Запрос=БД.СоздатьКоманду();

	_Конт=КонтФормы;
	Форма=СоздатьОбъект("Форма");
	//тпНаФорме=Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТабличноеПоле", идЭлементаНаформе);
	Возврат Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТабличноеПоле", идЭлементаНаформе);
КонецФункции// Создать 

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


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Помогите. Как сделать правильно?
Ответ #33 - 18. Апреля 2008 :: 13:22
Печать  
ХЗ, Жень, но откуда-то у тебя Колонки переопределяются или наследуются в иерархии.

Цитата:
типзначенияСтр(Колонки) = ""

Откуда это берется?
Ведь не ошибку же выдает.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Помогите. Как сделать правильно?
Ответ #34 - 18. Апреля 2008 :: 13:26
Печать  
Короче, попробуй прикинуть, не на это ли нарвался: http://www.1cpp.ru/bugs/show_bug.cgi?id=3640
Там еще и ссылка на обсуждение есть.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #35 - 18. Апреля 2008 :: 13:29
Печать  
kms писал(а) 18. Апреля 2008 :: 13:22:
Цитата:
типзначенияСтр(Колонки) = ""

Откуда это берется?
Ведь не ошибку же выдает.

Ага, я про это говорил.
И кстати, такой код работает, только если в модуле класса или внутри метода класса определено Перем Колонки Печаль
ИМХО п.2 - где-то в твоем методе Улыбка
  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #36 - 18. Апреля 2008 :: 13:32
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:29:
kms писал(а) 18. Апреля 2008 :: 13:22:
Цитата:
типзначенияСтр(Колонки) = ""

Откуда это берется?
Ведь не ошибку же выдает.

Ага, я про это говорил.
И кстати, такой код работает, только если в модуле класса или внутри метода класса определено Перем Колонки Печаль
ИМХО п.2 - где-то в твоем методе Улыбка

Неее, это вырезки из табло Отладчика (у нас же теперь есть возможность нормально заходить в отладку классов!  Подмигивание )
В модуле класса таких строк нет. Попробывал добавить - ес-но 1С начала ругаться.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #37 - 18. Апреля 2008 :: 13:34
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 13:11:
Цитата:
типзначенияСтр(Колонки) = ""
типЗначенияСтр(_БазаТП.Колонки) = ""
ТипЗначенияСтр(Сам().Колонки) = ""


Лукавишь, нам не весь код показал Печаль
Покажи код, в котором участвовал приведенный выше код
  

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите. Как сделать правильно?
Ответ #38 - 18. Апреля 2008 :: 13:34
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 13:19:
     Возврат Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТабличноеПоле", идЭлементаНаформе);
КонецФункции// Создать


Так я же писал - создается на форме обычное ТП, не объект твоего класса  Печаль
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #39 - 18. Апреля 2008 :: 13:40
Печать  
а это разве не то же самое, что и вот тут: http://www.1cpp.ru/forum/YaBB.pl?num=1205656253 ?
  
Наверх
www  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #40 - 18. Апреля 2008 :: 13:43
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:34:
JohnyDeath писал(а) 18. Апреля 2008 :: 13:11:
Цитата:
типзначенияСтр(Колонки) = ""
типЗначенияСтр(_БазаТП.Колонки) = ""
ТипЗначенияСтр(Сам().Колонки) = ""


Лукавишь, нам не весь код показал Печаль
Покажи код, в котором участвовал приведенный выше код

Я ж говорю: это вырезки из табло отладчика - в модуле этого нет. Я так понимаю, что все подозревают меня в "укрывательстве". Прикреплю сам класс и тестовую обработку к нему.
Попробуйте, кому не сложно.
  

TP_Q_VT.rar ( 24 KB | Загрузки )
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #41 - 18. Апреля 2008 :: 13:45
Печать  
ИМХО проблема упростилась по максимуму - телепатирование не помогает.
Поэтому все просто - пусть автор составит тест, в котором видно ошибку, мы проверим код и четко сможем разобраться.
Уверен, что тест сделать не проблема Улыбка
  

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: Помогите. Как сделать правильно?
Ответ #42 - 18. Апреля 2008 :: 13:47
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:45:
ИМХО проблема упростилась по максимуму - телепатирование не помогает.
Поэтому все просто - пусть автор составит тест, в котором видно ошибку, мы проверим код и четко сможем разобраться.
Уверен, что тест сделать не проблема Улыбка

Блин, ну как Инет тормозит, ничего не успеваю написать, весь вечер меня опережают Улыбка
  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #43 - 18. Апреля 2008 :: 13:49
Печать  
kiruha писал(а) 18. Апреля 2008 :: 13:34:
JohnyDeath писал(а) 18. Апреля 2008 :: 13:19:
     Возврат Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТабличноеПоле", идЭлементаНаформе);
КонецФункции// Создать


Так я же писал - создается на форме обычное ТП, не объект твоего класса  Печаль

Т.е. ты хочешь сказать, чтобы я в классе "ТПЗапросТЗ" в ф-ии "Создать" писал:
Код
Выбрать все
Возврат Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТПЗапросТЗ", идЭлементаНаформе); 

??


artbear писал(а) 18. Апреля 2008 :: 13:45:
ИМХО проблема упростилась по максимуму - телепатирование не помогает.
Поэтому все просто - пусть автор составит тест, в котором видно ошибку, мы проверим код и четко сможем разобраться.
Уверен, что тест сделать не проблема Улыбка

Уже положил. Только забыл определение класса. Ну, думаю, всем всё понятно:
Цитата:
class ТПЗапросТЗ = #Классы\ТПЗапросТЗ.ert : ТабличноеПоле
{};
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите. Как сделать правильно?
Ответ #44 - 18. Апреля 2008 :: 13:53
Печать  
kiruha писал(а) 18. Апреля 2008 :: 11:38:
Уже напарывался
http://www.1cpp.ru/forum/YaBB.pl?num=1208158731
Код
Выбрать все
Функция Создать(Конт, ЭлементДиалога) Экспорт  

ОбъектФорма=СоздатьОбъект("Форма");
ОбъектФорма.УстановитьФорму(Конт.Форма);
ТаблПоле=ОбъектФорма.СоздатьЭлементУправления("ТабличноеПолеДБФ", ЭлементДиалога);

Возврат ТаблПоле;
КонецФункции   



Вызов из формы
Код
Выбрать все
перем тпТовары,ЛокальнаяФорма,ОбъектТпТовары;

Процедура ФормаПриСоздании()
ОбъектТпТовары=СоздатьОбъект("ТабличноеПолеДБФ");
тпТовары=ОбъектТпТовары.Создать(Контекст,Форма.тпТестДБФ);
КонецПроцедуры    



работаешь с тпТовары а не ОбъектТпТовары
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите. Как сделать правильно?
Ответ #45 - 18. Апреля 2008 :: 13:56
Печать  
В твоих терминах
Код
Выбрать все
Процедура ПослеСозданияФормы()
	ОбъектТпНаФорме=СоздатьОбъект("ТПЗапросТЗ");
	тпНаФорме=ОбъектТпНаФорме.Создать("тпНаФорме", Контекст);
	//НоваяКолонка=тпНаФорме.Колонки.Добавить("НомСтр");
КонецПроцедуры	// ПослеСозданияФормы 

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #46 - 18. Апреля 2008 :: 13:59
Печать  
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)
Код
Выбрать все
// -- Артур --
//Возврат Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТабличноеПоле", идЭлементаНаформе);
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Сам(), идЭлементаНаформе);
_БазаТП = Сам().ПолучитьБазовыйКласс("ТабличноеПоле");
Возврат Сам();
// -- завершение
 


+ самое главное - передача контекста класса вместо имени ТабличноеПоле Улыбка
  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #47 - 18. Апреля 2008 :: 14:00
Печать  
kiruha писал(а) 18. Апреля 2008 :: 13:56:
В твоих терминах
Код
Выбрать все
Процедура ПослеСозданияФормы()
	ОбъектТпНаФорме=СоздатьОбъект("ТПЗапросТЗ");
	тпНаФорме=ОбъектТпНаФорме.Создать("тпНаФорме", Контекст);
	//НоваяКолонка=тпНаФорме.Колонки.Добавить("НомСтр");
КонецПроцедуры	// ПослеСозданияФормы 


Ну а что имеем дальше? Хочу иметь метод "ВыполнитьИОтобразить(ТекстЗапроса)", где выполняется запрос и создаются колонки по ТЗ=результату запроса. Откуда его вызывать? "тпНаФорме" - это "ТабличноеПоле", здесь явно не прокатит. "ОбъектТпНаФорме" - та проблема, о которой я говорю.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #48 - 18. Апреля 2008 :: 14:06
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:59:
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)
Код
Выбрать все
// -- Артур --
//Возврат Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, "ТабличноеПоле", идЭлементаНаформе);
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Контекст, идЭлементаНаформе);
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле");
Возврат Сам();
// -- завершение
 


+ самое главное - передача контекста класса вместо имени ТабличноеПоле Улыбка

Афигет! РАботает!  Очень довольный Спасибо, Артур. Я уж думал, что опять через ж. придётся делать.
Ну согласитесь, весьма неявное решение.
П.С. тока там наверное вместо:
Цитата:
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Контекст, идЭлементаНаформе);

надо писать:
Цитата:
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Сам(), идЭлементаНаформе);

или пофигу?
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #49 - 18. Апреля 2008 :: 14:08
Печать  
JohnyDeath писал(а) 18. Апреля 2008 :: 14:06:
П.С. тока там наверное вместо:
Цитата:
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Контекст, идЭлементаНаформе);

надо писать:
Цитата:
РезЭтоСам = Форма.СоздатьЭлементУправленияНаФорме(_Конт.Форма, Сам(), идЭлементаНаформе);

или пофигу?

пофигу
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #50 - 18. Апреля 2008 :: 14:11
Печать  
Вместо
Возврат Сам();
тоже можно написать
Возврат Контекст;
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #51 - 18. Апреля 2008 :: 14:12
Печать  
Это не неявное, а вполне официальное поведение, придуманное как раз для реализации ООП для ТП.
Иногда читайте доку, там много хорошего понаписано Улыбка

Причем ведь я-то ТП не юзаю, зато внутренности знаю Улыбка

ЗЫ мой провайдер сегодня получит статус нехорошего человека.
  

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: Помогите. Как сделать правильно?
Ответ #52 - 18. Апреля 2008 :: 14:15
Печать  
fez писал(а) 18. Апреля 2008 :: 14:11:
Вместо
Возврат Сам();
тоже можно написать
Возврат Контекст;

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

ЗЫ кстати, в свете правильного решения Создать нужно делать не функцией, а обычной процедурой, ведь ничего полезного метод не вернет Улыбка
  

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



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #53 - 18. Апреля 2008 :: 14:16
Печать  
artbear писал(а) 18. Апреля 2008 :: 14:12:
Это не неявное, а вполне официальное поведение, придуманное как раз для реализации ООП для ТП.
Иногда читайте доку, там много хорошего понаписано

хте?  Смущённый
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #54 - 18. Апреля 2008 :: 14:18
Печать  
artbear писал(а) 18. Апреля 2008 :: 14:15:
fez писал(а) 18. Апреля 2008 :: 14:11:
Вместо
Возврат Сам();
тоже можно написать
Возврат Контекст;

Нельзя Улыбка
Контекст можно передавать только как аргумент функции.

Обоснуй.

Цитата:
Да, пофигу что юзать Сам() или Контекст. ТОлько Сам() можно юзать везде, а Контекст нет.

Контекст нельзя юзать только там, где тебе нужно вызвать методы или обратиться к атрибутам класса. Во всех остальных случаях использовать Контекст - можно.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Помогите. Как сделать правильно?
Ответ #55 - 18. Апреля 2008 :: 14:33
Печать  
artbear писал(а) 18. Апреля 2008 :: 13:59:
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)

А в чем суть? База не до конца еще создана что ли в конструкторе потомка?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #56 - 18. Апреля 2008 :: 14:59
Печать  
kms писал(а) 18. Апреля 2008 :: 14:33:
artbear писал(а) 18. Апреля 2008 :: 13:59:
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)

А в чем суть? База не до конца еще создана что ли в конструкторе потомка?

Ну нифига себе! Даже Миша не знает, а вы мне говорите "читайте доку"  Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Помогите. Как сделать правильно?
Ответ #57 - 18. Апреля 2008 :: 15:18
Печать  
Не, я заинтересовался конкретным утверждением - и решил поискать очередные грабли. Улыбка
На самом деле, граблей там нет, в конструкторе можно брать ссылку на суперкласс - он уже сконструирован.

В остальном - все правильно, насчет контекста класса при создании окна контрола.

У тебя получалось использование неинициализированного ТП - т.к. ты создавал ТП, но оно не связывалось с классом.
Оно возвращалось из метода Создать(), но далее нигде не использовалось, а ссылка на него терялась.

При этом свойства базового ТП существовали, были доступны, но не были инициализированы.
По симптомам - очень похоже на грабли с "виртуальными свойствами".

JohnyDeath писал(а) 18. Апреля 2008 :: 14:59:
Ну нифига себе! Даже Миша не знает, а вы мне говорите "читайте доку"  Улыбка

На пенсию пора Улыбка ... Или по крайней мере - за пивом. Улыбка
« Последняя редакция: 18. Апреля 2008 :: 18:29 - kms »  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #58 - 19. Апреля 2008 :: 07:18
Печать  
fez писал(а) 18. Апреля 2008 :: 14:18:
artbear писал(а) 18. Апреля 2008 :: 14:15:
fez писал(а) 18. Апреля 2008 :: 14:11:
Вместо
Возврат Сам();
тоже можно написать
Возврат Контекст;

Нельзя Улыбка
Контекст можно передавать только как аргумент функции.

Обоснуй.

Цитата:
Да, пофигу что юзать Сам() или Контекст. ТОлько Сам() можно юзать везде, а Контекст нет.

Контекст нельзя юзать только там, где тебе нужно вызвать методы или обратиться к атрибутам класса. Во всех остальных случаях использовать Контекст - можно.

Федор, ты не прав Печаль
Я-то, в отличие от тебя, попробовал Улыбка
Цитата:
==== Класс: ТПЗапросТЗ  Файл: G:\1C\1C++\Баги\TP_Q_VT\ТПЗапросТЗ.ert ====
(84) Возврат<<?>> Контекст;  :Ожидается выражение

ЗЫ твою старую статью про использование Контекста помню Улыбка, но этого момента там нет Улыбка
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите. Как сделать правильно?
Ответ #59 - 19. Апреля 2008 :: 07:23
Печать  
kms писал(а) 18. Апреля 2008 :: 14:33:
artbear писал(а) 18. Апреля 2008 :: 13:59:
Все просто Улыбка
Код
Выбрать все
_БазаТП = Этот(Контекст).ПолучитьБазовыйКласс("ТабличноеПоле"); 


нужно писать не конструкторе, а в Создать(идЭлементаНаформе, КонтФормы)

А в чем суть? База не до конца еще создана что ли в конструкторе потомка?

Да, этот код нужен только в конструкторе Улыбка
Вчера мой Инет не дал мне это сказать Печаль

В продолжение темы как лучше:
ИМХО метод лучше назвать не Создать, а Инит Улыбка для более точного обозначения того, что нужно использовать специальный пост-конструктор.
А еще надежнее запретить создание через СоздатьОбъект, и разрешить только через Фабрика::Новый с помощью спец.конструктора Инит Улыбка
ЗЫ пользователи, они ведь такие - если есть возможность что-то пропустить, обязательно пропустят Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; 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: Помогите. Как сделать правильно?
Ответ #60 - 20. Апреля 2008 :: 11:58
Печать  
artbear писал(а) 19. Апреля 2008 :: 07:18:
Федор, ты не прав Печаль
Я-то, в отличие от тебя, попробовал Улыбка
Цитата:
==== Класс: ТПЗапросТЗ  Файл: G:\1C\1C++\Баги\TP_Q_VT\ТПЗапросТЗ.ert ====
(84) Возврат<<?>> Контекст;  :Ожидается выражение


Прикольно, не знал Улыбка
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать