Переключение на Главную Страницу Страницы: [1] 2 3 ... 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите. Как сделать правильно? (число прочтений - 17026 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 5
ОтправитьПечать